# 实验三demo
**Repository Path**: chainsawman/three-demo-experiments
## Basic Information
- **Project Name**: 实验三demo
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-11-19
- **Last Updated**: 2021-01-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Springboot实验三
| 实验名称: | 利用Spring boot的自动装配特性实现动态注册组件 | 实验序号: | 三 |
|-------|---------------------|-------|--------------|
| 姓名: | 陈志聪 | 学号: | 201841413203 |
| 班级: | 18网工2班 | 实验地点: | 线上 |
| 实验日期: | 2020/11/10 | 指导老师: | 黎志雄 |
| 成绩: | | 同组同学: | 无 |
**一、 实验目的**
1、 掌握使用Spring框架自带的RestTemplate工具类爬取网络数据;
2、 掌握使用Spring框架自带的计划任务功能;
3、 掌握使用Apache Commons CSV组件解释CSV文件;
4、 掌握Java 8的Stream API处理集合类型数据;
5、 了解使用模板引擎或前端框架展示数据。
**二、实验环境**
1、 JDK 1.8或更高版本
2、 Maven 3.6+
3、 IntelliJ IDEA
**三、实验任务**
1、 通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目。

2、添加功能模块:spring MVC、lombok、commons-csv等。
```java
org.apache.commons
commons-csv
1.8
```
3、 爬取全球冠状病毒实时统计数据。(Java,Spring)
```java
public class getCovid19Data implements InitializingBean {
private static final String CORONA_VIRUS_DATA_URL = "https://gitee.com/voghost/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv";
private final List allRegionStats = new ArrayList<>();
// getCovid19Data() throws IOException {
// fetchCoronaVirusData();
// }
public List getAllRegionStats() {
return allRegionStats;
}
@Scheduled(cron = "${sai.Schedules.updateVirus}")
public void fetchCoronaVirusData() throws IOException {
System.out.println("this is getCovid19Data");
RequestEntity requestEntity = RequestEntity
.get(URI.create(CORONA_VIRUS_DATA_URL))
.headers(httpHeaders -> httpHeaders.add("User-Agent", "Mozilla/5.0"))
.build();
ResponseEntity exchange = new RestTemplate().exchange(requestEntity, Resource.class);
Resource body = exchange.getBody();
assert body != null;
Reader in = new InputStreamReader(body.getInputStream());
Iterable records = CSVFormat.EXCEL.withHeader().parse(in);
```
4、使用Spring框架自带的RestTemplate工具类爬取数据。
```java
RequestEntity requestEntity = RequestEntity
.get(URI.create(CORONA_VIRUS_DATA_URL))
.headers(httpHeaders -> httpHeaders.add("User-Agent", "Mozilla/5.0"))
.build();
ResponseEntity exchange = new RestTemplate().exchange(requestEntity, Resource.class);
Resource body = exchange.getBody();
```
5、 分析csv文件的数据结构,定义model类。
```java
public class RegionStats {
private String state;
private String country;
private int latestTotalCases;//多少例
private int diffFromPrevDay;//新增病例
//省略getter&setter
}
```
6、 使用Apache Commons CSV组件解释CSV文件。
```java
for (CSVRecord record : records) {
RegionStats regionStats = new RegionStats();
regionStats.setState(record.get("Province/State"));
regionStats.setCountry(record.get("Country/Region"));
regionStats.setDiffFromPrevDay(Integer.parseInt(record.get(record.size()-1)));//当前
int sum=0;
sum = Integer.parseInt(record.get(record.size()-1))-Integer.parseInt(record.get(record.size()-2));
regionStats.setLatestTotalCases(sum);//相对于昨日新增
allRegionStats.add(regionStats);
}
```
7、 使用Spring框架自带的计划任务功能定时更新统计数据。
```java
@Scheduled(cron = "${sai.Schedules.updateVirus}")
```

8、要确保应用程序启动时,获取一次统计数据。
9、单元测试
```java
@EnableAutoConfiguration
@SuppressWarnings("JavadocReference")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,classes = {getCovid19Data.class})
class DemoCovid19ApplicationTests {
@Autowired
getCovid19Data GetCovid19Data;
@Test
void testedCovid19Data(){
assertTrue(GetCovid19Data.getAllRegionStats().size()>100);
System.out.println(GetCovid19Data.getAllRegionStats().size());
}
}
```

10、 定义Cotroller控制器。
```java
@Controller
public class HomeController {
private final getCovid19Data GetCovid19Data;
public HomeController(getCovid19Data getCovid19Data) {
GetCovid19Data = getCovid19Data;
}
@GetMapping({"/"})
public String home(Model model,String country){
List allStats;
if(country==null||country.equals("all")) allStats=GetCovid19Data.getAllRegionStats();
// System.out.println("这是home controller");
else
allStats=GetCovid19Data.getAllRegionStats()
.parallelStream()
.filter(localtionStats->localtionStats.getCountry().equals(country))
.collect(Collectors.toUnmodifiableList());
int sum1=allStats.parallelStream().mapToInt(RegionStats::getLatestTotalCases).sum();
int sum2=allStats.parallelStream().mapToInt(RegionStats::getDiffFromPrevDay).sum();
int day1=allStats.parallelStream().mapToInt(RegionStats::getDay1).sum();
int day2=allStats.parallelStream().mapToInt(RegionStats::getDay2).sum();
int day3=allStats.parallelStream().mapToInt(RegionStats::getDay3).sum();
int day4=allStats.parallelStream().mapToInt(RegionStats::getDay4).sum();
int day5=allStats.parallelStream().mapToInt(RegionStats::getDay5).sum();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
model.addAttribute("country",country);
model.addAttribute("showtime",df.format(new Date()));
model.addAttribute("AllLatestTotalCases",sum1);//新增
model.addAttribute("ALlDiffFromPrevDay",sum2);//当前
model.addAttribute("allData",allStats);
return "index";
}
}
```
11、定义前端数据展示页面

**实验总结**
本质与java相同