软件开发和网站开发有何不同,定制类网站建设,做只在自己电脑上的网站,网站建设原目录 前言DispatcherServlet初始化过程DispatcherServlet处理请求过程总结参考资料前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉#xff0c;那么请参考它的入门blog#xff1a;http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本…目录 前言DispatcherServlet初始化过程DispatcherServlet处理请求过程总结参考资料前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉那么请参考它的入门bloghttp://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程让读者了解这个入口Servlet的作用。 DispatcherServlet初始化过程 在分析DispatcherServlet之前我们先看下DispatcherServlet的继承关系。 HttpSerlvetBean继承自HttpServlet。 HttpServletBean覆写了init方法对初始化过程做了一些处理。 我们来看下init方法到底做了什么 servletservlet-namedispatcher/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class load-on-startup1/load-on-startup init-paramparam-namecontextConfigLocation/param-name param-valueclasspath:springConfig/dispatcher-servlet.xml/param-value /init-param
/servletservlet-mappingservlet-namedispatcher/servlet-name url-pattern//url-pattern
/servlet-mapping比如上面这段配置传递了contextConfigLocation参数之后构造BeanWrapper这里使用BeanWrapper有2个理由1. contextConfigLocation属性在FrameworkServlet中定义HttpServletBean中未定义 2. 利用Spring的注入特性只需要调用setPropertyValues方法就可将contextConfigLocation属性设置到对应实例中也就是以依赖注入的方式初始化属性。 然后设置DispatcherServlet中的contextConfigLocation属性(FrameworkServlet中定义)为web.xml中读取的contextConfigLocation参数该参数用于构造SpringMVC容器上下文。 下面看下FrameworkServlet这个类FrameworkServlet继承自HttpServletBean。 首先来看下该类覆写的initServletBean方法 接下来看下initWebApplicationContext方法的具体实现逻辑 这里的根上下文是web.xml中配置的ContextLoaderListener监听器中根据contextConfigLocation路径生成的上下文。 context-paramparam-namecontextConfigLocation/param-name param-valueclasspath:springConfig/applicationContext.xml/param-value
/context-param
listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class
/listener比如这段配置文件中根据classpath:springConfig/applicationContext.xml下的xml文件生成的根上下文。 最后看下DispatcherServlet。 DispatcherServlet覆写了FrameworkServlet中的onRefresh方法 很明显initStrategies方法内部会初始化各个策略接口的实现类。 比如异常处理初始化initHandlerExceptionResolvers方法SpringMVC异常处理机制详解 视图处理初始化initViewResolvers方法SpringMVC视图机制详解 请求映射处理初始化initHandlerMappings方法详解SpringMVC请求的时候是如何找到正确的Controller 总结一下各个Servlet的作用 1. HttpServletBean 主要做一些初始化的工作将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。 2. FrameworkServlet 将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext这个属性代表SpringMVC上下文它有个父类上下文既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。 3. DispatcherServlet 初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。 DispatcherServlet处理请求过程 在分析DispatcherServlet处理请求过程之前我们回顾一下Servlet对于请求的处理。 HttpServlet提供了service方法用于处理请求service使用了模板设计模式在内部对于http get方法会调用doGet方法http post方法调用doPost方法........... 进入processRequest方法看下 其中注册的监听器类型为ApplicationListener接口类型。 继续看DispatcherServlet覆写的doService方法 最终就是doDispatch方法。 doDispatch方法功能简单描述一下 首先根据请求的路径找到HandlerMethod(带有Method反射属性也就是对应Controller中的方法)然后匹配路径对应的拦截器有了HandlerMethod和拦截器构造个HandlerExecutionChain对象。HandlerExecutionChain对象的获取是通过HandlerMapping接口提供的方法中得到。有了HandlerExecutionChain之后通过HandlerAdapter对象进行处理得到ModelAndView对象HandlerMethod内部handle的时候使用各种HandlerMethodArgumentResolver实现类处理HandlerMethod的参数使用各种HandlerMethodReturnValueHandler实现类处理返回值。 最终返回值被处理成ModelAndView对象这期间发生的异常会被HandlerExceptionResolver接口实现类进行处理。 总结 本文分析了SpringMVC入口Servlet - DispatcherServlet的作用其中分析了父类HttpServletBean以及FrameworkServlet的作用。 SpringMVC的设计与Struts2完全不同Struts2采取的是一种完全和Web容器隔离和解耦的机制而SpringMVC就是基于最基本的request和response进行设计。 文中难免有错误希望读者能够指明出来。 参考资料 http://my.oschina.net/lichhao/blog/102315 http://my.oschina.net/lichhao/blog/104943 http://jinnianshilongnian.iteye.com/blog/1602617转载于:https://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html