笔记:pringMVC执行流程解析
来源:互联网 发布:青海藏语广播网络电视 编辑:程序博客网 时间:2024/06/07 17:23
图片来源于网络
1、DispatcherServlet 中央调度器(主要职责就是任务调度,在servlet容器)
<!--使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet--> <!--DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。--> <servlet> <!--在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。--> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--指明了配置文件的文件名,不使用默认配置文件名,而使用dispatcher-servlet.xml配置文件。--> <init-param> <param-name>contextConfigLocation</param-name> <!--其中<param-value>**.xml</param-value> 这里可以使用多种写法--> <!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml--> <!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>--> <!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>--> <!--4、多个值用逗号分隔--> <param-value>classpath:springmvc/spring-mvc.xml</param-value> </init-param> <!--是启动顺序,让这个Servlet随Servletp容器一起启动。--> <load-on-startup>1</load-on-startup> </servlet>
2、HandlerMapping 处理器映射器
请求和负责处理请求方法之间的对应关系的一个映射关系
3、HandlerAdaptor 处理器适配器
HandlerAdapter【HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,SimpleServletHandlerAdapter,AnnotationMethodHandlerAdapter 】
实际调用处理函数,获得一个ModelAndView。
4、Controller 处理器
处理请求
5、ViewResolver 视图解析器
视图解析
6、View 视图
返回的数据
DispatchServlet中核心代码:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;boolean multipartRequestParsed = false;WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);try {ModelAndView mv = null;Exception dispatchException = null;try {processedRequest = checkMultipart(request);multipartRequestParsed = (processedRequest != request);/**** * 1、 HandleMapping 返回一个处理器执行链 */mappedHandler = getHandler(processedRequest);if (mappedHandler == null || mappedHandler.getHandler() == null) {noHandlerFound(processedRequest, response);return;}/**** * 2、获取HandleAdapter 处理器适配器 */HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// Process last-modified header, if supported by the handler.String method = request.getMethod();boolean isGet = "GET".equals(method);if (isGet || "HEAD".equals(method)) {long lastModified = ha.getLastModified(request, mappedHandler.getHandler());if (logger.isDebugEnabled()) {logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);}if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {return;}}if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}/**** * 3、HandleAdapter 调用具体处理器方法,返回一个ModelAndView */mv = ha.handle(processedRequest, response, mappedHandler.getHandler());if (asyncManager.isConcurrentHandlingStarted()) {return;}applyDefaultViewName(processedRequest, mv);mappedHandler.applyPostHandle(processedRequest, response, mv);}catch (Exception ex) {dispatchException = ex;}catch (Throwable err) {dispatchException = new NestedServletException("Handler dispatch failed", err);}/**** * 4、解析渲染视图 */processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}catch (Exception ex) {triggerAfterCompletion(processedRequest, response, mappedHandler, ex);}catch (Throwable err) {triggerAfterCompletion(processedRequest, response, mappedHandler,new NestedServletException("Handler processing failed", err));}finally {if (asyncManager.isConcurrentHandlingStarted()) {if (mappedHandler != null) {mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);}}else {if (multipartRequestParsed) {cleanupMultipart(processedRequest);}}}}
阅读全文
0 0
- 笔记:pringMVC执行流程解析
- AsyncTask执行流程解析图片
- Struts2执行流程源码解析
- mapPartitions各部分执行流程解析
- Spark任务执行流程解析
- JAVA 控制执行流程笔记
- ListView中requestLayout执行流程解析
- Spinner类setSelection执行流程源码解析
- spark的任务执行流程解析
- UBoot命令解析与执行流程
- SpringMVC执行流程及源码解析
- SpringMVC执行流程及源码解析
- mybatis源码解析-----执行流程1
- 图文解析Struts2框架执行流程
- SpringMVC 执行流程及源码解析
- ART执行类方法解析流程
- JDK 动态代理执行流程解析
- SpringMVC 执行流程及源码解析
- 斯坦福机器学习笔记 第2周 五、Octave教程(一)
- Python视觉处理(四)HSV处理
- sublime VI编辑器 十分钟熟练掌握各种命令
- zlib库 在windows下的编译与使用
- linux多线程编程基础函数介绍
- 笔记:pringMVC执行流程解析
- Java基础总结
- centos 7搭建vsftp安装,配置,卸载,常见错误
- Windows编程基础--第6节 VC++6.0控件说明
- JavaScript加密库Crypto-JS的使用
- Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)
- 【天籁纯音】-细腻 醇厚 深情《似人声 如马鸣·马头琴典藏PartⅠ》(MP3∥320K)‖〔WAV∥(DTS-ES6_1)VS(DTS-DS5_1)〕
- 计蒜客之字符乘积
- 【LCA】2017.10.22杂题[宝藏探寻]题解