您的位置:首页 > 其它

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: