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的类。

原创粉丝点击