SpringMVC是一种基于请求启动的WEB框架,并且使用了前端控制器的设计模式,所有满足【WEB-INF/web.xml】文件中的【url-pattern】的匹配条件的请求,这些满足的请求都会交给这个前端控制器。而这个前端控制器就是【DispatcherServlet,然后再由这个前端控制器转交给满足URL匹配的页面控制器,这个前端控制器就是提供一个统一的访问点。

概念:

  • DispatcherServlet(前端控制器)
  • HandleMapping(控制器映射器)
  • HandleExecutionChain(处理器执行链,包括若干拦截器和一个处理器)
  • HandleAdapter(处理器映射器)
  • Handle(处理器)
  • Model(模型数据)
  • View(视图)
  • ModelAndView(包括Model和View)
  • ViewResolver(视图解析器)

一、SpringMVC的一个请求的流程图:

 步骤:

  • 用户发起请求到DispatcherServlet
  • DispatcherServlet通过HandleMapping根据url查找Handle,最终返回给DispatcherServlet一个HandleExecutionChain
  • DispatcherServlet通过HandleAdapter执行Handle,最终返回给DispatcherServlet一个ModelAndView
  • DispatcherServlet通过ViewResolver进行视图解析,最终返回给DispatcherServlet一个View
  • DispatcherServlet进行视图渲染,将模型数据填充到request域
  • DispatcherServlet返回响应结果

二、DispatcherServlet的功能:

  • DispatcherServlet通过HandlerMapping,将请求映射到一个页面处理器上(返回一个HandlerExecutionChain,它包括多个HandlerInterceptor连接器,和一个Handler处理器)
  • DispatcherServlet通过HandlerAdapter支持多种类型的处理器(例如:SimpleControllerHandlerAdapter,   AnnotationMethodHandlerAdapter等等)
  • 通过ViewResolver解析逻辑视图名到具体的视图名
  • 渲染具体的视图
  • 在执行过程中,如果遇到异常HandlerExceptionResolver处理
  • 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析。

三、DispatcherServlet在web.xml文件中的配置参数

    <servlet>
<!--servlet的一个名称-->
<servlet-name>do</servlet-name>
<!--Dispatcherservlet所在的类路径-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--下面可以不写,他有一个默认的contextConfigLocation配置,默认的param-value是<servlet-name>的值-servlet.xml文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/do-servlet.xml</param-value>
</init-param>
<!--在服务器启东时,初始化改servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>do</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

这个servlet就是设置DispatcherServlet的。

  • load-on-startup就是在启动服务器的时候,初始化该servlet
  • init-param就是这个DispatcherServlet的属性值,可以自己配置初始化参数,这样就会把默认的参数值覆盖掉:其中param-name就是属性名,而param-value就是对应的属性值

主要参数有:

参数

描述

contextClass

实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。如果这个参数没有指定, 默认使用XmlWebApplicationContext。

contextConfigLocation

传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。他有一个默认值:servlet的name-servlet.xml的配置文件,如果设置的话,就会覆盖默认值

namespace

WebApplicationContext命名空间。默认值是[server-name]-servlet。

四、上下文的关系:

集成WEB环境的通用配置,在web.xml文件中设置:

    <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
<!--默认值是:applicationContext.xml-->
</context-param> <!--作用就是在启动web服务器时,自动装配ApplicationContext的配置信息-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

如上设置是Spring集成WEB框架的通用配置,一般用于加载除了WEB层的Bean,例如(DataSource,dao,service等等)的Bean以便于与其他任何WEB框架的集成

  • contextConfigLocation,用于设置Spring的配置文件。有一个默认值,是applicationContext.xml。
  • contextClass:用于设置加载Bean的ApplicationContext的实现类,默认值是WebApplicationContext。
  • listener监听器,就是在服务器启动时,自动装配applicationContext的配置信息。

五、ContextLoaderListener初始化的上下文和DispatcherServlet初始化的上下文的关系:

从图中可以看出:

  • ContextLoadListener配置的上下文加载的Bean是对整个应用程序所共享,不管使用什么表现层技术,一般如dao,service,dataSource等等。
  • DispatcherServlet配置的上下文加载的Bean只能是Spring-WEB-MVC有效的Bean,例如controller,handlerMapping,handlerAdapter等等。

六、初始化默认的上下文参数:

在DispatcherServlet中的initStrategies方法中,初始化使用的策略:

    public class DispatcherServlet extends FrameworkServlet {
//实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
} //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
……
}

DispatcherServlet在启动时,会进行我们在Spring-MVC的中设置了init-param的属性值配置,就是用指定的属性值,如果没有设置就是用默认的属性。

默认的属性值在:Spring-webmvcjar包下的org.springframework.web.servlet.DispatcherServlet.properties中配置。例如:

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

如上的Bean配置,会在DispatcherServlet启动时,会自动配置这些特殊的Bean,如果我们设置就不会自动装配对应的Bean,而是会加载你在xml文件中设置的bean

七、DispatcherServlet的特殊的Bean:

  • controller:就是页面控制器,可以使用@controller注解方式,可以实现Controller接口的方式。
  • HandlerMapping:就是请求处理器的映射。默认值就是【上面代码的第3条】,可以通过注解,Bean的name值等等。
  • HandlerAdapter:HandlerAdapter会将处理器包装成适配器。默认值就是【上面代码的第4条】.例如:如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,执行处理器的handleRequest方法进行功能。
  • ViewResolver:用于将逻辑视图名传话为集体的视图名。默认值就是【上面代码的倒数第2条】。需要设置他的前缀,和后缀等信息。
  • LocalResover:用于本地序列化,支持国际化。
  • ThemeResovler:主题解析。
  • MultipartResolver:文件上传解析,用于支持文件上传。
  • HandlerExceptionResolver:处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面。
  • RequestToViewNameTranslator:当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名。

---------------------
作者:cw_hello1
来源:CSDN
原文:https://blog.csdn.net/cw_hello1/article/details/51325122
版权声明:本文为博主原创文章,转载请附上博文链接!

SpringMVC之DispatcherServlet详解的更多相关文章

  1. SpringMvc测试框架详解----服务端测试

    随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用sp ...

  2. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

  3. SpringMVC 常用注解 详解

    SpringMVC 常用注解 详解 SpringMVC 常用注解 1.@RequestMapping                                      路径映射 2.@Requ ...

  4. springMVC的注解详解

    springmvc常用注解标签详解 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业 ...

  5. SpringMVC异常处理机制详解[附带源码分析]

    目录 前言 重要接口和类介绍 HandlerExceptionResolver接口 AbstractHandlerExceptionResolver抽象类 AbstractHandlerMethodE ...

  6. springmvc常用注解详解

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  7. springMVC(1)---@RequestMapping详解

    @RequestMapping详解 RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.这句话,太熟悉了.   ...

  8. SpringMVC @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 http://blog.csdn.net/walkerjong/article/details/7994326

  9. SpringMVC学习总结(二)——DispatcherServlet详解

    摘要: DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring ...

随机推荐

  1. 重绘DataGridView标头

    最近突然想在DataGridView标头放置一个CheckBox,我就想着重写下DataGridViewColumnHeaderCell抱着试试的心态结果真的是可以的下面是源码:(如果有看不懂的可以加 ...

  2. (转)分布式文件存储FastDFS(六)FastDFS多节点配置

    http://blog.csdn.net/xingjiarong/article/details/50759918 前面几篇关于FastDFS的博客中介绍了如何在一台机器上搭建一个简易的FastDFS ...

  3. HDU_1028_Ignatius and the Princess III_(母函数,dp)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  4. iOS 9 中可用的受信任根证书列表

    iOS 受信任证书存储区包含随 iOS 预安装的可信根证书.  https://support.apple.com/zh-cn/HT205205 关于信任和证书 iOS 9 受信任证书存储区包含三类证 ...

  5. .net 程序集加载,版本不匹配的解决方法

    经常有些时候,A.dll引用的是Microsoft.EntityFrameworkCore.dll version=1.0.0.0 publicKeyToken="adb9793829dda ...

  6. Linux添加FTP用户并设置权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户,命令行状态下,在root用户下: 运 ...

  7. 最快的 Python Web 框架入门

    速度比较 框架 实现基础 每秒请求数 平均时间 Sanic Python 3.5 + uvloop 30,601 3.23ms Wheezy gunicorn + meinheld 20,244 4. ...

  8. JavaScript基本知识----操作符,流程控制,循环,字符串方法,数组方式,补充方法

    操作符 算术运算 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. 洛谷 1373 dp 小a和uim之大逃离 良心题解

    洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...

  10. [tsA1490][2013中国国家集训队第二次作业]osu![概率dp+线段树+矩阵乘法]

    这样的题解只能舔题解了,,,qaq 清橙资料里有.. #include <iostream> #include <cstdio> #include <cstdlib> ...