Springboot基础知识(08)- spring-boot-starter-web(Web启动器)
1. spring-boot-starter-web 简介
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,其本身就是 Spring 框架的一部分,可以与 Spring 无缝集成,性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架之一。
Spring Boot 是在 Spring 的基础上创建一款开源框架,它提供了 spring-boot-starter-web(Web 启动器) 来为 Web 开发予以支持。spring-boot-starter-web 为我们提供了嵌入的 Servlet 容器以及 SpringMVC 的依赖,并为 Spring MVC 提供了大量自动配置,可以适用于大多数 Web 开发场景。
Spring Boot 为 Spring MVC 提供了自动配置,并在 Spring MVC 默认功能的基础上添加了以下特性:
(1) 引入了 ContentNegotiatingViewResolver 和 BeanNameViewResolver(视图解析器)
(2) 对包括 WebJars 在内的静态资源的支持
(3) 自动注册 Converter、GenericConverter 和 Formatter (转换器和格式化器)
(4) 对 HttpMessageConverters 的支持(Spring MVC 中用于转换 HTTP 请求和响应的消息转换器)
(5) 自动注册 MessageCodesResolver(用于定义错误代码生成规则)
(6) 支持对静态首页(index.html)的访问
(7) 自动使用 ConfigurableWebBindingInitializer
只要我们在 Spring Boot 项目中的 pom.xml 中引入了 spring-boot-starter-web,即使不进行任何配置,也可以直接使用 Spring MVC 进行 Web 开发。
2. 创建 Maven Quickstart 项目
1) 系统环境
Spring Boot 版本及其环境配置要求如下表。
Spring Boot 2.x
JDK 8.0 及以上版本
Maven 3.x
IntelliJ IDEA 14.0 以上
本文将在 Windows 下使用 IntelliJ IDEA 和 Apache Maven 创建一个简单的 Maven Quickstart 程序。在开始之前,确保已经正确搭建了 Spring 开发环境,参考 “ Spring基础知识(1)- Spring简介、Spring体系结构和开发环境配置 ”。
Windows版本 : Windows 10 Home (20H2)
IntelliJ IDEA:Community Edition for Windows 2020.1.4
Apache Maven:3.8.1
2) 运行 IDEA 创建项目
点击菜单 New 创建 Project:
New Project -> Project Type: Maven -> Project SDK: 1.8 -> Check "Create from archtype" -> select "org.apache.maven.archtypes:maven-archtype-quickstart" -> Next
Name: SpringbootWeb
GroupId: com.example
ArtifactId: SpringbootWeb
-> Finish
3) 生成的项目目录结构和文件
(1) 目录结构
|-- src
| |-- main
| | |-- java
| | |-- com
| | |-- example
| | |-- App.java
| |-- test
| |-- java
| |-- com
| |-- example
| |-- AppTest.java
|-- pom.xml
(2) App.java 代码
1 package com.example; 2 3 public class App { 4 public static void main( String[] args ) { 5 System.out.println( "Hello World!" ); 6 } 7 }
(3) AppTest.java 代码
1 package com.example; 2 3 import static org.junit.Assert.assertTrue; 4 5 import org.junit.Test; 6 7 public class AppTest { 8 9 @Test 10 public void shouldAnswerWithTrue() { 11 assertTrue( true ); 12 } 13 }
(4) pom.xml 代码
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 6 <modelVersion>4.0.0</modelVersion> 7 8 <groupId>com.example</groupId> 9 <artifactId>SpringbootWeb</artifactId> 10 <version>1.0-SNAPSHOT</version> 11 12 <name>SpringbootWeb Maven Webapp</name> 13 <!-- FIXME change it to the project's website --> 14 <url>http://www.example.com</url> 15 16 <properties> 17 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 18 <maven.compiler.source>1.7</maven.compiler.source> 19 <maven.compiler.target>1.7</maven.compiler.target> 20 </properties> 21 22 <dependencies> 23 <dependency> 24 <groupId>junit</groupId> 25 <artifactId>junit</artifactId> 26 <version>4.11</version> 27 <scope>test</scope> 28 </dependency> 29 </dependencies> 30 31 ... 32 33 </project>
3. 配置 Spring Boot Web
1) 导入相关依赖包,并修改配置
访问 http://www.mvnrepository.com/,查询 spring-boot-starter-parent 等
修改 pom.xml:
1 <project ... > 2 3 <!-- 把 Maven 默认的 JDK 版本从 1.7 改成 1.8 --> 4 <properties> 5 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 6 <maven.compiler.source>1.8</maven.compiler.source> 7 <maven.compiler.target>1.8</maven.compiler.target> 8 </properties> 9 10 ... 11 12 <parent> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-parent</artifactId> 15 <version>2.6.6</version> 16 <relativePath/> <!-- lookup parent from repository --> 17 </parent> 18 19 <dependencies> 20 21 ... 22 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter-web</artifactId> 26 </dependency> 27 <dependency> 28 <groupId>org.springframework.boot</groupId> 29 <artifactId>spring-boot-starter-tomcat</artifactId> 30 <scope>provided</scope> 31 </dependency> 32 <dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter-test</artifactId> 35 <scope>test</scope> 36 </dependency> 37 38 ... 39 40 </dependencies> 41 42 ... 43 44 </project>
在IDE中项目列表 -> SpringbootWeb -> 点击鼠标右键 -> Maven -> Reload Project
本文选择了 spring-boot-starter-parent 2.6.6 相关依赖包,spring-boot-starter 和 spring-boot-starter-test 的版本由 spring-boot-starter-parent 控制。
使用 spring-boot-starter-tomcat 将 tomcat 内嵌到 web项目中,打包成 jar 后可以直接用 Java 命令行运行,不需要再部署到额外的 tomcat 服务器上。
也可以使用 Jetty 代替 Tomcat,两者不能同时内嵌,使用 Jetty 可用如下配置代码代替 Tomcat 的配置代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
2) 修改 src/main/java/com/example/App.java 文件
1 package com.example; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 6 @SpringBootApplication 7 public class App { 8 public static void main(String[] args) { 9 SpringApplication.run(App.class, args); 10 System.out.println("Spring boot web project"); 11 } 12 }
3) 创建 src/main/java/com/example/ServletInitializer.java 文件
1 package com.example; 2 3 import org.springframework.boot.builder.SpringApplicationBuilder; 4 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 6 public class ServletInitializer extends SpringBootServletInitializer { 7 8 @Override 9 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 return application.sources(App.class); 11 } 12 13 }
4) 创建 src/main/java/com/example/controller/IndexController.java 文件
1 package com.example.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.ResponseBody; 6 7 @Controller 8 public class IndexController { 9 @ResponseBody 10 @RequestMapping("/hello") 11 public String hello() { 12 return "Hello page"; 13 } 14 }
注: src/main/java/com/example/controller 目录不存在,手动创建各级目录,下同。
5) 创建 src/main/resources/application.properties 文件
1 spring.main.banner-mode=off 2 3 # Web server 4 server.display-name=SpringBootWeb-Test 5 server.address=localhost 6 server.port=9090 7 8 # Logging 9 logging.level.com.example=trace 10 logging.file.path=logs 11 logging.pattern.console=%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level - %msg%n | %logger{50} 12
6) 运行
(1) Run App.main()
Open App.java, click mouse right button, select Run "App.main()"
(2) Edit Configurations
Click "+" add new configuration -> Select "Maven"
Command line: clean spring-boot:run
Name: SpringbootWeb [clean,spring-boot:run]
-> Apply / OK
Click Run "SpringbootWeb [clean,spring-boot:run]"
...
Spring boot web project
访问 http://localhost:9090/hello
Hello page
注:打包可以将 Command line 改成 clean package spring-boot:repackage
4. 使用 spring-boot-maven-plugin 插件打包
1) jar 打包
(1) 修改 pom.xml
1 <build> 2 ... 3 4 <!-- 指定 jar 文件名 --> 5 <finalName>SpringbootWeb</finalName> 6 7 <!-- spring-boot-maven-plugin 插件代码 --> 8 <plugins> 9 <plugin> 10 <groupId>org.springframework.boot</groupId> 11 <artifactId>spring-boot-maven-plugin</artifactId> 12 <configuration> 13 <mainClass>com.example.App</mainClass> 14 </configuration> 15 <executions> 16 <execution> 17 <goals> 18 <goal>repackage</goal> 19 </goals> 20 </execution> 21 </executions> 22 </plugin> 23 </plugins> 24 ... 25 </build>
finalName 属性用来指定包文件的名称;
在IDE中项目列表 -> 点击鼠标右键 -> Maven -> Reload Project
(2) 打包
菜单 View -> Tool Windows -> Maven -> SpringbootWeb -> Lifecycle -> Clean & Package
jar 包生成在目录 target/ 里
SpringbootWeb.jar
SpringbootWeb.jar.original
注:SpringbootWeb.jar 包含依赖包,可以直接运行。SpringbootWeb.jar.original 里不包含依赖的包(要手动配置依赖环境),运行前要把文件名上的 “.original” 去掉。
(3) 运行
点击 IDEA 底部 Terminal 标签页,执行如下命令。
java -jar target/SpringbootWeb.jar
...
Spring boot web project
访问 http://localhost:9090/hello,页面显示:
Hello page
2) war 打包
(1) 修改 pom.xml
1 <!-- war 类型设置 --> 2 <packaging>war</packaging> 3 4 <!-- 注释掉这个依赖 5 <dependency> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-tomcat</artifactId> 8 <scope>provided</scope> 9 </dependency> 10 --> 11 12 <build> 13 ... 14 <!-- 指定 war 文件名 --> 15 <finalName>SpringbootWeb</finalName> 16 17 <!-- spring-boot-maven-plugin 插件代码 --> 18 <plugins> 19 <plugin> 20 <groupId>org.springframework.boot</groupId> 21 <artifactId>spring-boot-maven-plugin</artifactId> 22 <configuration> 23 <mainClass>com.example.App</mainClass> 24 </configuration> 25 <executions> 26 <execution> 27 <goals> 28 <goal>repackage</goal> 29 </goals> 30 </execution> 31 </executions> 32 </plugin> 33 </plugins> 34 ... 35 </build>
在IDE中项目列表 -> 点击鼠标右键 -> Maven -> Reload Project
(2) 打包
菜单 View -> Tool Windows -> Maven -> SpringbootWeb -> Lifecycle -> Clean & Package
war 包生成在目录 target/ 里
SpringbootWeb.war
SpringbootWeb.war.original
(3) 运行
把 SpringbootWeb.war 复制到独立运行的 Tomcat 下 webapp 目录,默认设置的 Tomcat 运行在 8080 端口。
Tomcat 会自动解压 SpringbootWeb.war,在 webapp 下产生 SpringbootWeb 目录,目录产生了就可以访问 http://localhost:8080/SpringbootWeb/hello ,页面显示:
Hello page
--------------------------------------
示例代码:https://gitee.com/slksm/public-codes/tree/master/demos/SpringbootWeb