如果你用过Spring MVC那么你应该知道什么是DispatcherServlet?它实际上是Spring MVC的核心,准确地说是MVC设计模式或Controller的C。每个应该由 Spring MVC 处理的 Web 请求都会通过 DispatcherServlet。通常,它是前端控制器模式的一种实现,可在您的应用程序中提供单一入口点。它处理所有传入的请求。它也是 Java 与 Spring 和 DispatcherServlet 之间的桥梁,就像在 web.xml 中声明的任何其他 Servlet 一样,它具有足以将每个 Web 请求映射到 DispathcherServlert 的 URL 模式。
它通过将请求委托给 Spring MVC 的其他组件来负责请求处理,例如实际的控制器类,即使用 @Controller 或 @RestController 注释的类(在 RESTful Web 服务的情况下)、视图、视图解析器、处理程序映射器等。
虽然实际请求映射的工作是由@RequestMapping 注解完成的,但实际上是 DispatcherServlet 将请求委托给相应的控制器。
在 RESTful Web 服务的情况下,它还负责找到正确的消息转换器以将响应转换为客户端期望的格式,例如JSON、XML 或文本。例如,如果客户端需要 JSON,那么它将使用 MappingJacksonHttpMessageConverter 或 MappingJackson2HttpMessageConverter(取决于类路径中 Jackson 1 或 Jackson 2 是否可用)将 convert 返回的响应转换为 JSON 字符串。请参阅 Baeldung 的 REST with Spring 以了解有关使用 Spring 3 和 Spring 4 开发 RESTful Web 服务的更多信息。
正如我之前所说,Dispatcher Servlet 用于处理所有传入的请求,并将它们路由到不同的 Spring Controller 以进行进一步处理。为此,它确定哪些控制器应该处理传入的请求。
DispatcherServlet 使用 HandlerMapping 实现——预构建或作为应用程序的一部分提供,以将传入请求路由到处理程序对象。默认情况下,它使用 BeanNameUrlHandlerMapping 和 DefaultAnnotationHandlerMapping,这是使用 @RequestMapping 注解驱动的。
为了找到处理请求的正确方法,它扫描所有使用@Controller 注释声明的类,它还使用@RequestMapping 注释来查找负责处理请求的类型和方法。 @RequestMapping 注释可以通过路径映射请求,例如@RequestMapping(“路径”),通过 HTTP 方法,例如@RequestMapping(“path”, method=RequestMethod.GET),通过请求参数,例如@RequestMapping(“path”, method=RequestMethod.POST, params=”param1”) 和 HTTP 请求标头的存在,例如
@RequestMapping(“路径”, header=”content-type=text/*”).您还可以在类级别应用 @RequestMapping 注释来过滤传入的请求。
处理请求后,控制器将逻辑视图名称和模型返回给 DispatcherServlet。然后它咨询视图解析器以找到实际的视图来呈现输出。可以使用 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是Front Controller Pattern的一种实现(见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 引擎创建这个类的一个实例并调用它各种生命周期方法,例如初始化(),服务()和销毁()。
5) DispatcherServlet 为您的 Spring MVC web 应用程序提供单一入口点。正如我之前所说,它处理所有传入的请求。查看Spring MVC 的内部工作原理,了解 Spring 内部工作原理的更多细节。
6) Spring 的 DispatcherServlet 也与 Spring IoC 容器完全集成,因此允许您使用 Spring 框架的每个功能,例如依赖注入。
7) dispatcher 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。这些继承的 beans 可以在特定于 servlet 的范围内被覆盖,并且新的特定于范围的 beans 可以在本地定义到给定的 servlet 实例。
10) Spring MVC框架的DispatcherServlet也可以返回last-modification-date,由Servlet API指定。它通过查找适当的处理程序映射来确定最后修改日期,并测试找到的处理程序是否实现了 LastModified 接口。如果是,则调用 LastModified 接口的 getLastModified(request) 方法并将值返回给客户端。
这就是关于 Spring MVC 框架的 DispatcherServlet 的全部内容。正如我所说,DispatcherServlet 是 Spring MVC 的骨干,并作为主要控制器将不同的 HTTP 请求路由到相应的 Spring 控制器。它是前端控制器设计模式的实现,并为您的 Spring Web 应用程序提供单一入口点。您在 web.xml 中配置 DispatcherServlet,但为其提供启动时加载值 1,以建议容器在启动期间而不是在请求出现时加载此 Servlet。这减少了第一个请求的响应时间。
您可能想探索的其他 Spring 相关文章
感谢您到目前为止阅读本文。如果您喜欢这篇文章,请与您的朋友和同事分享。如果您有任何问题、建议或反馈,或者您对 DispatcherServlert 有任何此处未提及但值得了解的观点,请发表评论,我会将其包含在主要文章中。
标签2: Java教程地址:https://www.cundage.com/article/jcg-dispatcherservlet-spring-mvc-10-things-java-developer-know.html