# springboot_experiment1
**Repository Path**: chentian123/springboot_experiment1
## Basic Information
- **Project Name**: springboot_experiment1
- **Description**: 实验一 使用Spring Boot构建应用程序
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-03-28
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 东莞理工学院网络空间安全学院实验报告
院(系)名称:网络空间安全学院
专业班级: 17软卓2班
学号: 201741404247
姓名: 陈钿
实验题目: 实验1 使用Spring Boot构建应用程序
实验日期:2020.3.27
实验(上机)学时: 2
成绩:
------
# 1.实验目的
1. 掌握使用IntelliJ IDEA创建Spring Boot应用程序的方法;
2. 了解spring-boot-starter-parent的配置内容;
3. 掌握如何利用Starter扩展Spring Boot应用程序的功能;
4. 掌握如何配置Starter;
5. 掌握如何通过属性文件定制Spring Boot应用程序的初始化参数;
6. 掌握使用Spring Boot编写简单的单元测试;
7. 了解Spring Boot应用程序的Fat Jar文件;
8. 掌握Markdown轻量级标记语言编写README.md文件。
------
# 2.实验环境
1. JDK 1.8或更高版本
2. Maven 3.6+
3. IntelliJ IDEA
***
# 3.实验任务
### 1.通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目;
- 使用Spring Initializr创建的Spring Boot项目,截图如下:
***
### 2.添加两个功能模块:spring MVC、lombok;
- 把spring Mvc和lombok的依赖添加到pom.xml文件,代码如下:
```xml
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
```
- 截图如下:
***
### 3.添加阿里云镜像仓库作为项目maven仓库;
- 在pom.xml文件中添加阿里云镜像仓库,让本项目导入依赖时优先从pom文件配好的仓库下载,代码如下:
```xml
central
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
default
true
false
```
- 代码截图如下:
***
### 4.解释项目pom.xml文件中主要标签的意义;
- parent: 所继承的父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。
- artifactId: 项目的构件标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个 特定的group ID下,artifact ID也必须是唯一的。
- groupId: 项目的全球唯一标识符,插件在仓库里的group ID。
- version: 项目版本号,被使用的插件的版本(或版本范围)。
- relativePath: 父项目的pom.xml文件的相对路径,默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。
- modelVersion:声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。
- properties: 自定义属性,一般用于依赖或配置统一版本的管理。
- build: 构建项目所需要的信息。
- plugins: 使用的插件列表。
- repositories: 发现依赖和扩展的远程仓库列表。
- exclusions: 当传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖,此元素主要用于解决版本冲突问题。
- scope:依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。
***
### 5.配置jetty或undertow作为Spring Boot应用程序的默认Servlet容器;
-在pom.xml文件中直接引入spring-boot-starter-jetty依赖后run,还是优先使用了spring-boot-starter-web默认带的Tomcat,需要先用把spring-boot-starter-web中的tomcat排除,才能实现将默认Servlet容器tomcat替换成jetty。
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-jetty
```
- 代码截图如下:
- 运行后查看打印台可看出已经将Servlet容器换为jetty,截图如下:
***
### 6.添加一个简单的Spring Mvc控制器组件,用于测试
- 创建Controller文件(HelloController.java),代码如下:
```java
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("springboot,实验1。");
return "springboot,实验1。";
}
}
```
- 启动springboot,并访问localhost:8080/hello 测试Spring Mvc控制器组件,运行结果如图:
### 7.定义一个CommandLineRunner的Bean,用于检查Spring Boot应用程序启动完成后在Spring IoC容器中注册的所有Bean。实验中,我们自定义一个CommandLineRunner,检查由您的应用程序创建或由Spring Boot自动添加的所有bean,并对它们进行排序并打印出来。
- 在SpringBoot的主程序类中定义一个CommandLineRunner的Bean,在@SpringBootApplication中已经有@Configuration注解,因此直接在主程序类中使用@Bean注解。
```java
@Slf4j
@SpringBootApplication
public class SpringbootExperiment1Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootExperiment1Application.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext context) {
return args -> {
log.info("\n SpringBoot注册的所有bean如下:");
final String[] beanDefinitionNames = context.getBeanDefinitionNames();
Arrays.stream(beanDefinitionNames)
.sorted()
.forEach(System.out::println);
};
}
}
```
- 启动后的控制台运行结果如下图:
***
### 8.编写一个简单的单元测试。
使用MockMvc模拟对象来进行一个接口的单元测试:
-perform:执行一个RequestBuilder请求,会自动执行SpringMvc的流程并映射到相应的控制器执行处理
-get:声明发送一个get请求方法。MockHttpServletRequestBuilder get(Sring urlTemple, Object… urlVariables):根据url模板和url变量值得到一个GET请求方式的。另外提供了其他的请求方法,如:POST、PUT、DELETE等
- accept:接收响应内容的序列化的格式,"MediaType.APPLICATION_JSON_UTF8_VALUE"表示接收JSON数据格式(由于一开始接收的数据出现中文乱码,最后将"MediaType.APPLICATION_JSON"改成"MediaType.APPLICATION_JSON_UTF8_VALUE"得以解决。)
-andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断)
-andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断)
-andReturn:最后返回相应的MvcResult:然后进行自定义验证/进行下一步异常处理(对返回的数据进行的判断)
代码如下:
```java
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello()throws Exception{
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(status().isOk())
.andExpect((ResultMatcher) content().string(equalTo("你好,springboot!")));
}
}
```
运行结果如下:
- 当接收到的"/hello"返回的数据与断言期望的值不一致时,则测试失败,如返回的字符串为"你好,springboot",预期的结果为"你好,springboot!"则就报错。
- 当接收到的"/hello"返回的数据与断言期望的值,则测试成功。
***
### 9.使用IntelliJ IDEA的HTTP Client工具测试控制器端口
- 使用HTTP Client的Rest Client控制台测试端口,运行结果如图:
- 使用.http脚本文件测试控制器端口,脚本如下:
```
GET http://localhost:8080/hello
```
- 在控制台查看运行结果如下:
***
### 10.在命令行中使用spring-boot插件运行Spring Boot应用程序,并把嵌入式Servlet容器的默认端口8080改为9090;
- 使用spring-boot插件运行Spring Boot应用程序,即在终端中命令行输入命令 mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=9090 ,其中"-Dspring-boot.run.arguments=--server.port=9090"则是把嵌入式Servlet容器的默认端口8080改为9090。
- 运行结果如下图:
***
### 11.在属性文件中配置Spring Boot应用程序以debug模式运行。
- 在配置文件 application.yml 中加入 "debug: true" 开启Spring Boot应用程序以debug模式运行。
- 运行结果如下图:
***
### 12.在命令行中编译、打包Spring Boot应用程序。
- 在终端中输入命令行 mvn clean package 实现编译、打包Spring Boot应用程序
- 运行结果如下图:
***
### 13.在命令行中使用java命令运行Spring Boot应用程序的Jar文件。
- 在终端中命令行输入指令 java -jar springboot_experiment1-0.0.1-SNAPSHOT.jar 即可运行Spring Boot应用程序的Jar文件
- 运行结果如下图:
***
### 14.在命令行中使用java命令运行Spring Boot应用程序的Jar文件,带参数改变嵌入式Servlet容器的默认端口8080改为9090。
- 在终端中输入 java -jar springboot_experiment1-0.0.1-SNAPSHOT.jar --server.port=9090 命令运行Spring Boot应用程序的Jar文件,参数"--server.port=9090" 把嵌入式Servlet容器的默认端口8080改为9090
- 运行结果如下图:
***
### 15.使用markdown标记语方编写实验报告,并生成README.md文件放在项目仓库的根目录。