# 实验三:全球新型冠状病毒实时数据统计应用程序的设计与实现 **Repository Path**: Kim_zhihua/springboot-experiment3 ## Basic Information - **Project Name**: 实验三:全球新型冠状病毒实时数据统计应用程序的设计与实现 - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-11-16 - **Last Updated**: 2021-04-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实验三:全球新型冠状病毒实时数据统计应用程序的设计与实现 ## 一、实验目的 #### 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 #### 4、commons-csv 1.8+ ## 三、实验任务 #### 1、通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目。 #### 2、添加功能模块:spring MVC、lombok、commons-csv等。     推荐使用commons-csv组件处理csv文件:
    [Apache Commons CSV 官方用户指南:](https://commons.apache.org/proper/commons-csv/user-guide.html)

**答:**
#### 3、爬取全球冠状病毒实时统计数据。(Java,Spring)     在Github上,有一个由约翰·霍普金斯大学系统科学与工程中心(JHU CSSE)运营的2020年新型冠状病毒可视化仪表板的数据仓库,大家可以从该仓库中爬取全球新型冠状病毒最新的统计数据。     [Github仓库地址](https://github.com/CSSEGISandData/COVID-19)     该仓库会把全球新型冠状病毒最新的统计数据汇总到一个csv文件上,大家在爬取数据时,获取这个csv文件即可.     [Github仓库的csv文件地址](https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)     由于国内网络访问限制的原因,我们不能正常访问Github。老师已经克隆整个仓库,并上传到Gitee,方便大家进行实验.     [克隆的Gitee仓库地址](https://gitee.com/dgut-sai/COVID-19)     [克隆的Gitee仓库的csv文件地址](https://gitee.com/dgut-sai/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv) #### 4、使用Spring框架自带的RestTemplate工具类爬取数据。     RestTemplate采用同步方式执行 HTTP 请求的类,底层使用 JDK 原生 HttpURLConnection API ,或者 HttpComponents等其他 HTTP 客户端请求类库。     RestTemplate 工具类提供模板化的方法让开发者能更简单地发送 HTTP 请求。     RestTemplate 就是 Spring框架 封装的处理同步 HTTP 请求的工具类。     [RestTemplate 官方使用指南](https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-client-access)
    另外,大家可以用 [WebClient](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#webmvc-webclient)。     在本实验中,我们可以使用 RestTemplate 工具类获取上述的csv文件。     如果直接使用HTTP客户端请求Gitee上的文件,会报403的错误,但使用浏览器访问是正常的。经过分析,我们使用HTTP客户端请求Gitee上的文件时,需要设置一个请求头部User-Agent,否则会报403异常。
    当我们使用 RestTemplate 工具类时,可以如下图所示设置请求头部并请求数据:
    如上图所示,我们先实例化一个RequestEntity对象,再通过RestTemplate的exchange方法获取csv文件,这个文件的数据会封装到一个Resource对象中。我们可以通过Resource对象的getInputStream方法获取csv文件的输入流。

**答:**
#### 5、分析csv文件的数据结构,定义model类。     如下图所示,这是一个model类的样例:


**答:**
#### 6、使用Apache Commons CSV组件解释CSV文件。     [CSV文件WIKI](https://docs.qq.com/scenario/link.html?url=https%3A%2F%2Fzh.wikipedia.org%2Fwiki%2F%25E9%2580%2597%25E5%258F%25B7%25E5%2588%2586%25E9%259A%2594%25E5%2580%25BC&pid=300000000$RQeslpiqqOPH&cid=5856113)     CSV文件是由任意数目的记录组成的,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。CSV文件是以纯文本形式存储表格数据(数字和文本)。     为了方便应用程序处理,我们通常会把csv文件的每条记录转换为一个modle类的对象,即上一步中我们定义的model类。     把所有的model类的对象组织为一个集合,如:List 。最终,这个csv文件会转换为一个List对象。然后我们可以根据实际的业务逻辑,访问这个List即可。     我们可以定义一个Service组件处理csv文件的转换逻辑,并把最终转换后的List对象赋值给这个Service组件的成员属性,以便应用程序访问这个List对象。     使用Apache Commons CSV组件,我们可以很方便地解释CSV文件,详细使用方法可以浏览[官方的用户指南](https://commons.apache.org/proper/commons-csv/user-guide.html)。     **提示:**       record.get("Province/State") 可以获取记录某个字段名的值;       record.get("11/8/20") 可以获取某个地区的指定时间的病毒数值。       record.get(record.size() - 1) 可以获取记录最后一个字段的值。 **答:**
#### 7、使用Spring框架自带的计划任务功能定时更新统计数据。     [Scheduling Tasks计划任务官方使用指南](https://spring.io/guides/gs/scheduling-tasks/)     要实现计划任务,首先通过在配置类上添加 @EnableScheduling 注解来开启对计划任务的支持,然后在要执行计划任务的方法上注解 @Scheduled,声明这是一个计划任务。     其中 @Scheduled 注解中有以下几个参数:     1、cron:cron表示式,指定任务在特定时间执行;     2、fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型这long,单位ms;     3、fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;     4、fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;     5、fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;     6、initialDelay:表示延迟多久后再第一次執行任務,参数类型为long,單位ms;     7、initialDelayString:与initialDelay的含义一样,只是参数类型变为String;     8、zone:时区,默认为当前时区,一般不需要设置。     如下图所示,例子中配置了每天凌晨1点执行定时任务,更新统计数据:
    另外,可以在cron参数中使用${...}占位符,读取属性文件中的自定义属性配置cron参数,如下图所示:
    在属性文件中自定义属性配置cron表达式,如下图所示:
    *当cron="-"时,表示关闭计划任务。*     **注意:**在Spring Boot应用程序中,Spring框架自带的计划任务默认是在单线程中执行的,这是因为Spring Boot在初始化计划任务线程池的时候,默认的线程池大小是 1 ,也就是说只有一个线程来执行所有计划任务,那么当有一个计划任务要耗费很长时间执行时,其它的计划任务即使到了执行时间点也只能继续等待。     我们可以通过属性文件设置计划任务线程池的大小,实现并行执行计划任务,如下图所示:
    推荐大家阅读关于计划任务功能的Spring Boot自动配置类,如下图所示:


**答:**
#### 8、要确保应用程序启动时,获取一次统计数据。     提示:       1、InitializingBean;       2、@PostConstruct;       3、CommandLineRunner。 **答:**
#### 9、单元测试。     **必须编写单元测试。**     *所有控制器 与 Service 组件,必须写单元测试用例进行测试。*     如下图所示,例子中演示了如何对一个Service组件进行单元测试。
    提示:掌握如何配置@SpringBootTest注解的属性,从而构造一个精简的单元测试环境。

**答:**
#### 10、定义Cotroller控制器。     我们需要定义一个控制器,用于返回数据给前端展示。     **控制器必须支持查询功能。如:可以选择查询某个地区或国家的新型冠状病毒实时统计数据**     **提示:**     1、 使用Java 8的Stream API可以很方便地访问集合类型对象,如:List ;     2、 parallelStream支持并行流,可以大大提升访问性能;     3、 filter方法支持设置过滤条件;     4、 Collectors.toUnmodifiableList()收集为不可变的List集合。

**答:**
#### 11、定义前端数据展示页面。     可以使用 任何视图引擎 或 任何前端框架 构建前端数据展示。     要求:界面美观、整洁,支持查询功能。如果页面包含图表展示功能,加15分。

**答:**
         全球疫情:          选定国家:
## 四、实验要求 #### 1、实验项目push到自己个人的码云的公开/私有仓库,并把仓库网址登记在在线文档 #### 2、从码云仓库下载项目的ZIP文件,并交由班长汇总 #### 3、撰写实验报告,完成各个实验任务。各实验任务中的附图,是老师的演示代码,同学们应该模仿演示代码改为自己的代码。实验报告中必须完整描述各实验任务实现过程并附截图 #### 4、[网络空间安全学院实验报告模板(2019试行)](https://css.dgut.edu.cn/article?262=) #### 5、[实验三项目仓库登记表](https://docs.qq.com/sheet/DUkZyQUhJRnRkd09R?tab=BB08J2) #### 6、严禁抄袭。如果不想项目仓库给别人看到,可以设置为私有仓库,并把老师的码云账号(dgsai@vip.qq.com)加入到仓库开发者以便老师检查