# 实验三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项目。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1121/181605_19c86588_8165504.png "屏幕截图.png") 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}") ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/1121/182341_e4779b19_8165504.png "屏幕截图.png") 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()); } } ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/1121/182620_56e09862_8165504.png "屏幕截图.png") 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、定义前端数据展示页面 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1121/182846_98a4ad52_8165504.png "屏幕截图.png") **实验总结** 本质与java相同