• Spring Boot 2.x系列【25】网络篇之Servlet Web 应用程序


    有道无术,术尚可求,有术无道,止于术。

    本系列Spring Boot版本2.7.0

    前言

    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();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    自动配置

    Spring BootSpring MVC 提供了自动配置,适用于大多数应用程序。

    自动配置在 Spring 的默认值之上添加了以下特性:

    • 注册ContentNegotiatingViewResolverBeanNameViewResolver Bean对象。

    • 支持提供静态资源,包括对 WebJars 的支持。

    • 自动注册ConverterGenericConverterFormatter

    • 支持HttpMessageConverters

    • 自动注册MessageCodesResolver

    • 静态index.html支持。

    • ConfigurableWebBindingInitializerbean的自动使用。

    Http消息转换器

    Spring MVC 使用HttpMessageConverter接口来转换 HTTP 请求和响应,默认设置是开箱即用的。例如,对象可以自动转换为 JSON(使用 Jackson )。

    添加或自定义转换器,可以使用 Spring BootHttpMessageConverters类,如下所示:

    @Configuration(proxyBeanMethods = false)
    public class MyHttpMessageConvertersConfiguration {
    
        @Bean
        public HttpMessageConverters customConverters() {
            HttpMessageConverter<?> additional = new AdditionalHttpMessageConverter();
            HttpMessageConverter<?> another = new AnotherHttpMessageConverter();
            return new HttpMessageConverters(additional, another);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上下文中存在的任何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
    
    • 1
    • 2
    • 3
    • 4

    静态资源

    默认情况下,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/**
    
    • 1
    • 2
    • 3

    通过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策略,现在也提供PathPatternParserSpring Boot提供了一个配置属性配置新策略:

    spring:
      mvc:
        pathmatch:
          matching-strategy: PATH_PATTERN_PARSER
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4

    添加JackSon 对XML 的支持:

            <dependency>
                <groupId>com.fasterxml.jackson.dataformatgroupId>
                <artifactId>jackson-dataformat-xmlartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    添加一个测试接口:

    @RestController
    @RequestMapping
    public class AAA {
    
        @GetMapping("/TEST")
        public User getUser() {
            User user =new User();
            user.setName("zhangsan");
            return user;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    最后使用?format=json传递URL 参数,告诉服务端需要返回什么格式。可以看到如下结果:
    在这里插入图片描述
    在这里插入图片描述

    模板引擎

    除了 REST Web 服务,还可以使用 Spring MVC 来提供动态 HTML 内容。Spring MVC 支持多种模板技术,包括 ThymeleafFreeMarkerJSP(已淘汰不推荐使用)。此外,许多其他模板引擎自身也支持Spring MVC集成。

    Spring Boot 包括对以下模板引擎提供自动配置支持:

    • FreeMarker
    • Groovy
    • Thymeleaf
    • Mustache

    Thymeleaf系列文档

    错误处理

    对于异常和错误Spring Boot 都提供了默认机制,参考:

    Spring MVC系列(12)-异常处理流程源码分析
    Spring MVC系列(13)-实际开发中异常处理方案

    CORS 跨域处理

    Spring Boot默认也提供了跨域的处理方案,参考:

    跨域的原理及解决方案

    Jersey

    JAX-RSJAVA 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";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    嵌入式 Servlet 容器支持

    对于 servlet 应用程序,Spring Boot 提供了嵌入式 TomcatJettyUndertow服务器的支持。spring-boot-starter-web默认使用的是 Tomcat

    在这里插入图片描述
    要想使用使用Jetty,如下配置即可:

            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-web
                artifactId>
                <exclusions>
                    
                    <exclusion>
                        <groupId>org.springframework.bootgroupId>
                        <artifactId>spring-boot-starter-tomcatartifactId>
                    exclusion>
                exclusions>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-jettyartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    默认情况下,嵌入式服务器使用 8080 端口侦听 HTTP 请求。

    Java Web 包含三大组件:ServletFilterListener

    使用嵌入式 Servlet 容器时,可以通过使用 Spring Bean 扫描来注册组件。

    一般一个应用上下文中只有一个Servlet组件,处理所有/ 请求,比如Spring Boot 就帮我们自动配置了Spring MVC的中央处理器DispatcherServlet:
    在这里插入图片描述
    关于DispatcherServlet参考作者以前写的Spring MVC系列(7)-DispatcherServlet处理请求流程源码分析

    如何在Spring Boot 中使用监听器和过滤器,嵌入式服务器,以及配置Tomcat、Jetty 和 Undertow 会有单独文章介绍,这里就不赘述了。

  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: cfenv: FE_INVALID
    简述快速失败(fail-fast)和安全失败(fail-safe)的区别 ?
    区块链入门相关概念
    RabbitMQ 学习(四)-- 交换机(发布/订阅、路由、主题模式)
    解决全屏不了的问题状态栏依然存在
    全球十大优质炒黄金交易APP平台排名(信息汇总)
    软件工程经济学期末复习
    Java Map集合面试题汇总
    Qt编写ffmpeg本地摄像头显示(16路本地摄像头占用3.2%CPU)
    No.8面向对象分析
  • 原文地址:https://blog.csdn.net/qq_43437874/article/details/126129871