SpringMVC运行流程分析

SpringMVC运行流程分析

SpringMVC的接受请求
、处理请求、返回响应结果的全流程处理过程如下:
在这里插入图片描述
在这里插入图片描述

现在基本上都是基于SpringBoot来快速开发web应用程序,@Controller表明这是一个控制器,然后@RequestMapping代表请求路径和控制器(或其方法)的映射关系,它会在Web服务器启动SpringMVC时,就被扫描到HandlerMapping的机制中存储,之后在用户发起请求被DispatcherServlet拦截后,通过URI和其他的条件,通过HandlerMapper机制就能找到对应的控制器(或其方法)进行响应。只是通过HandlerMapping返回的是一个HandlerExecutionChain对象。
HandlerExecutionChain对象包含一个处理器(handler) 。这里的处理器是对控制器(controller)的包装,因为我们的控制器方法可能存在参数,那么处理器就可以读入HTTP和上下文的相关参数,然后再传递给控制器方法。而在控制器执行完成返回后,处理器又可以通过配置信息对控制器的返回结果进行处理。处理器包含了控制器方法的逻辑,此外还有处理器的拦截器(interceptor),这样就能够通过拦截处理器进一步地增强处理器的功能。得到了处理器(handler),还需要去运行,但是我们有普通HTTP请求,也有按BeanName的请求,甚至是WebSocket的请求,所以它还需要一个适配器去运行HandlerExecutionChain对象包含的处理器,这就是HandlerAdapter接口定义的实现类。在SpringMVC 中最常用的HandlerAdapter的实现类是HttpRequestHandlerAdapter。通过请求的类型,DispatcherServlet就会找到它来执行Web请求的HandlerExecutionChain对象包含的内容,这样就能够执行我们的处理器(handler)了。在处理器调用控制器时,它首先通过模型层得到数据,再放入数据模型中,最后将返回模型和视图(ModelAndView)对象,这样就走到了视图解析器(ViewResolver),去解析视图逻辑名称了。
在前后端分离的web项目中,一般都是基于JSON数据进行交互的,只是将数据模型渲染为JSON数据集来响应请求。所以这时候返回的并不是一个逻辑视图名称,而是一个JSON字符串,那就不需要视图解析器(InternalResourceViewResolver)的解析去找到对应的视图页面,然后渲染数据到视图中这一步骤了。
在这里插入图片描述

定制SpringMVC的初始化

在SpringBoot中可以通过实现WebMvcConfigurer接口来定制化SpringMVC的初始化过程,WebMvcConfigurer是一个基于Java8的接口,所以其大部分方法都是default类型的,但是它们都是空实现,这样开发者只需要实现这个接口,重写需要自定义的方法即可,这样就很方便进行开发了。
也可以在SpringBoot默认加载的配置文件application.properties中进行SpringMVC的定制化配置

# SPRING MVC (WebMvcProperties) 
spring.mvc.async.request-timeout= #异步请求超时时间(单位为毫秒)
# 是否使用请求参数〔默认参数为"format")来确定请求的媒体类型
spring.mvc.contentnegotiation.favor-parameter=false 
spring.mvc.contentnegotiation.favor-path-extension=false #是否使用URL中的路径扩展来确定请求的媒体类型
spring.mvc.contentnegotiation.media-types.*= #设置内容协商向媒体类型映射文件扩展名。例如,YML文本/YAML
spring.mvc.contentnegotiation.parameter-name= #当启用favor-parameter参数是,自定义参数名
spring.mvc.date-format= #日期格式配置,如yyyy-MM-dd
spring.mvc.dispatch-trace-request=false #是否让FrameworkServlet doService方法支持TRACE请求
spring.mvc.dispatch-options-request=true #是否启用FrameworkServlet doService方法支持OPTIONS请求
spring.mvc.favicon.enabled=true #spring MVC的图标是否启用
spring.mvc.formcontent.putfilter.enabled=true # Servlet规范要求表格数据可用于HTTP POST而不是HTTP PUT或PATCH请求,这个选项将使得过滤器拦截HTTP PUT和PATCH,且内容类型是application/x-www-form-urlencoded的请求,并且将其转换为POST请求
spring.mvc.ignore-default-model-on-redirect=true #如果配置为default,那么它将忽略模型重定向的场景
spring.mvc.locale= #默认国际化选项,默认取Accept-Language
spring.mvc.locale-resolver=accept-header #国际化解析器,如果需要固定可以使用fixed
spring.mvc.log-resolved-exception=false #是否启用警告日志异常解决
spring.mvc.message-codes-resolver-format= #消息代码的格式化策略。例如,’prefix_error_code’
spring.mvc.pathmatch.use-registered-suffix-pattern=false #是否对spring.mvc.contentnegotiation.media-types.*注册的扩展采用后缀模式匹配
spring.mvc.pathmatch.use-suffix-pattern=false #当匹配模式到请求时,是否使用后缀模式匹配(.*)
spring.mvc.servlet.load-on-startup=-1 #启用Spring Web服务Serlvet的优先顺序配置
spring.mvc.static-path-pattern=/** #指定静态资源路径
spring.mvc.throw-exception-if-no-handler-found=false #如果请求找不到处理器,是否抛出NoHandlerFoundException异常
spring.mvc.view.prefix= #Spring MVC视图前缀
spring.mvc.view.suffix= #Spring MVC视图后缀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值