DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
1、文件上传解析,如果请求类型是multipart将通过MultipartResolver 进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个
HandlerInterceptor 拦截器);
3、通过 HandlerAdapter 支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver 解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver 来解析。
DispatcherServlet在web.xml中的配置:
<servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>chapter2</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
该 DispatcherServlet 默认使用WebApplicationContext 作为上下文, Spring 默认配置文件为
“/WEB-INF/[servlet名字]-servlet.xml”。
我们也可以通过添加初始化参数,而非上面的默认配置文件:
<servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet-config.xml</param-value> </init-param> </servlet>
而如果配置是Spring集成Web环境的通用配置;一般用于加载除Web 层的Bean(如DAO、Service等),以便于与其他任何Web框架集成。则是这样的通用上下文配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-common-config.xml, classpath:spring-budget-config.xml </param-value> </context-param> <listener> <listenerclass> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
创建完毕后会将该上下文放在ServletContext:
servletContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
此图来自“跟开涛学习SpringMVC”
ContextLoaderListener 初始化的上下文加载的Bean 是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;
DispatcherServlet 初始化的上下文加载的Bean 是只对Spring Web MVC 有效的Bean,如Controller、
HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。
拦截的配置:
<bean id="annotationMapper" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <ref bean="handerInterceptor1"/> <ref bean="handerInterceptor2"/> </list> </property> </bean>
执行的顺序:
handerInterceptor1.preHandle
handerInterceptor2.preHandle
handerAdapter
handerInterceptor1.postHandle
handerInterceptor2.postHandle
view render
handerInterceptor1.afterCompletion
handerInterceptor2.afterCompletion