如果您使用过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

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

  1. 关于 JShell,开发人员需要知道的10件事情

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | Queena 来源 | 公众号「锅外的大佬」 Jshell 作为 Kulla 项目 ...

  2. Java开发人员应该知道的5大Spring Boot功能

    您可能已经听说过Spring Boot,这是用不到140个字符创建一个Spring Web应用程序的神奇力量,可以在一条推文中编写这些字符,但这到底意味着什么? 哪些功能可以使Spring Boot具 ...

  3. C#开发人员应该知道的13件事情

    C#开发人员应该知道的13件事情 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问 ...

  4. C# Development 13 Things Every C# Developer Should Know--C#开发人员应该知道的13件事情

    原文链接:https://dzone.com/refcardz/csharp 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方 ...

  5. Java开发人员应该知道的前20个库和API

    优秀且经验丰富的Java开发人员的特征之一是对API的广泛了解,包括JDK和第三方库. 我花了很多时间来学习API,尤其是在阅读了Effective Java 3rd Edition之后 ,Joshu ...

  6. Java开发人员应该知道的7种新工具

    通过快速浏览一些最新的创新工具,随时准备锁定和加载. 万一您错过了它,RebelLabs最近发布了Java工具和技术前景的全球调查结果 . 除了著名的工具和成熟的工具外,市场还涌现出鲜有人知的新鲜工具 ...

  7. Java开发人员应该知道的三件事

    对于那些长期关注JavaOne 2012会议的读者来说,这是一篇有趣的文章. 我最近对Java冠军Heinz Kabutz的采访引起了我的注意: 包括他的Java内存难题程序,从Java内存管理的角度 ...

  8. 忘记番石榴:5个Google库Java开发人员应该知道的

    什么是最有用但未知的Google Java库? 如果我们在激烈的黑客马拉松中阻止某人并要求她命名一个受欢迎的Google Java库,那么答案可能就是Guava. 这也就不足为奇了,因为它的主要重点是 ...

  9. Java开发人员应该知道的5种错误跟踪工具

    随着Java生态系统的不断发展,可满足不断增长的请求和用户对高性能需求的Web应用程序成为了新型的现代开发工具. 具有快速新部署的快速节奏环境需要跟踪错误并获得应用程序行为的洞察力,而传统方法无法维持 ...

最新文章

  1. 如何将重复的数据标红_python如何处理重复值数据?
  2. Gartner 2022年新兴技术和趋势影响力雷达图中五项具有影响力的技术
  3. 设计模式之---Factory
  4. php 模拟并发请求_PHP接口并发测试的方法
  5. mysql四种事务隔离级别
  6. 和最大子序列(dp)
  7. 递归法----整数划分问题
  8. ajax只请求一次,关于ajax的请求只处理一次的问题
  9. 微信小程序云开发教程-互联网软件的运作模式
  10. 基于python的简易局域网聊天工具
  11. 简单的摄像头自写驱动程序总结
  12. Siebel系统中配置LDAP认证
  13. python 一元二次方程计算器
  14. 华为笔试题库之较难--难度
  15. 读小说赚钱吗?这个年入百万
  16. Android实现远程控制PC(Android[客户端]+Qt[服务器端])
  17. 如何编辑扫描的PDF文件?
  18. 4K 显示器突然变模糊了怎么调回来
  19. 网页不能自动播放视频、音频的解决方案
  20. android app 清理缓存图片,支付宝APP怎么清理缓存 支付宝安卓版缓存清理方法

热门文章

  1. Java AIO 编程
  2. Java中classLoader浅析
  3. 使用cardme读写VCard文件,实现批量导入导出电话簿
  4. [编程入门]猴子吃桃的问题
  5. 2020蓝桥杯省赛---java---B---7(单词分析)
  6. 给数据库表字段设置默认值
  7. HttpServletRequest中getAttribute()和getParameter()的区别
  8. dismiss的词组_法律英语常用词必记:Dismiss
  9. python isodd奇偶_Python这些位运算的妙用,绝对让你大开眼界
  10. 动态创建标记+css_dom+js动态效果