Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言。 应该由Spring MVC处理的每个Web请求都通过DispatcherServlet处理。 通常,它是Front Controller Pattern的实现,可在您的应用程序中提供单个入口点。 它处理所有传入的请求。 它也是Java与Spring和DispatcherServlet之间的桥梁,就像其他任何Servlet在web.xml中声明的那样,其URL模式足以将每个单个Web请求映射到DispathcherServlert。

它负责通过将请求委派给Spring MVC的其他组件(例如,实际的控制器类,即使用@Controller或@RestController (对于RESTful Web Services进行注释),Views,View Resolvers,处理程序映射器等注释的那些)来负责请求处理。

尽管实际请求映射的工作是通过@RequestMapping注释完成的,但实际上是DispatcherServlet将请求委托给相应的控制器。

对于RESTful Web服务,它还负责查找正确的消息转换器,以将响应转换为客户端期望的格式,例如JSON,XML或TEXT。 例如,如果客户端需要JSON,则它将使用MappingJacksonHttpMessageConverter或MappingJackson2HttpMessageConverter(取决于Classpath中的Jackson 1或Jackson 2是否可用)将转换返回的响应转换为JSON字符串。 请参阅Baeldung的REST with Spring,以了解有关使用Spring 3和Spring 4开发RESTful Web服务的更多信息。

如前所述,Dispatcher Servlet用于处理所有传入的请求,并将它们路由到不同的Spring Controller进行进一步处理。 为此,它确定哪些控制器应处理传入的请求。

DispatcherServlet使用HandlerMapping实现(预先构建或作为应用程序的一部分提供)将传入的请求路由到处理程序对象。 默认情况下,它使用
BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping,使用@RequestMapping注释驱动。

为了找到正确的方法来处理请求,它将扫描使用声明的所有类。
@Controller注释,它也使用
@RequestMapping批注可查找负责处理请求的类型和方法。 @RequestMapping注释可以按路径映射请求,例如 @RequestMapping(“ path”),通过HTTP方法,例如 @RequestMapping(“ path”,method = RequestMethod.GET),通过请求参数,例如 @RequestMapping(“ path””,method = RequestMethod.POST,params =“ param1”)并通过HTTP请求标头的存在例如

@RequestMapping(“路径”,标头=“ content-type = text / *”)。 您还可以在类级别应用@RequestMapping批注以过滤传入的请求。

处理完请求后,控制器将逻辑视图名称和模型返回给DispatcherServlet。 然后,它咨询视图解析器以查找实际的View来呈现输出。 可以使用ViewResolver实现来指定视图解析策略,默认情况下,DispatcherServlet使用
InternalResourceViewResolver,用于将逻辑视图名称转换为实际的View对象,例如JSP。

此后,DispatcherServlet与选定的视图联系,例如具有模型数据的JSP文件,并根据模型数据呈现输出。 该渲染的输出作为响应返回给客户端。 有时甚至不需要视图,例如在RESTful Web服务的情况下。

他们的处理程序方法使用@ResponseBody批注直接写入响应,而DispatcherServlet直接将响应返回给客户端。 请参阅REST with Spring课程,以了解有关使用Spring MVC开发和测试RESTful Web服务的更多信息。


在本文中,我将分享Java Web开发人员应该了解的有关DispatcherServlet的一些有用和必要的知识。 这些要点不仅可以帮助您更好地理解Spring MVC中DispatcherServlet的工作,还可以鼓励您通过探索和研究每个点来学习更多有关它们的知识。

1)DispatcherServlet是Spring MVC Application的主控制器。 所有传入的Web请求在通过各个Spring控制器(即使用@Controller注释进行注释的类)处理之前,都将通过DispatcherServlet传递。

2)Spring MVC的DispatcherServlet是前端控制器模式的实现(请参阅Spring MVC 4简介 )。 前端控制器不过是处理网站所有请求的控制器。 它们通常在Web应用程序中用于实现工作流。

3)与其他任何Servlet一样,Spring MVC框架的DispatcherServlet也在web.xml文件中声明和配置,如下所示:

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

4)DispatcherServlet是一个实际的Servlet,它继承自HttpServlet基类。 像Tomcat这样的Servlet引擎会创建此类的实例,并调用它的各种生命周期方法,例如init(),service()和destroy()。

5)DispatcherServlet为您的Spring MVC Web应用程序提供了一个入口点。 如前所述,它处理所有传入的请求。 有关Spring内部工作的更多详细信息,请参见Spring MVC在内部如何工作。

6)Spring的DispatcherServlet也与Spring IoC容器完全集成,因此可以使用Spring框架的所有功能,例如依赖注入。

7)调度程序servlet被配置为load-on-startup = 1,这意味着该Servlet应该在部署应用程序时由Servlet容器创建,而不是在请求到达此请求时创建。 这样做是为了减少第一个请求的响应时间,因为DispatcherServlet在启动时做了很多工作来扫描和查找所有控制器和请求映射。 请参阅Kevin Jones的Java Web基础知识,以了解有关启动时加载和其他servlet基础的更多信息。

8)在DispatcherServlet初始化期间,Spring MVC框架将在Web应用程序的WEB-INF目录中查找名为[servlet-name] -servlet.xml的文件,并在其中创建定义的bean,例如,如果servlet名称为“ SpringMVC”如上面的web.xml配置所示,它将查找名为SpringMVC-Servlet.xml的文件。 它还覆盖了在全局范围内用相同名称定义的任何bean的定义。 您可以使用contextConfigLocation servlet初始化参数来更改此配置文件的确切位置。

9)在Spring MVC框架中,每个DispatcherServlet都有自己的WebApplicationContext(请参见Spring in Action ),该继承了在根WebApplicationContext中已经定义的所有bean。 这些继承的bean可以在servlet特定的作用域中被覆盖,并且可以在给定servlet实例的本地定义新的scope特定的bean。

10)Spring MVC框架的DispatcherServlet也可以返回Servlet API指定的last-modification-date。 它通过查找适当的处理程序映射来确定最后修改日期,并测试找到的处理程序是否实现了LastModified接口。 如果是,则调用LastModified接口的getLastModified(request)方法,并将值返回给客户端。

这就是Spring MVC框架的DispatcherServlet的全部内容。 就像我说的那样,DispatcherServlet是Spring MVC的主干,并充当将不同的HTTP请求路由到相应的Spring Controller的主控制器。 它是Front Controller设计模式的一种实现,并为Spring Web应用程序提供了一个入口。 您可以在web.xml中配置DispatcherServlet,但是将其分配为“启动时加载”值1,以建议容器在启动时而不是在请求出现时加载该Servlet。 这减少了第一个请求的响应时间。

进阶学习

  • Spring MVC 4简介
  • Baeldung的Spring REST
  • Spring基本原理作者:布莱恩·哈森(Bryan Hassen)

您可能想探索的其他与Spring相关的文章

  • Spring MVC中@RestControler和@Controller之间的区别? ( 回答 )
  • 2至3年的23个Spring MVC面试问题经验( 列表 )
  • Spring MVC中DispatcherServlet的用途是什么? ( 回答 )
  • 如何在Java应用程序中启用Spring安全性? ( 回答 )
  • Spring认证对工作和职业有帮助吗? ( 文章 )
  • 前五名Spring认证模拟考试( 列表 )
  • Pluralsight的Spring基础知识( 请参阅 )
  • Spring中@Autowired和@Injection批注之间的区别? ( 回答 )
  • 5个Java开发人员的Spring和Hibernate在线课程( 列表 )

感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何疑问,建议或反馈,或者您对DispatcherServlert有任何要点,但这里没有提及,但是值得您了解,请发表评论,我将其包含在主要文章中。

翻译自: https://www.javacodegeeks.com/2017/09/dispatcherservlet-spring-mvc-10-things-java-developer-know.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

运行时区域1.程序计数器程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里&#xff08;概念模型&#xff0c;各种虚拟机可能会通过一些更高效的方式实现&#…

极域课堂管理系统软件如何取消控制_微缔电子组装业MES系统软件六大功能组成...

电子组装业MES系统软件六大功能组成MES系统软件是制造执行系统的英文简称&#xff0c;MES系统软件在整个企业信息集成系统中承上启下&#xff0c;是生产活动与管理活动信息沟通的桥梁&#xff0c;MES系统软件在产品从工单下发到生产成成品的整个过程中&#xff0c;扮演着促进生…

多个cuda 被单进程沾满_报名 | 提高GPU利用率,听英伟达专家分享这个CUDA工具

随着 NVIDIA GPU 计算性能的不断提升&#xff0c;如何提升 GPU 利用率是开发者普遍关心的问题之一。从 Kepler 架构开始&#xff0c;NVIDIA GPU 支持多个 CUDA kernels 函数的并发执行&#xff0c;称为 Hyper-Q 技术。Hyper-Q 技术支持多个 CUDA streams、多个 CPU threads 或者…

usb转ttl模块与matlab,USB接口转TTL小板的自检测试

现在电脑基本上都不会配置DB9串行数据端口了&#xff0c;这给一些喜欢折腾刷机和单片机加载程序的朋友带来了诸多的不便。还好&#xff0c;随着技术的发展&#xff0c;USB接口转TTL的产品越来越成熟&#xff0c;而这种产品主要以采用PL-2303HX芯片作为主控器的居多&#xff0c;…

matlab 误差椭圆,求3倍标准差误差椭圆分析的程序

根据《白话空间统计之九&#xff1a;方向分布(标准差椭圆)修正版》(有些地方没有理解清楚)&#xff0c;写了下面的程序。但是好像结果不对Zmvnrnd([0.5 1.5], [0.025 0.03 ; 0.03 0.16], 50);XZ(:,1); YZ(:,2);mean_Xnanmean(X); mean_Ynanmean(Y); %椭圆圆心%确定长短半轴…

java ee cdi_Java EE CDI处理程序方法示例

java ee cdi这是CDI Disposer方法的教程。 在CDI中&#xff0c;由于Producer方法生成的对象随后可以注入到应用程序中&#xff0c;因此使用Disposer方法&#xff0c;以便在其工作完成时将其删除。 Disposer方法始终与Producer方法匹配。 Disposer方法使用的一个示例是当应用程…

python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

因为是示例为主&#xff0c;我们将方程组限制在二元一次方程组&#xff1a;x,y两个变量&#xff0c;两个方程。类似这样&#xff1a;每个方程有两个变量&#xff0c;x和y&#xff0c;形式为&#xff1a;axbycd由于这次有了两个方程&#xff0c;我们提取参数的代码就适合提炼为一…

快速提示:使用Chrome开发工具调试GWT应用程序

调试是软件开发的重要方面。 拥有正确的工具可以节省大量时间和头痛。 在GWT Super Dev模式之前&#xff0c;经典的Dev模式允许使用JVM调试。 开发人员可以在其IDE中设置断点&#xff0c;并使用调试模式来跟踪错误和错误。 现在&#xff0c;在超级开发模式下&#xff0c;情况有…

用matlab做纹理合成,关于图像纹理合成的Matlab例程

纹理是普遍存在的视觉现象&#xff0c;其可以描述地形、植物、矿石、纤维和皮肤等等物体的表面特征。纹理结构在图像中反映其图像像素取值的空间变化情况&#xff0c;这种变化具有某中统计规律&#xff0c;在纹理区域内的各部分具有大致相同的结构。纹理合成是利用计算机产生纹…

matlab评估边缘检测性能,【模糊推理】模糊逻辑图像边缘检测,原理+matlab代码~...

这篇博客是接着上一篇来哒&#xff0c;https://blog.csdn.net/luolan9611/article/details/94285158本篇博客及上篇博客搜集的资料、实验代码、实验报告、PPT均已上传至百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1AmT4TtBAxj1FKf4KUFcsBw 提取码&#x…

qt中实现左右分割线_Qt项目中,实现屏幕截图并生成gif的详细示例(值得细读)...

总第50篇平时我们在工作和学习的过程中&#xff0c;有时需要将桌面的某些动作截图生成gif动图&#xff0c;以更生动地呈现出来。目前有很多这样的软件&#xff0c;并且方便易使用&#xff0c;比如我经常使用的GifCam&#xff0c;软件小巧&#xff0c;生成的图片文件也比较小&am…

构建Spring Boot RESTful服务+ Spring Boot执行器

总览 什么是REST&#xff1f; REST&#xff08;代表状态转移&#xff09;是Web构建的体系结构样式&#xff0c;已成为用于Web应用程序的标准软件设计模式 。 代表性国家转移一词最早由REST的发起人&#xff0c;HTTP规范的主要作者之一Roy Fielding在其博士论文中使用 。 REST上…

tf调不到keras怎么 回事_格力变频空调快速维修方法及技巧 空调压缩机不到一分钟就停,怎么回事?...

格力变频空调快速维修方法及技巧一、 室内部分&#xff1a; 1、F1开路&#xff1a;制冷时不启动或启动一下就停机&#xff1b;制热正常&#xff0c;且一直高频运转。 2、F2开路&#xff1a;工作6—10分钟就停机&#xff0c;显示E2停止外机。 3、F2短路&#xff1…

php自动释放mysql连接,php怎么关闭mysql连接

php怎么关闭mysql连接2021-03-17 07:45:43php中可使用mysqli_close()函数来关闭mysql连接&#xff0c;语法格式“mysqli_close(connection);”。mysqli_close()函数可关闭先前打开的数据库连接&#xff0c;如果成功返回TRUE&#xff0c;反之则返回FALSE。本教程操作环境&#x…

Java 8 –按值对HashMap进行升序和降序排序

在上一篇文章中&#xff0c;我向您展示了如何通过键对Java 8中的Map进行排序 &#xff0c;今天&#xff0c;我将教您如何使用Java 8功能&#xff08;例如&#xff0c;lambda表达式&#xff0c;方法引用&#xff0c;流和新方法&#xff09; 按值对Map进行排序。添加到java.util.…

scrcpy投屏_scrcpy 使用教程:将安卓设备投屏到 PC 端

阿拉平平读完需要6分钟速读仅需 2 分钟scrcpy 是一款开源的安卓设备投屏工具&#xff0c;通过 USB 或 Wi-Fi 与设备连接后就可以在 PC 端操作安卓设备&#xff0c;无需 root 权限且支持多平台运行。本文将演示如何使用 scrcpy 进行投屏操作。1. 下载安装到 Releases 下载最新的…

打砖块小游戏php程序,利用原生js实现html5打砖块小游戏(代码示例)

本篇文章给大家通过代码示例介绍一下利用原生js实现html5打砖块小游戏的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。前言PS&#xff1a;本次项目中使用了大量 es6 语法&#xff0c;故对于 es6 语法不太熟悉的小伙伴最好能先了…

si9000阻抗匹配计算_如何在设计之初计算出两层PCB板差分线的阻抗,线宽,间距...

最近在设计一款两层板PCB。板上一些高速信号线&#xff0c;分别是MIMP接口的差分线和USB2.0的差分线。既然是高速线&#xff0c;那么就需要设计成阻抗匹配走线。MIMP差分线需要做100ohm匹配&#xff0c;USB线需要做90ohm匹配。差分线阻抗的计算主要跟线宽&#xff0c;间距&…

jax-ws cxf_Apache CXF – JAX-WS –简单教程

jax-ws cxf许多Java开发人员都认为Web Service实现的任务艰巨-好吧&#xff0c;没有人能真正责怪他们&#xff0c;尤其是在企业应用程序开发的多年中&#xff0c;这给开发和设计带来了很多复杂性。 对于某些人来说&#xff0c;了解它是构建完整的企业应用程序的下一步-Web服务-…

写屏障是什么_面试官为什么问内存模型总离不开final关键字,该如何应对?

Java 语言的每个关键字都设计的很巧妙&#xff0c;金雕玉琢&#xff0c;只有深度钻研其中&#xff0c;才知其中懊悔&#xff0c;本文带领大家一起深入理解 Java 内存模型之 final。加我微信好友的不要着急&#xff0c;手机没电了&#xff0c;等我借个充电器之后&#xff0c;再一…