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