SpringBoot的Web开发

本文详细介绍了Spring Boot中Spring MVC的配置,包括静态资源处理、RESTful支持、参数处理、异常处理等。讲解了静态资源目录、请求映射原理、参数注解以及内容协商机制。同时,还涵盖了自定义配置、错误处理和Web原生组件注入的相关内容,深入剖析了Spring Boot MVC的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单功能分析
静态资源访问

  • 静态资源目录,类路径下: /static,/public,resources,/META-INF/resources
  • 原理
    • 静态资源映射规则为/**,请求进来先让Controller处理,Controller没有则在静态资源中找
  • 通过spring.mvc.static-path-pattern可以给静态资源请求路径加上前缀
    • 场景:使登录拦截器跳过静态资源前缀的请求
  • spring.resources.static-locations改变代码中静态资源读取的路径
  • webjars
    • jquery这样的前台代码可以通过依赖jar包的方式引用,访问地址http://localhost:8080/webjars/***

欢迎页支持

网页小图标支持

  • 将名称为favicon.ico的小图标放到静态资源根目录下

静态资源配置原理

  • SpringMVC功能的自动配置类WebMvcAutoConfiguration
    • 静态内部类WebMvcAutoConfigurationAdapter
      • 只有一个有参构造器,那么参数会在容器中找,找不到就使用配置文件构造
      • 添加资源处理器的方法addResourceHandlers
        • 静态资源映射规则是否生效spring.resources.addMappings
        • 静态资源缓存时间spring.resources.cache.period
        • 配置/webjars/**映射规则
        • 配置静态资源访问路径规则spring.mvc.static-path-pattern
    • 静态内部类EnableWebMvcConfiguration
      • 欢迎页配置规则welcomePageHandlerMapping

请求参数处理

  • 请求映射
    • @xxxMapping
    • Rest风格支持(使用HTTP请求方式动词来表示对资源的操作)
      • 以前:/getUser、/deleteUser、/editUser、/saveUser
      • 现在:/user GET方式、DELETE方式、PUT方式、POST方式
      • 核心Filter HiddenHttpMethodFilter
      • WebMvcAutoConfiguration的方法hiddenHttpMethodFilter配置了开启rest风格
        • 默认关闭,需要手动开启
        • doFilterInternal方法配置了表单请求方式下REST风格的支持
          • 请求方式必须是POST
          • 请求中带上_method参数区分方式
          • 使用包装者模式,构造一个HttpMethodRequestWrapper
            • 该类实现原生HttpServletRequest
            • 重写了getMethod方法,返回_method
          • 过滤器放行包装对象
        • 若非表单提交,直接根据不同请求方式映射到对应方法
    • 请求映射原理
      • 所有请求都会进入DispatcherServlet
      • 核心方法doGetdoPost–>processRequest–>doService–>doDispatch
        • getHandler获取处理器
          • handlerMappings处理器映射器集合
            • RequestMappingHandlerMapping
              • mappingRegistry中存放了请求路径对应的处理器

普通参数与基本注解

  • 注解
    • @PathVariable@RequestHeader@ModelAttribute@RequestParam@MatrixVariable@CookieValue@RequestBody
    • 通过文档注释可以发现,有些注解可以用于修饰Map<String,String>
      • 矩阵变量
        • /car/cell;low=34;brand=byd,yd,queryString分号后面的参数就是矩阵变量
        • SpringBoot默认关闭@MatrixVariable,需要自己定制配置开启矩阵变量
          • 原因:WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#configurePathMatch,该方法配置了UrlPathHelper,变量removeSemicolonContent默认为true,移除queryString中的分号以及后面的参数
          • 定制方式1:不用@EnableWebMvc注解,使用@Configuration+继承WebMvcConfigurer,重写configurePathMatch方法
          • 定制方式2:直接注入WebMvcConfigurer对象,重写configurePathMatch方法
  • Servlet API
    • WebRequestServletRequestMultiparRequestHttpSessionjavax.servlet.http.PushBuilderPrincipalInputStreamReaderHttpMethodLocaleTimeZoneZoneId
  • 复杂参数
    • MapErrors/BindingResultModelRedirectAttributesServletResponseSessionStatusUriComponentsBuilderServletUriComponentsBuilder
  • 自定义对象参数
    • 可以自动类型转换与格式化,可以级联封装
  • 参数处理原理
    • DispatcherServlet#getHandler找到能处理请求的Handler
    • getHandlerAdapter为当前Handler找到一个适配器HandlerAdapter RequestMappingHandlerAdapter
    • 内部方法处理细节RequestMappingHandlerAdapter#handleInternal–>invokeHandlerMethod
      • 设置参数解析器
      • 设置返回值处理器
      • invokeAndHandle
        • invokeForRequest真正执行Controller方法
          • getMethodArgumentValues获取所有参数
            • HandlerMethodArgumentResolverComposite#supportsParameter当前所有解析器是否支持该参数
            • HandlerMethodArgumentResolverComposite#resolveArgument解析该参数
          • 使用反射调用目标方法

定制参数转换器

  • 重写WebMvcConfigurer#addFormatters,添加Converter

返回值处理

  • HandlerMethodReturnValueHandlerComposite#handleReturnValue返回值处理
    • 找到返回值处理器RequestResponseBodyMethodProcessor
      • AbstractMessageConverterMethodProcessor#writeWithMessageConverters
        • 响应内容协商
        • 找到支持该响应类型的转换器,将返回值写出去

内容协商

  • springboot会根据客户端请求头的Accept找到优先适配的转换器对返回值进行转换
  • 添加依赖对应依赖,丰富服务器内容协商种类,例如
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>
  • spring.mvc.contentnegotiation.favor-parametertrue可以开启基于请求参数的内容协商,根据参数format判断响应格式
    • 场景:应用于浏览器端无法修改请求头的情况下
    • 原理ContentNegotiationManager#strategies内容协商管理器中多了一种参数策略ParameterContentNegotiationStrategy

自定义HttpMessageConverter

  • WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#configureMessageConverters中会添加系统默认的转换器
    • HttpMessageConverters#getConverters–>HttpMessageConverters()–>getDefaultConverters()–>WebMvcConfigurationSupport#getMessageConverters–>addDefaultHttpMessageConverters()
  • 自定义
    • 实现HttpMessageConverter
    • WebMvcConfigurer#configureMessageConverters配置类中加入自定义转换器

视图解析

  • DispatcherServlet#doDispatch
    • AbstractHandlerMethodAdapter#handle获取视图
    • DispatcherServlet#render–>View#render解析式图

异常处理自动配置原理

  • ErrorMvcAutoConfiguration
    • DefaultErrorAttributes errorAttributes(),定义错误页面可以包含哪些数据
    • BasicErrorController basicErrorController(),默认处理/error请求,根据内容协商响应错误视图(白页或json)
    • View defaultErrorView()默认错误视图
    • BeanNameViewResolver beanNameViewResolver(),按beanName在容器中寻找bean的视图解析器
    • DefaultErrorViewResolver conventionErrorViewResolver()默认错误视图解析器
      • DefaultErrorViewResolver#resolve错误视图解析

异常处理

  • DispatcherServlet#processHandlerException
    • processHandlerException处理异常,若所有解析器都不能处理异常则抛出
    • 如果没有解析器能处理异常,则spring会再发一个请求/error

定制错误处理逻辑

  • 自定义错误页
    • 404错误跳转页404.html,所有500异常跳转页5xx.html
    • @ControllerAdvice + @ExceptionHandler处理全局异常,底层是ExceptionHandlerExceptionResolver支持的
    • @ResponseStatus + 自定义异常,底层是ResponseStatusExceptionResolver支持,把ResponseStatus注解信息组装成错误信息,调用response.sendError(statusCode,resolveReason)
    • Spring底层的异常,如:参数类型转换异常
    • 自定义实现HandlerExceptionResolver处理异常
    • ErrorViewResolver实现自定义处理异常

Web原生组件注入(Servlet,Filter,Listener)

  • 方式一
    • @ServletComponentScan扫描注解
    • 继承HttpServlet, 添加@WebServlet
    • 继承Filter, 添加@WebFilter
    • 继承ServletContextListener, 添加@WebListener
  • 方式二
    • 注入ServletRegistrationBean组件
    • 注入FilterRegistrationBean组件
    • 注入ServletListenerRegistrationBean组件
  • 为何注入的Servlet不会被SpringMVC的拦截器拦截到
    • SpringMVC注入了一个DispatcherServlet,默认映射路径为/,如果我们注入的Servlet映射路劲为/my,当请求发到tomcat的时候,tomcat会按精确匹配优先原则转发到我们注入的Servlet,因此不走SpringMVC流程,也就不会被SpringMVC中的拦截器拦截到

@EnableWebMvc全面接管SpringMVC配置,慎用

  • 原理
    • WebMvcAutoConfiguration自动配置类有个条件@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    • @EnableWebMvc注解导入了一个组件@Import(DelegatingWebMvcConfiguration.class)
    • DelegatingWebMvcConfiguration继承于WebMvcConfigurationSupport, 因此WebMvcAutoConfiguration自动配置类不生效

数据访问

  • 导入spring-boot-starter-jdbc
    • 依赖
    • 数据源com.zaxxer:HikariCP
    • JDBCorg.springframework:spring-jdbc
    • 事务org.springframework:spring-tx
  • 导入驱动,如mysql-connector-java
  • 自动配置的类
    • DataSourceAutoConfiguration: 数据源的自动配置
    • DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置
    • JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud
    • JndiDataSourceAutoConfiguration: jndi的自动配置
    • XADataSourceAutoConfiguration: 分布式事务相关的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值