# JavaEE3-Experiment3 **Repository Path**: shallowcmz/JavaEE3-Experiment3 ## Basic Information - **Project Name**: JavaEE3-Experiment3 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

实验三

课程名称:企业级开发框架专题

学期:2020春季

实验名称全球新型冠状病毒实时数据统计应用程序的设计与实现实验序号
姓 名陈铭昭学 号201741404152班 级17软卓1班
实验地点网上实验日期2020/5/11指导老师黎志雄
教师评语***实验成绩 评阅教师
百分制**
同组同学
# 实验目标 1、 掌握使用Spring框架自带的RestTemplate工具类爬取网络数据;
2、 掌握使用Spring框架自带的计划任务功能;
3、 掌握使用Apache Commons CSV组件解释CSV文件;
4、 掌握Java 8的Stream API处理集合类型数据;
5、 了解使用模板引擎或前端框架展示数据。
# 实验内容(及步骤): 1&2、 通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目,并且添加功能模块:spring MVC、lombok、commons-csv等。
![avatar](./image/1.png)
3&4、使用Spring框架自带的RestTemplate工具类爬取数据。
如图,先将数据爬取下来,然后保存到virusDataResource中,等待解析
![avatar](./image/2.png)
5、 定义model类。
定义一个Model类,方便存储解析后的csv数据:
![avatar](./image/4.png)
6、 使用Apache Commons CSV组件解释CSV文件。
先调用Resource类的getInputStream方法得到流,然后转换成字符流并得到缓冲流,加快数据的读取速度, 然后根据withHeader定义的MapKey,将每个record中的数据读出来,并调用Model类的带参构造器,构造一个Model对象,添加到List中, 最终得到一个Model的列表并返回。
![avatar](./image/3.png)
7、 使用Spring框架自带的计划任务功能定时更新统计数据。
给类添加@EnableScheduling注解,并且给afterPropertiesSet方法添加@Scheduled注解,corn = "0 0 1 * * *")可以让方法每日凌晨一点运行一次。
![avatar](./image/5.png)
设置默认线程数:
![avatar](./image/9.png)
8、 要确保应用程序启动时,获取一次统计数据。
这里先让VirusService接口继承了InitializingBean接口
![avatar](./image/6.png)
然后,再让SearchServiceImpl实现了VirusService接口
![avatar](./image/7.png)
运行后,可以看到应用程序启动时,确实获取了一次统计数据。
![avatar](./image/8.png)
9、 单元测试。
SearchServiceImpl的单元测试通过
![avatar](./image/12.png)
VirusServiceImpl的单元测试通过
![avatar](./image/13.png)
PageController的单元测试通过
![avatar](./image/14.png)
10、 定义Cotroller控制器。
![avatar](./image/10.png)
11、 定义前端数据展示页面。
访问localhost:8080/index.html:
![avatar](./image/11.png)
搜索Canada:
![avatar](./image/15.png)
搜索功能的实现: 先调用analysisCSV返回一个List,然后得到他的并行流,如果得到的搜索信息key为空,则返回所有的数据,如果不为空,则通过stream的filter过滤,再返回。
![avatar](./image/16.png)