栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

本系列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的自动使用。

Http消息转换器

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)-实际开发中异常处理方案

CORS 跨域处理

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

跨域的原理及解决方案

Jersey

JAX-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 会有单独文章介绍,这里就不赘述了。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036911.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号