文章目录有道无术,术尚可求,有术无道,止于术。
本系列Spring Boot版本2.7.0
- 前言
- Spring MVC
- 自动配置
- Http消息转换器
- MessageCodesResolver
- 静态资源
- 欢迎页面
- 自定义网站图标
- 路径匹配和内容协商
- 模板引擎
- 错误处理
- CORS 跨域处理
- Jersey
- 嵌入式 Servlet 容器支持
Spring Boot 非常适合 Web 应用程序开发,可以使用嵌入式 Tomcat、Jetty、Undertow 或 Netty 创建 HTTP 服务器。
大部分都使用spring-boot-starter-web开发 Servlet 类型的 Web 应用程序,默认使用Spring MVC 作为Web 层框架,之前写过Spring MVC系列可以参考。
Spring Boot 还提供了spring-boot-starter-webflux 模块构建Reactive Web 应用程序(后续会介绍)。
Spring MVC构建基于 Servlet 的 Web 应用程序,可以使用Spring Boot 自动配置提供的 Spring MVC 或 Jersey 。
Spring MVC 框架是一个应用广泛并成熟的Web 框架,使用@Controller或@RestController 来处理传入的 HTTP 请求,控制器中的方法通过使用@RequestMapping注解映射到 HTTP 请求路径。
以下显示了@RestController提供 JSON 数据的代码:
@RestController @RequestMapping("/users") public class MyRestController { private final UserRepository userRepository; @GetMapping("/{userId}") public User getUser(@PathVariable Long userId) { return this.userRepository.findById(userId).get(); } }自动配置
Spring Boot 为 Spring MVC 提供了自动配置,适用于大多数应用程序。
自动配置在 Spring 的默认值之上添加了以下特性:
-
注册ContentNegotiatingViewResolver、BeanNameViewResolver Bean对象。
-
支持提供静态资源,包括对 WebJars 的支持。
-
自动注册Converter、GenericConverter和Formatter。
-
支持HttpMessageConverters。
-
自动注册MessageCodesResolver。
-
静态index.html支持。
-
ConfigurableWebBindingInitializerbean的自动使用。
Spring MVC 使用HttpMessageConverter接口来转换 HTTP 请求和响应,默认设置是开箱即用的。例如,对象可以自动转换为 JSON(使用 Jackson )。
添加或自定义转换器,可以使用 Spring Boot 的HttpMessageConverters类,如下所示:
@Configuration(proxyBeanMethods = false) public class MyHttpMessageConvertersConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter> additional = new AdditionalHttpMessageConverter(); HttpMessageConverter> another = new AnotherHttpMessageConverter(); return new HttpMessageConverters(additional, another); } }
上下文中存在的任何HttpMessageConverter Bean 对象都将添加到转换器列表中,也可以使用相同的方式覆盖默认转换器。
具体参考Spring MVC系列(8)-HttpMessageConverter之使用
MessageCodesResolver在Spring MVC 数据校验validation 中,如果校验失败会抛出异常,Spring Boot 会提供了一个生成错误代码的MessageCodesResolver策略,需要配置以下属性:
spring: mvc: # postfix_error_code、prefix_error_code message-codes-resolver-format: prefix_error_code静态资源
默认情况下,Spring Boot 从类路径中名为/static、/public、/resources、/META-INF/resources目录下获取静态资源,比如页面、JS 等,可以通过添加WebMvcConfigurer配置类,并重写其addResourceHandlers方法来修改默认行为。
比如我们在resources下创建一个静态页面:
直接通过http://localhost:9056/index.html,就可以获取到静态资源页面:
默认情况下,资源映射在/** 上,可以配置spring.mvc.static-path-pattern对其进行调整,例如将所有资源重新定位到/resources/**:
spring: mvc: static-path-pattern: /resources/**
通过http://localhost:9056/resources/index.html访问:
还可以使用spring.web.resources.static-locations属性自定义静态资源位置,还有webjars、JS等,这些实际开发中很少使用了,因为都是前后端分离,其他专栏文章有专门介绍。
欢迎页面Spring Boot 支持静态和模板化的index.html欢迎页面。它首先在配置的静态内容位置中查找文件。如果没有找到,它会寻找一个index模板。如果找到其中任何一个,它会自动用作应用程序的欢迎页面。
也就是直接访问/,会调转到你在静态资源中定义的一个index.html页面:
favicon.ico是指显示在浏览器收藏夹、地址栏和标签标题前面的个性化图标, 以图标的方式区别不同的网站。
比如百度:
与其他静态资源一样,Spring Boot 在配置的静态内容位置中检查 favicon.ico。如果存在这样的文件,它会自动显示出来。
比如将B 站的图标搞过来放在静态目录下:
访问后台接口,就自动出来了:
实际操作时,注意此文件是否编译到了target 目录,并注意页面缓存问题,不然很容易出不来~~
Spring MVC 可以将请求路径并与应用程序中定义的映射匹配,比如@GetMapping控制器方法上将传入的请求映射到对应的处理程序。
从 Spring Framework 5.3 开始,Spring MVC 支持多种策略用于将请求路径匹配到Controller处理程序。它以前只支持该AntPathMatcher策略,现在也提供PathPatternParser,Spring Boot提供了一个配置属性配置新策略:
spring: mvc: pathmatch: matching-strategy: PATH_PATTERN_PARSER
PathPatternParser是一种优化实现,但限制了某些路径模式变体的使用, 与后缀模式匹配、 DispatcherServlet 使用 servlet 前缀 ( spring.mvc.servlet.path) 映射不兼容。
从Spring Boot 2.6 开始,路径解析默认使用PathPatternParser,取代了之前的Ant风格匹配AntPathMatcher。升级时Swagger会出现问题。基本是兼容的,性能也有提升。
后缀模式匹配是指 /projects/spring-boot.json可以映射到/projects/spring-boot并返回JSON 格式数据,Spring Boot 默认禁用,基本也用不到。已弃用,并将在未来版本中删除。
Spring MVC提供了一个内容协商机制,简单说就是一个访问接口可以返回不同类型的数据,下面举例说明。
首先开启内容协商支持:
spring: mvc: contentnegotiation: favor-parameter: true
添加JackSon 对XML 的支持:
com.fasterxml.jackson.dataformat jackson-dataformat-xml
添加一个测试接口:
@RestController @RequestMapping public class AAA { @GetMapping("/TEST") public User getUser() { User user =new User(); user.setName("zhangsan"); return user; } }
最后使用?format=json传递URL 参数,告诉服务端需要返回什么格式。可以看到如下结果:
除了 REST Web 服务,还可以使用 Spring MVC 来提供动态 HTML 内容。Spring MVC 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 JSP(已淘汰不推荐使用)。此外,许多其他模板引擎自身也支持Spring MVC集成。
Spring Boot 包括对以下模板引擎提供自动配置支持:
- FreeMarker
- Groovy
- Thymeleaf
- Mustache
Thymeleaf系列文档
错误处理对于异常和错误Spring Boot 都提供了默认机制,参考:
Spring MVC系列(12)-异常处理流程源码分析
Spring MVC系列(13)-实际开发中异常处理方案
Spring Boot默认也提供了跨域的处理方案,参考:
跨域的原理及解决方案
JerseyJAX-RS是JAVA EE6 引入的一个新技术。 即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照(REST)架构风格创建Web服务。
而Jersey 是一个提供JAX-RS实现 的 REST Web 框架, 提供了自己的 API,这些 API 扩展了JAX-RS工具箱,并具有其他功能和实用程序,以进一步简化 RESTful 服务和客户端开发。
Spring Boot也提供了spring-boot-starter-jersey 自动配置Jersey ,Jersey 目前已捐献给Eclipse `,使用的人很少,可以自己参考下面的地址去了解:
Jersey 原GitHub地址
Eclipse GitHub地址
代码风格如下:
@Component @Path("/hello") public class MyEndpoint { @GET public String message() { return "Hello"; } }嵌入式 Servlet 容器支持
对于 servlet 应用程序,Spring Boot 提供了嵌入式 Tomcat、Jetty和Undertow服务器的支持。spring-boot-starter-web默认使用的是 Tomcat。
要想使用使用Jetty,如下配置即可:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-jetty
默认情况下,嵌入式服务器使用 8080 端口侦听 HTTP 请求。
Java Web 包含三大组件:Servlet、Filter、Listener。
使用嵌入式 Servlet 容器时,可以通过使用 Spring Bean 扫描来注册组件。
一般一个应用上下文中只有一个Servlet组件,处理所有/ 请求,比如Spring Boot 就帮我们自动配置了Spring MVC的中央处理器DispatcherServlet:
关于DispatcherServlet参考作者以前写的Spring MVC系列(7)-DispatcherServlet处理请求流程源码分析
如何在Spring Boot 中使用监听器和过滤器,嵌入式服务器,以及配置Tomcat、Jetty 和 Undertow 会有单独文章介绍,这里就不赘述了。