# 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文件放在项目仓库的根目录。