DispatcherServlet 源码分析(六) - HandlerAdapter 处理请求
2017-06-11 21:09
363 查看
1. AnnotationMethodHandlerAdapter.invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler)
用来调用handler
这里做到了如下:
1) 找到请求对应的方法
2)解析如下类型的参数标签@RequestParam,@RequestHeader,@RequestBody,@CookieValue,@PathVariable,@ModelAttribute,@Value,@Validated,每个标签都有自己独特的一套解析方式
并将参数绑定到对应的方法入参中
其中@RequestBody会用到注入的HttpMessageConverter
3)根据1)2)步得到的Method和args反射调用
4)根据返回类型(HttpEntity,@ResponseBody,ModelAndView,Model,View,@ModelAttribute,Map,String)包装成ModelAndView对象
其中HttpEntity,@ResponseBody 比较特殊,不会包装成ModelAndView
用来调用handler
这里做到了如下:
1) 找到请求对应的方法
2)解析如下类型的参数标签@RequestParam,@RequestHeader,@RequestBody,@CookieValue,@PathVariable,@ModelAttribute,@Value,@Validated,每个标签都有自己独特的一套解析方式
并将参数绑定到对应的方法入参中
其中@RequestBody会用到注入的HttpMessageConverter
3)根据1)2)步得到的Method和args反射调用
4)根据返回类型(HttpEntity,@ResponseBody,ModelAndView,Model,View,@ModelAttribute,Map,String)包装成ModelAndView对象
其中HttpEntity,@ResponseBody 比较特殊,不会包装成ModelAndView
protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { ServletHandlerMethodResolver methodResolver = getMethodResolver(handler); //根据请求找到对应的方法 Method handlerMethod = methodResolver.resolveHandlerMethod(request); ServletHandlerMethodInvoker methodInvoker = new ServletHandlerMethodInvoker(methodResolver); ServletWebRequest webRequest = new ServletWebRequest(request, response); ExtendedModelMap implicitModel = new BindingAwareModelMap(); //反射调用对应的方法,其中很重要一步就是准备参数 Object result = methodInvoker.invokeHandlerMethod(handlerMethod, handler, webRequest, implicitModel); //将返回值根据返回类型(HttpEntity,@ResponseBody,ModelAndView,Model,View,@ModelAttribute,Map,String)包装成ModelAndView对象 ModelAndView mav = methodInvoker.getModelAndView(handlerMethod, handler.getClass(), result, implicitModel, webRequest); // methodInvoker.updateModelAttributes(handler, (mav != null ? mav.getModel() : null), implicitModel, webRequest); return mav; }
相关文章推荐
- Struts2源码分析--请求处理
- Struts2源码分析--请求处理
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- (转)android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- struts2的请求处理过程源码分析
- 第二人生的源码分析(四十四)虚拟文件系统的请求处理
- [转] android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Struts2源码分析--请求处理
- Struts2源码分析--请求处理(一)
- Struts2源码分析--请求处理
- Struts2源码分析--请求处理续二
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 蔡军生先生第二人生的源码分析(四十四)虚拟文件系统的请求处理
- Struts2源码分析--请求处理
- Struts2源码分析--请求处理续
- Struts2源码分析--请求处理
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 第二人生的源码分析(四十四)虚拟文件系统的请求处理