微信公众号素材网站,网站建设改革情况汇报,如何打开网页,wordpress放哪文章目录 1. 最经典的MVC的使用情况2. 经典情况相关的组件3. 执行3.1. 先看DispatcherServlet的总体过程3.2. 再看RequestMappingHandlerAdapter的总体过程3.2.1. RequestParamMethodArgumentResolver3.2.2. 反射调用 Controller 的方法3.2.3. RequestResponseBodyMethodProces… 文章目录 1. 最经典的MVC的使用情况2. 经典情况相关的组件3. 执行3.1. 先看DispatcherServlet的总体过程3.2. 再看RequestMappingHandlerAdapter的总体过程3.2.1. RequestParamMethodArgumentResolver3.2.2. 反射调用 Controller 的方法3.2.3. RequestResponseBodyMethodProcessor 4. 总结 本文以“最经典”的情况分析了 DispatcherServlet 处理请求的全部过程。通读全文读者应该对总体框架有一定的认识且要求今后能有能力把 mvc 的其他组件原理“嵌入到总体框架中”。 1. 最经典的MVC的使用情况
这个过程很长设计的到 web 组件很多所以需要以一个最常见的情况作为“经典情况”来简化分析过程。突破之后再在对总体流程和框架的基础上往上面新的补充内容。为了方便我讲解我以 “经典情况”是Controller 中的RequestMapping方法的参数贴了RequestParam注解返回值上贴了ResponseBody注解 搞完“经典情况”后续的其他 mvc 组件作者会一个一个的分析。 2. 经典情况相关的组件
RequestMappingHandlerMapping请求映射器 功能把请求 request 映射到 handler根据路径匹配 对应关系只要我们的 Controller 写的路径匹配上了请求就可以了假设匹配上。 HandlerMethod处理请求 功能具体处理请求的 对应关系对应是 Controller 中的方法 HandlerExecutionChain处理器链 功能等于“处理器” “匹配的拦截器” 对应关系这里就是等于“HandlerMethod 匹配到的拦截器MappedInterceptor” RequestMappingHandlerAdapter对HandlerExecutionChain 再次包装 记住反正就是由RequestMappingHandlerAdapter 开始执行的就可以了。 RequestParamMethodArgumentResolver参数解析器 功能专门处理 RequestParam 注解的 对应关系从请求 request 中解析出参数调用 ServletRequest的 getParameterValues方法 RequestResponseBodyMethodProcessor返回值处理器 功能专门刚好处理 ResponseBody注解。 3. 执行
3.1. 先看DispatcherServlet的总体过程
DispatcherServlet 的doDispatch方法的总体执行过程
getHandler1getHandlerAdapter2applyPreHandle3handle重点真正处理4applyPostHandle5
在1处得到 HandlerExecutionChain包含 HandlerMethod和 MappedInterceptor 在2处得到 RequestMappingHandlerAdapter 在3处执行MappedInterceptor的 preHandle方法 在4处执行 RequestMappingHandlerAdapter的 handler方法 在5处执行MappedInterceptor的 postHandle方法
3.2. 再看RequestMappingHandlerAdapter的总体过程
继续看 RequestMappingHandlerAdapter的 handler方法的总体过程 注意执行顺序是从左到右从上到下执行的 封装为ServletInvocableHandlerMethod1invokeAndHandle invokeForRequest getMethodArgumentValues解析参数 resolveArgument解析参数 getArgumentResolver得到“参数解析器”resolveArgument真正解析 doInvoke具体执行 handleReturnValue处理返回值 selectHandlerhandleReturnValue getModelAndView2
主要就只有 3 个关键过程上面已加粗说明 1、按 Controller 方法的要求解析参数。用的是 RequestParamMethodArgumentResolver 2、执行 Controller 方法。 3、处理 Controller 方法的返回值。用的是 RequestResponseBodyMethodProcessor 下面简单提一下其他过程按序号 在1处把真正的执行的组件HandlerMethod 一顿疯狂包装成ServletInvocableHandlerMethod 比如就包装了 web 数据绑定器WebDataBinder 在2处处理视图现在都是前后端开发不用视图技术了。作者不讲略自己搞。
3.2.1. RequestParamMethodArgumentResolver
支持的参数
在它的 supportsParameter 方法中表明了支持“参数上贴了RequestParam注解的参数”
执行解析参数
1、 调用RequestParamMethodArgumentResolver的resolveArgument方法 2、 会调用到RequestParamMethodArgumentResolver 的resolveName方法 3、会调用到解析文件的multipartRequest方法 和 从请求获取参数的 request.getParameterValues方法 4、解析之后还没有结束还需要转换成 Controller 方法需要的参数类型略这就是另外的小细节故事了 截止目前也就通过从请求中获取参数完成了 Controller 方法参数的解析 3.2.2. 反射调用 Controller 的方法
没什么好讲的反射调用 Controller 的方法。
3.2.3. RequestResponseBodyMethodProcessor
支持的类型
在supportsReturnType方法中表明了支持的类型是方法上ResponseBody注解
处理返回值
1、会调用到RequestResponseBodyMethodProcessor 的 handleReturnValue方法 2、会调用writeWithMessageConverters方法 3、最后直接调用“消息转换器”messageConverters把“返回值写到流里面去了” 注意既然既然写到响应流 response 里面去了响应就结束了后面的视图处理过程就没了。 4. 总结
读完全文读者要求掌握以下组件的工作情况。对细节不需要苛责但是一定要能知道** 组件的功能 **和 **组件在流程中的位置**。
RequestMappingHandlerMapping请求映射器HandlerMethod处理请求HandlerExecutionChain处理器链RequestMappingHandlerAdapter对HandlerExecutionChain 再次包装RequestParamMethodArgumentResolver参数解析器RequestResponseBodyMethodProcessor返回值处理器