一, SpringMVC 介绍
Spring mvc 是一个基于 mvc 的 web 框架. 其中核心类是 DispatcherServlet, 它是一个 Servlet, 顶层是实现的 Servlet 接口.
Spring mvc 是 spring 框架的一个模块, springmvc 和 spring 无需通过中间整合层进行整合.
二, SpringMVC 使用
需要在 Web.xml 中配置 DispatcherServlet. 并且需要配置 spring 监听器 ContextLoaderListener
- <?xml version="1.0" encoding="UTF-8"?> <!-- 当前的 XML 文档版本与字符编码 -->
- <Web-App xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
- <display-name>SpringMVC</display-name>
- <!-- SpringMVC 前段控制器 -->
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.Web.servlet.DispatcherServlet</servlet-class>
- <!-- contextConfigLocation 配置 SpringMVC 加载的配置文件(配置处理器映射器, 适配器等等)
- 如果不配置 ContextConfigLocation, 默认加载的是 / WEB-INF/servlet 名称 - servlet.xml(springmvc-servlet.xml)
- -->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:springmvc-config.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <!--
- 第一种:*.action, 访问以. action 结尾由 DispatcherServlet 进行解析
- 第二种:/, 所以访问的地址都由 DispatcherServlet 进行解析, 对于静态文件的配置不让 DispatcherServlet 解析
- 第三种:/*, 这样配置不对
- -->
- <url-pattern>*.action</url-pattern>
- </servlet-mapping>
- </Web-App>
三, SpringMVC 运行原理
1, 运行流程图:
2, 流程说明:
(1)客户端 (浏览器) 发送请求, 直接请求到 DispatcherServlet.(请求 DispatcherServlet)
(2)DispatcherServlet 根据请求信息调用 HandlerMapping, 解析请求对应的 Handler.(查找 @Controller)
(3)解析到对应的 Handler 后, 开始由 HandlerAdapter 适配器处理.(查找 @RequestMapping)
(4)HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求, 并处理相应的业务逻辑.(处理方法)
(5)处理器处理完业务后, 会返回一个 ModelAndView 对象, Model 是返回的数据对象, View 是个逻辑上的 View.(返回处理结果)
(6)ViewResolver 会根据逻辑 View 查找实际的 View.(逻辑视图解析为真正的视图)
(7)DispatcherServlet 把返回的 Model 传给 View.(DispatcherServlet 试图渲染)
(8)通过 View 返回给请求者(浏览器)
四, DispatcherServlet 详细解析
源码分析:
- package org.springframework.Web.servlet;
- @SuppressWarnings("serial")
- public class DispatcherServlet extends FrameworkServlet {
- public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
- public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
- public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
- public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
- public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
- public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
- public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
- public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
- public static final String FLASH_MAP_MANAGER_BEAN_NAME = "flashMapManager";
- public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = DispatcherServlet.class.getName() + ".CONTEXT";
- public static final String LOCALE_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".LOCALE_RESOLVER";
- public static final String THEME_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_RESOLVER";
- public static final String THEME_SOURCE_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_SOURCE";
- public static final String INPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".INPUT_FLASH_MAP";
- public static final String OUTPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".OUTPUT_FLASH_MAP";
- public static final String FLASH_MAP_MANAGER_ATTRIBUTE = DispatcherServlet.class.getName() + ".FLASH_MAP_MANAGER";
- public static final String EXCEPTION_ATTRIBUTE = DispatcherServlet.class.getName() + ".EXCEPTION";
- public static final String PAGE_NOT_FOUND_LOG_CATEGORY = "org.springframework.web.servlet.PageNotFound";
- private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";
- protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY);
- private static final Properties defaultStrategies;
- static {
- try {
- ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
- defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
- }
- catch (IOException ex) {
- throw new IllegalStateException("Could not load'DispatcherServlet.properties':" + ex.getMessage());
- }
- }
- /** Detect all HandlerMappings or just expect "handlerMapping" bean? */
- private boolean detectAllHandlerMappings = true;
- /** Detect all HandlerAdapters or just expect "handlerAdapter" bean? */
- private boolean detectAllHandlerAdapters = true;
- /** Detect all HandlerExceptionResolvers or just expect "handlerExceptionResolver" bean? */
- private boolean detectAllHandlerExceptionResolvers = true;
- /** Detect all ViewResolvers or just expect "viewResolver" bean? */
- private boolean detectAllViewResolvers = true;
- /** Throw a NoHandlerFoundException if no Handler was found to process this request? **/
- private boolean throwExceptionIfNoHandlerFound = false;
- /** Perform cleanup of request attributes after include request? */
- private boolean cleanupAfterInclude = true;
- /** MultipartResolver used by this servlet */
- private MultipartResolver multipartResolver;
- /** LocaleResolver used by this servlet */
- private LocaleResolver localeResolver;
- /** ThemeResolver used by this servlet */
- private ThemeResolver themeResolver;
- /** List of HandlerMappings used by this servlet */
- private List<HandlerMapping> handlerMappings;
- /** List of HandlerAdapters used by this servlet */
- private List<HandlerAdapter> handlerAdapters;
- /** List of HandlerExceptionResolvers used by this servlet */
- private List<HandlerExceptionResolver> handlerExceptionResolvers;
- /** RequestToViewNameTranslator used by this servlet */
- private RequestToViewNameTranslator viewNameTranslator;
- private FlashMapManager flashMapManager;
- /** List of ViewResolvers used by this servlet */
- private List<ViewResolver> viewResolvers;
- public DispatcherServlet() {
- super();
- }
- public DispatcherServlet(WebApplicationContext webApplicationContext) {
- super(webApplicationContext);
- }
- @Override
- protected void onRefresh(ApplicationContext context) {
- initStrategies(context);
- }
- protected void initStrategies(ApplicationContext context) {
- initMultipartResolver(context);
- initLocaleResolver(context);
- initThemeResolver(context);
- initHandlerMappings(context);
- initHandlerAdapters(context);
- initHandlerExceptionResolvers(context);
- initRequestToViewNameTranslator(context);
- initViewResolvers(context);
- initFlashMapManager(context);
- }
- }
DispatcherServlet 类中的属性 beans:
1,HandlerMapping:
用于 handlers 映射请求和一系列的对于拦截器的前处理和后处理, 大部分用 @Controller 注解.
HandlerMapping 接口的实现类:
SimpleUrlHandlerMapping 类通过配置文件把 URL 映射到 Controller 类.
DefaultAnnotationHandlerMapping 类通过注解把 URL 映射到 Controller 类.
2,HandlerAdapter:
帮助 DispatcherServlet 处理映射请求处理程序的适配器, 而不用考虑实际调用的是 哪个处理程序.
AnnotationMethodHandlerAdapter: 通过注解, 把请求 URL 映射到 Controller 类的方法上.
3,HandlerExceptionResolver:
处理映射异常.
SimpleMappingExceptionResolver 通过配置文件进行异常处理.
AnnotationMethodHandlerExceptionResolver: 通过注解进行异常处理.
4,ViewResolver:
根据实际配置解析实际的 View 类型.
UrlBasedViewResolver 类 通过配置文件, 把一个视图名交给到一个 View 来处理.
5,LocaleResolver:
解决客户正在使用的区域设置以及可能的时区, 以便能够提供国际化视野.
6,ThemeResolver:
解决 Web 应用程序可以使用的主题, 例如提供个性化布局.
7,MultipartResolver:
解析多部分请求, 以支持从 html 表单上传文件.
8,FlashMapManager:
存储并检索可用于将一个请求属性传递到另一个请求的 input 和 output 的 FlashMap, 通常用于重定向.
来源: http://www.jianshu.com/p/62abd724322e