Spring MVC 的 DispatcherServlet——Java 开发者应该知道的 10 件事

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(556)   2024-01-28 16:34:57

如果你用过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 服务的更多信息。

Spring MVC中DispatcherServlet是如何处理请求的

正如我之前所说,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 服务的更多信息。

关于DispatcherServlet的10点

在本文中,我将分享 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 MVC 4 介绍
  • Baeldung 的 REST with Spring
  • Spring 基础知识,作者:Bryan Hassen

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

  • Spring MVC 中@RestControler 和@Controller 的区别? (回答
  • 23 个 2 到 3 年经验的 Spring MVC 面试问题(list
  • 在Spring MVC中DispatcherServlet有什么用? (回答
  • 如何在 Java 应用程序中启用 Spring 安全性? (回答
  • Spring 认证对工作和职业有帮助吗? (文章
  • 5 大Spring认证模拟考试(列表
  • Pluralsight 的 Spring Fundamentals(参见
  • Spring 中@Autowired 和@Injection 注解的区别? (回答
  • 5 门面向 Java 开发人员的 Spring 和 Hibernate 在线课程(列表

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

标签2: Java教程
地址:https://www.cundage.com/article/jcg-dispatcherservlet-spring-mvc-10-things-java-developer-know.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...