Spring web MVC和其他的web MVC框架一样,由请求驱动,围绕一个中心Servlet来进行设计,中心Servlet负责把请求派发给控制器(Controller),还提供其他的功能方便web应用的开发。Spirng的中心Servlet就是DispatcherServlet,它完全和Spring的Ioc容器集成,可以使用Spring的许多其他功能。

  DispatcherServlet处理请求的流程是:

  熟悉设计模式的人马上就能知道DispatcherServlet使用的是前端控制器模式(其他主流的web框架也是采用这种模式)。

1、DispatcherServlet本身的配置(基于web.xml的配置、基于代码的配置)

  DispatcherServlet其实就是一个Servlet,从HttpServlet基类继承。所以需要在web.xml中进行配置,也是在同一个web.xml里通过URL Mapping来配置你希望由DispatcherServlet来处理的所有请求。如:

<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
</web-app>

  在Servlet3.0+的环境下,也可以在代码里配置DispatcherServlet,如:

public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new
DispatcherServlet());
registration.setLoadOnStartup(1);
registration.addMapping("/example/*");
}
}

  WebApplicationInitializer是Spring MVC提供的一个接口,可以保证基于代码的配置在Servlet 3容器初始化的时候被识别并且使用。这个接口的一个抽象实现类是AbstractDispatcherServletInitializer,使用这个类可以更简单的对DispatcherServlet进行配置。

  以上只是设置spring mvc的第一步。现在需要配置供spring mvc框架使用的bean(除了DispatcherServlet本身之外的bean)。

2、配置DispatcherServlet使用的bean(如:controller,view resolver,locale resolver,other web-related bean)。

  在DispatcherServlet初始化的时候,SpringMVC会到你的web应用的web-inf文件夹下寻找一个命名为[servlet-name]-servlet.xml的文件,创建在该文件中定义的bean。这些bean保存在DispatcherServlet自己的应用上下文中(WebApplicationContext)。在SpringMVC中,每个DispatcherServlet都有自己的应用上下文,称为子应用上下文。如果存在一个根应用上下文的话(也叫父应用上下文),子应用上下文中的bean可以访问根应用上下文中的bean,而父应用上下文不能访问子应用上下文中的bean。如果子上下文中存在和父上下文中相同定义的bean,那么子上下文中的bean会覆盖父上下文中的bean。

  DispatcherServlet使用一些特殊的bean来处理请求和渲染视图。这些特殊的bean是SpringMVC的一部分,你可以通过简单地在WebApplicationContext中配置来选择你要使用的bean。不过配置并不是必须的,因为你如果不配置的话,SpringMVC也会提供一系列默认的bean来使用。这些特殊的bean有:

  HandlerMapping  --

  HandlerAdapter --

  HandlerExceptionResolver--

  ViewResolver--

  LocaleResolver & LocaleContextResolver--

  ThemeResolver--

  MultipartResolver--

  FlashMapManager--

  对应每一个特殊的bean,SpringMVC提供了一组默认的实现,具体使用的是哪个默认的实现,这些信息保存在文件DispatcherServlet.properties中,这个文件在包org.springframework.web.servlet下。

  肯定迟早会有些时候,你希望对这些默认的bean的某些属性进行自定义,如设置InternalResourceViewResolver的prefix属性为你的视图文件的文件夹路径。

  这里要记住的是,你一旦配置了某个特殊的bean,那么这个bean的所有默认实现就失效了。比如你配置了InternalResourceViewResolver,那么ViewResolver的默认实现列表就被忽略了。

3、DispatcherServlet处理请求的顺序

  当配置好一个DispatcherServlet时,一个请求(request)进来了,需要DispatcherServlet来处理,DispatcherServlet将按以下顺序来处理:

  (1)DispatcherServlet寻找它自身的上下文WebApplicationContext,把找到的上下文作为一个属性绑定了request上,这样控制器或者在这个过程中的其他元素就可以使用这个上下文信息。绑定到request上时使用的默认的键是:DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE.

  (2)一个本地化解析器(LocaleResolver)被绑定到request上,这样其他的元素就可以使用这个解析器来解析本地化信息并使用(如渲染视图等),如果不需要本地化,就不需要这个解析器。

  (3)一个主题解析器(ThemeResolver)被绑定到request上,这样其他的元素(比如:视图)就可以使用这个解析器来决定使用哪个主题,如果没有主题,可以忽略。

  (4)如果指定了一个多部件解析器,那么就会对请求检查多部件,如果找到,该请求就会被封装到一个MultipartHttpServletRequest中,然后把它交给后续的过程进行处理。

  (5)寻找合适的处理器Handler,如果处理器找到了,那么处理器相关的执行链(包括预处理器preprocessor,后处理器postprocessor,控制器controller)就会被执行,从而准备一个模型或者表现。

  (6)如果模型被返回,那么对视图进行渲染。如果没有模型返回(由于预处理器或者后处理器的拦截,或者安全原因),就没有视图被渲染。因为请求已经全部处理完了。

  HandlerExceptionResolver用来捕获和解析在处理请求过程中的异常。

4、DispatcherServlet的初始化配置参数

  DispatcherServlet提供了以下几个初始化的配置参数。

  contextClass   --实现了WebApplicationContext的类,默认为XmlWebApplicationContext

  contextConfigLocation  --上下文配置路径,可以是多个路径用逗号分隔,如果存在相同的bean,那么后面文件中定义的优先于前面的。

  namespace   --WebApplication的命名空间,默认为:[servlet-name]-servlet

转载于:https://www.cnblogs.com/winson/p/3658941.html

Spring Framework--SpringMVC(1)--DispatcherServlet相关推荐

  1. 模仿SpringMVC的DispatcherServlet 手撸300行代码提炼精华设计思想并保证功能可用(1.0版本)

    前言 1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 3.内容为手写SpringMVC的DistapcherServlet的核心功能,从V1版本到V2版本再到 ...

  2. SSM(MyBatis、Spring、SpringMVC)

    声明:本文是我学习B站"狂神说java"所做的笔记,上传至此只是为了方便,要想学习,请去关注这个宝藏男孩吧 Mybatis 1.简介 (MyBatis中文文档:https://my ...

  3. 【Spring】Spring Framework Reference Documentation中文版18

    Part VI. The Web This part of the reference documentation covers Spring Framework's support for the ...

  4. spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包

    下载spring http://spring.io/ 最重要是在特征下面的这段话,需要注意: All avaible features and modules are described in the ...

  5. Spring Framework 5.3.6、5.2.14 发布

    一个月前,小编刚给大家介绍过Spring Framework 5.3.5 的发布(紧随Java 16,Spring Framework 5.3.5 发布:涵盖JDK 16的支持!) 这才过来不到一个月 ...

  6. Spring、SpringMVC、SpringBoot、SpringCloud的联系和区别

    一. 上一篇文章刚刚简单介绍了spring框架,下面我将介绍一下Spring,SpringMVC,SpringBoot,SpringCloud的联系和区别. 首先先简单介绍一下各个框架. Spring ...

  7. 【Java Web开发指南】深入浅出Spring和SpringMVC

    文章目录 1 spring 2 springmvc 3 AOP与IOC 1 spring spring是一个一站式的框架,提供了表现层(springmvc)到业务层(spring)再到数据层(spri ...

  8. 框架:spring、springmvc、springboot

    先来说说spring.springmvc.springboot的关系. spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架 ...

  9. 史上最详细的SSM框架整合(Spring、SpringMVC、Mybatis)

    毫无疑问我们肯定是使用Spring去整合SpringMVC和Mybatis,在整合过程中我们首先要让各自的模块实现,然后再去使用Spring整合:比如我先实现Mybatis框架的配置,然后再通过测试看 ...

  10. 适配器模式源码解析(jdk+spring+springjpa+springmvc)

    在JDK里的一些应用,我们打开一个类,XmlAdapter,我们看一下这个名字就可以很充分的说明他是一个Adapter,那这个类是JAXB包下的,public abstract class XmlAd ...

最新文章

  1. VIM7.3添加中文帮助文档
  2. idea springmvc_手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
  3. python多项式运算_python – 用于计算“多项式系数”的numpy / scipy函数
  4. 你不知道的windows7 技巧大全【3】
  5. 云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇
  6. 为什么你总成为不了架构师?
  7. 如果人民币贬值,对股市会有什么影响?
  8. 青蛙跳台阶的问题——Fibonacci
  9. AS开发者转LAYA一周心得
  10. 【数据结构笔记25】判断Code[]是否为Huffman Codes,或是否为WPL最小编码
  11. 关闭ie烦人的提示信息
  12. 直方图均衡图像对比度(histogram equalization)PYTHON+OPENCV2
  13. python键值对是什么意思_python键值对
  14. Android project not found. Are you sure this is a React Native project?
  15. lookup无序查找_Excel LOOKUP不排序怎么快速找到数据_lookup函数讲解
  16. 项目管理计划Office Project 2013 日常使用
  17. Arduino ESP32 获取网络时间并同步本地RTC时钟
  18. 心经即摩诃般若波罗蜜多心经
  19. 云之梦php免费教学视频下载_云知梦php基础+php进阶+mysql+linux+laravel全栈工程师【百度网盘】...
  20. UVA - 11400 Lighting System Design(照明系统设计)(dp)

热门文章

  1. 非对称卷积—Asymmetric Convolutions
  2. CNCC2017中的深度学习与跨媒体智能
  3. 深度学习(十五)基于级联卷积神经网络的人脸特征点定位
  4. 镶嵌至新栅格ArcGIS出现send to mail闪退情况的解决方法
  5. 归档-软考网规-存储部分-san-nas-das
  6. python计算复制比_vbs实现只复制比目标文件更新的文件
  7. java oop入门_java入门(十六) | OOP(三)之构造方法
  8. VINS简化版本 梳理
  9. JQuery实现——黑客帝国代码雨效果
  10. Nodejs开发框架Express3.0开发手记–从零开始