dispatcherservlet详解

DispatcherServlet浅析 介绍 ​ DispatcherServlet是一个Servlet,在springmvc中被称为前端控制器,根据请求的路径、类型等进行请求的分发。 分析 DispatcherServlet类图 ​ 上图中的红色部分为Servlet接口,在Springmvc中实现并扩展了该Servlet接口。在我最早学javaweb开发时,并不是上来就使用各种MVC框架,而是从编写简单的Servlet开始,就是继承HttpServlet后,重写它的service方法。而Springmvc的设计同理,它也继承... 阅读详情

3.1、DispatcherServlet作用

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 具体请参考第二章的图2-1。

 

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

3、  通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

4、通过ViewResolver解析逻辑视图名到具体视图实现;

5、本地化解析;

6、渲染具体的视图等;

7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

 

从以上我们可以看出DispatcherServlet主要负责流程的控制(而且在流程中的每个关键点都是很容易扩展的)。

 

3.2、DispatcherServlet在web.xml中的配置

Java代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>chapter2</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <load-on-startup>1</load-on-startup>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.     <servlet-name>chapter2</servlet-name>  
  8.     <url-pattern>/</url-pattern>  
  9. </servlet-mapping>  
 

load-on-startup:表示启动容器时初始化该Servlet;

url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。

 

该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。

 

DispatcherServlet也可以配置自己的初始化参数,覆盖默认配置:

摘自Spring Reference

参数

描述

contextClass

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

contextConfigLocation

传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。

namespace

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

 

因此我们可以通过添加初始化参数

 

Java代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>chapter2</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <load-on-startup>1</load-on-startup>  
  5.     <init-param>  
  6.         <param-name>contextConfigLocation</param-name>  
  7.         <param-value>classpath:spring-servlet-config.xml</param-value>  
  8.     </init-param>  
  9. </servlet>  
 

如果使用如上配置,Spring Web MVC框架将加载“classpath:spring-servlet-config.xml”来进行初始化上下文而不是“/WEB-INF/[servlet名字]-servlet.xml”。

3.3、上下文关系

集成Web环境的通用配置:

Java代码  收藏代码
  1. <context-param>  
  2.       <param-name>contextConfigLocation</param-name>  
  3.       <param-value>  
  4.           classpath:spring-common-config.xml,  
  5.           classpath:spring-budget-config.xml  
  6.       </param-value>  
  7. </context-param>  
  8. <listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  9. </listener>  

 

如上配置是Spring集成Web环境的通用配置;一般用于加载除Web层的Bean(如DAO、Service等),以便于与其他任何Web框架集成。

contextConfigLocation:表示用于加载Bean的配置文件;

contextClass:表示用于加载Bean的ApplicationContext实现类,默认WebApplicationContext。

 

 

创建完毕后会将该上下文放在ServletContext:

servletContext.setAttribute(

WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,

this.context);

 

 

ContextLoaderListener初始化的上下文和DispatcherServlet初始化的上下文关系,如图3-1



图3-1

从图中可以看出:

ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;

DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。

3.4、DispatcherServlet初始化顺序

继承体系结构如下所示:




 

1、HttpServletBean继承HttpServlet,因此在Web容器启动时将调用它的init方法,该初始化方法的主要作用

:::将Servlet初始化参数(init-param)设置到该组件上(如contextAttribute、contextClass、namespace、contextConfigLocation),通过BeanWrapper简化设值过程,方便后续使用;

:::提供给子类初始化扩展点,initServletBean(),该方法由FrameworkServlet覆盖。

 

Java代码  收藏代码
  1. public abstract class HttpServletBean extends HttpServlet implements EnvironmentAware{  
  2. @Override  
  3.     public final void init() throws ServletException {  
  4.        //省略部分代码  
  5.        //1、如下代码的作用是将Servlet初始化参数设置到该组件上  
  6. //如contextAttribute、contextClass、namespace、contextConfigLocation;  
  7.        try {  
  8.            PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);  
  9.            BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);  
  10.            ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());  
  11.            bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));  
  12.            initBeanWrapper(bw);  
  13.            bw.setPropertyValues(pvs, true);  
  14.        }  
  15.        catch (BeansException ex) {  
  16.            //…………省略其他代码  
  17.        }  
  18.        //2、提供给子类初始化的扩展点,该方法由FrameworkServlet覆盖  
  19.        initServletBean();  
  20.        if (logger.isDebugEnabled()) {  
  21.            logger.debug("Servlet '" + getServletName() + "' configured successfully");  
  22.        }  
  23.     }  
  24.     //…………省略其他代码  
  25. }  

 

 

2、FrameworkServlet继承HttpServletBean,通过initServletBean()进行Web上下文初始化,该方法主要覆盖一下两件事情:

    初始化web上下文;

    提供给子类初始化扩展点;

Java代码  收藏代码
  1. public abstract class FrameworkServlet extends HttpServletBean {  
  2. @Override  
  3.     protected final void initServletBean() throws ServletException {  
  4.         //省略部分代码  
  5.        try {  
  6.              //1、初始化Web上下文  
  7.            this.webApplicationContext = initWebApplicationContext();  
  8.              //2、提供给子类初始化的扩展点  
  9.            initFrameworkServlet();  
  10.        }  
  11.         //省略部分代码  
  12.     }  
  13. }  

 

Java代码  收藏代码
  1. protected WebApplicationContext initWebApplicationContext() {  
  2.         //ROOT上下文(ContextLoaderListener加载的)  
  3.        WebApplicationContext rootContext =  
  4.               WebApplicationContextUtils.getWebApplicationContext(getServletContext());  
  5.        WebApplicationContext wac = null;  
  6.        if (this.webApplicationContext != null) {  
  7.            // 1、在创建该Servlet注入的上下文  
  8.            wac = this.webApplicationContext;  
  9.            if (wac instanceof ConfigurableWebApplicationContext) {  
  10.               ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;  
  11.               if (!cwac.isActive()) {  
  12.                   if (cwac.getParent() == null) {  
  13.                       cwac.setParent(rootContext);  
  14.                   }  
  15.                   configureAndRefreshWebApplicationContext(cwac);  
  16.               }  
  17.            }  
  18.        }  
  19.        if (wac == null) {  
  20.              //2、查找已经绑定的上下文  
  21.            wac = findWebApplicationContext();  
  22.        }  
  23.        if (wac == null) {  
  24.             //3、如果没有找到相应的上下文,并指定父亲为ContextLoaderListener  
  25.            wac = createWebApplicationContext(rootContext);  
  26.        }  
  27.        if (!this.refreshEventReceived) {  
  28.              //4、刷新上下文(执行一些初始化)  
  29.            onRefresh(wac);  
  30.        }  
  31.        if (this.publishContext) {  
  32.            // Publish the context as a servlet context attribute.  
  33.            String attrName = getServletContextAttributeName();  
  34.            getServletContext().setAttribute(attrName, wac);  
  35.            //省略部分代码  
  36.        }  
  37.        return wac;  
  38.     }  

 

从initWebApplicationContext()方法可以看出,基本上如果ContextLoaderListener加载了上下文将作为根上下文(DispatcherServlet的父容器)。

 

最后调用了onRefresh()方法执行容器的一些初始化,这个方法由子类实现,来进行扩展。

 

 

3、DispatcherServlet继承FrameworkServlet,并实现了onRefresh()方法提供一些前端控制器相关的配置:

 

Java代码  收藏代码
  1. public class DispatcherServlet extends FrameworkServlet {  
  2.      //实现子类的onRefresh()方法,该方法委托为initStrategies()方法。  
  3.     @Override  
  4.     protected void onRefresh(ApplicationContext context) {  
  5.        initStrategies(context);  
  6.     }  
  7.    
  8.     //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)  
  9.     protected void initStrategies(ApplicationContext context) {  
  10.        initMultipartResolver(context);  
  11.        initLocaleResolver(context);  
  12.        initThemeResolver(context);  
  13.        initHandlerMappings(context);  
  14.        initHandlerAdapters(context);  
  15.        initHandlerExceptionResolvers(context);  
  16.        initRequestToViewNameTranslator(context);  
  17.        initViewResolvers(context);  
  18.        initFlashMapManager(context);  
  19.     }  
  20. }  
 

从如上代码可以看出,DispatcherServlet启动时会进行我们需要的Web层Bean的配置,如HandlerMapping、HandlerAdapter等,而且如果我们没有配置,还会给我们提供默认的配置。

 

从如上代码我们可以看出,整个DispatcherServlet初始化的过程和做了些什么事情,具体主要做了如下两件事情:

1、初始化Spring Web MVC使用的Web上下文,并且可能指定父容器为(ContextLoaderListener加载了根上下文);

2、初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等。

基于ROS的室内移动机器人自主导航技术 随着机器人技术的发展,近些年来室内移动机器人的研究热度越来越高。本文主要利用ROS操作系统对室内移动机器人的建图定位与自主导航关键技术进行研究。 ROS是目前开发较为完整具有广阔应用前景的开源机器人操作系统,具有分布式、模块化、代码复用等优良特点。同时ROS还提供了许多开源库,在这些库的基础之上研究同时定位与地图构建和机器人自主导航技术可以节省大量时间。 ORB-SLAM2是比较优秀的视觉SLAM算法之一,它具有计算量比较小、能够实时运行等优点。在介绍ORB-SLAM2的框架之前,首先会介绍视觉SLAM的一 阅读详情

相关推荐

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 484

DispatcherServlet详解

一、DispatcherServlet作用DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 文件上传解析,如果请求类型是multipart将通过Mu

bear_wr的专栏 1万+

DETRs with Collaborative Hybrid Assignments Training论文阅读与代码

在这篇论文中,作者观察到在DETR中将过少的 Query 分配为正样本,采用一对一的集合匹配,会导致对编码器输出的监督稀疏,严重损害编码器的区分特征学习,反之亦然,也会影响解码器中的注意力学习。为了缓解这个问题,作者提出了一种新颖的协同混合分配训练方案,名为Co-DETR,以从多样的标签分配方式中学习更高效、更有效的基于DETR的检测器。这种新的训练方案可以通过训练多个并行辅助 Head ,以一对多的标签分配方式(如ATSS和Faster RCNN)进行监督,轻松增强端到端检测器中编码器的学习能力。

qingjing0413的博客 1156

SpringMVC中DispatcherServlet详解

DispatcherServlet是Spring MVC框架的核心组件之一,它负责请求的接收、处理和响应。DispatcherServlet在整个请求处理过程中扮演着调度者的角色,将请求分发到相应的处理器进行处理,并将处理结果返回给客户端

技术人集结地 5282

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5514

springmvc源码之DispatcherServlet前端控制器

国际化处理AcceptHeaderLocaleResolver 基于URL参数的配置,可以读取url中locale=zh_CN来控制国际化参数CookieLocaleResolver 基于cookie的配置,可以通过浏览器的cookie设置获取Locale对象SessionLocaleResolver 基于session的配置,可以公国检验session的预置的属性来解析,如果没有则会根据请求头中的accept-language来确定主题处理,根据主题控制网页风格。

Lxn2zh的博客 1062

LAN8720芯片硬件设计避坑指南:从晶振选择到PHY地址配置的5个关键细节

本文深入解析LAN8720以太网PHY芯片硬件设计的五个关键细节,涵盖晶振模式选择、PHY地址配置、复位电路设计、电源滤波与接口布线。重点阐述了REF_CLK Out与REF_CLK In两种时钟模式的配置逻辑与应用场景,提供了避免通信失败与信号完整性问题的实战方案,是嵌入式网络硬件开发的实用避坑指南。

i1j2k的博客 516

【spring】DispatcherServlet详解

文章目录1. 概述1.1 DispatcherServlet类相关的结构图2. DispatcherServlet的初始化程序2.1 HttpServletBean 的 init() 方法2.1.1 FrameworkServlet 的 initServletBean() 方法2.1.1.1 DispatcherServlet 的 onRefresh() 方法2.2 initStrategies()2.2.1 initHandlerMappings 方法2.2.2 initHandlerAdapters

m0_45406092的博客 1万+

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1022

STM32 W5500 Freemodbus Modbus TCP协议功能实现

STM32F103VCT6 W5500(SPI1),实现Modbus-TCP协议的功能

坚韧与专注 2万+

Spring DispatcherServlet 详解

DispatcherServlet 是一个 Servlet,它接收所有的 HTTP 请求,并根据请求的信息将其分发给相应的处理器(Handler)进行处理。它是 Spring MVC 架构模式中的关键部分,将请求处理逻辑与实际的业务逻辑解耦,使得代码结构更加清晰和易于维护。

dawn191228的博客 1679

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

|~~~热爱生活、努力学习的小伙汁~~~| 1094

Spring DispatcherServlet详解

作为Spring MVC的核心,负责初始化Spring MVC的各个组件,并协调请求处理流程。它通过和等组件,将请求映射到对应的处理器,调用处理器方法,并渲染视图。理解的工作原理对于深入掌握Spring MVC至关重要。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章【spring】DispatcherServlet详解_spring dispatcherservlet-优快云博客。

ning的博客 1593

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

dispatcherServlet详解

3.1、DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 具体请参考第二章的图2-1。   DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 1、文件上

SU坡馒的博客 494

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Springmvc| DispatcherServlet详解

文章目录3.1、DispatcherServlet作用3.3、上下文关系3.4、DispatcherServlet初始化顺序3.5、DispatcherServlet默认配置3.6、DispatcherServlet中使用的特殊的Bean 3.1、DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而...

YvesHe的专栏 1905

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【SSM】DispatcherServlet详解

功能 SpringMVC的核心就是DispatcherServlet,DispatcherServlet实质也是一个HttpServlet。DispatcherSevlet负责将请求分发,所有的请求都有经过它来统一分发。 大致看下SpringMVC请求处理的流程:  用户向服务器发送请求,请求会到DispatcherServlet,DispatcherServlet 对请求URL进行解析,得到请求资源标识符(URI), 然后根据该URI,调用HandlerMapping获得该Handler(就是控制层)配

weixin_45156425的博客 1546

Spring MVC框架中DispatcherServlet详解

摘要: DispatcherServlet是Spring MVC框架的核心前端控制器,负责接收并分发HTTP请求。其核心职责包括请求分发、组件协调、异常处理和拦截器管理。初始化过程分为加载WebApplicationContext、初始化策略接口(HandlerMapping、ViewResolver等)两个关键阶段。请求处理流程采用doDispatch方法实现,包含处理器查找、拦截器链执行、视图渲染等步骤。框架通过策略模式支持多种处理器映射和视图解析方式,并提供了丰富的扩展点。配置方式支持传统XML和Ja

持续输出Java相关知识 1681

SpringMVC的DispatcherServlet详解

Spring MVC框架,与其他很多web的MVC框架一样:请求驱动;所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet,能做的比这更多。它与Spring IoC容器做到了无缝集成,这意味着,Spring提供的任何特性,在Spring MVC中你都可以使用。 下图展示

DavidChen的博客 1344
上一篇: Java BASE64加密解密
下一篇: springmvc框架开发(一)
github_zwl
博客等级 码龄11年 300粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值