SpringMVC专题——SpringMVC的流程(个人理解)
来源:互联网 发布:adobe dw cc 2017 mac 编辑:程序博客网 时间:2024/05/16 00:50
SpringMVC处理请求:
——》访问URL首先被DispatcherServlet截获
——》DispatcherServlet通过handlerMapping【定位controller,本质map<url,controller>】获得HandlerExecutionChain
——》然后获得HandlerAdapter【定位方法】(Spring容器注入argumentResolvers(List中都实现了HandlerMethodArgumentResolver)和returnValueHandlers(List中都实现了HandlerMethodReturnValueHandler)两个属性,前者有很多Resolver或者Processor处理请求,后者有很多handler或者processor处理响应)
——》创建ServletInvocableHandlerMethod对象(分两部分处理请求和响应,此时通过HandlerAdapter的注入argumentResolvers和returnValueHandlers)
——》形参的注入
(例子1:@RequestBody注解,此时调用argumentResolvers中的RequestResponseBodyMethodProcessor进行处理,RequestResponseBodyMethodProcessor中构造方法中传入了List<HttpMessageConverter<?>>,List<HttpMessageConverter<?>>包含了很多消息转换器,【例如StringHttpMessageConverter类,它的canRead()方法返回true,然后它的read()方法会从请求中读出请求参数,绑定到XXX方法的string变量中等等】,然后RequestResponseBodyMethodProcessor根据http请求头部的contentType然后选择合适的消息转换器进行读取)
(例子2:@RequestParam注解,先是调用argumentResolvers中的RequestParamMethodArgumentResolver进行处理,在处理参数的时候使用request.getParameter(参数名),如果为null,RequestParamMethodArgumentResolver处理missing value会触发MissingServletRequestParameterException异常,否则最后通过DataBinder找到合适的属性编辑器进行类型转换)
(例子3:形参上没有注解,如果是简单类型【String,Integer等等】此时调用argumentResolvers中RequestParamMethodArgumentResolver处理,如果是非简单类型【自定义对象等等】,此时调用argumentResolvers中ServletModelAttributeMethodProcessor【参数类型是实现或继承或是WebRequest、ServletRequest、MultipartRequest、HttpSession、Principal、Locale、TimeZone、InputStream、Reader、HttpMethod这些类,所以我们能再Controller中添加一个HttpServletRequest参数,Spring会为我们自动获得HttpServletRequest对象的原因】,最后通过DataBinder实例化对象,并写入对应的属性)
——》执行方法内容,调用业务处理等等
——》如果有使用@ResponseBody注解的话,此时会调用returnValueHandlers中的RequestResponseBodyMethodProcessor,RequestResponseBodyMethodProcessor构造方法中传入了List<HttpMessageConverter<?>>,RequestResponseBodyMethodProcessor调用handleReturnValue,响应的具体处理是使用消息转换器。
——》方法执行完毕后,向DispatcherServlet 返回一个ModelAndView对象
——》根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet
——》将渲染结果返回给客户端
以下是转载别人总结的HandlerMethodArgumentResolver实现类(处理请求)的作用和returnValueHandlers实现类(处理响应)的作用
1. RequestParamMethodArgumentResolver
支持带有@RequestParam注解的参数或带有MultipartFile类型的参数
2. RequestParamMapMethodArgumentResolver
支持带有@RequestParam注解的参数 && @RequestParam注解的属性value存在 && 参数类型是实现Map接口的属性
3. PathVariableMethodArgumentResolver
支持带有@PathVariable注解的参数 且如果参数实现了Map接口,@PathVariable注解需带有value属性
4. MatrixVariableMethodArgumentResolver
支持带有@MatrixVariable注解的参数 且如果参数实现了Map接口,@MatrixVariable注解需带有value属性
5. RequestResponseBodyMethodProcessor
支持的请求类型是Controller方法参数中带有@RequestBody注解,支持的响应类型是Controller方法带有@ResponseBody注解
6. ServletRequestMethodArgumentResolver
参数类型是实现或继承或是WebRequest、ServletRequest、MultipartRequest、HttpSession、Principal、Locale、TimeZone、InputStream、Reader、HttpMethod这些类。
(这就是为何我们在Controller中的方法里添加一个HttpServletRequest参数,Spring会为我们自动获得HttpServletRequest对象的原因)
7. ServletResponseMethodArgumentResolver
参数类型是实现或继承或是ServletResponse、OutputStream、Writer这些类
8. RedirectAttributesMethodArgumentResolver
参数是实现了RedirectAttributes接口的类
9. HttpEntityMethodProcessor
参数类型是HttpEntity
从名字我们也看的出来, 以Resolver结尾的是实现了HandlerMethodArgumentResolver接口的类,以Processor结尾的是实现了HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler的类。
- SpringMVC专题——SpringMVC的流程(个人理解)
- springmvc学习笔记(31)——springmvc运行流程
- springMVC框架初始化流程的初步理解
- 【SpringMVC】SpringMVC的工作流程
- springmvc原始入门(帮助理解springmvc流程)
- Springmvc的个人浅见
- SpringMVC的工作流程
- SpringMVC的处理流程
- SpringMVC的工作流程
- Springmvc的框架流程
- SpringMVC的工作流程
- springMVC的流程
- springMVC的执行流程
- 关于springmvc的流程
- springMVC的工作流程
- SpringMvc的执行流程
- SpringMVC的工作流程
- SpringMVC的核心流程
- IntelliJ IDEA 快捷键和设置
- UDP(用户数据报协议)和套接字编程
- Java NIO浅析
- 6月22日云栖精选夜读:业界首个非侵入式热修复方案Sophix重磅推出_颠覆移动端传统更新流程!
- R6 STM32 I2C—读写EEPROM
- SpringMVC专题——SpringMVC的流程(个人理解)
- studio关联svn
- java中Keytool的使用总结
- 关于样本溯源相关
- 802.11协议——初探
- iOS获取 当前的系统字体
- 打包zip文件并下载
- Netty实现原理浅析
- 信号量与互斥锁