1. 概述
<em>DispatcherServlet</em> 是 Spring Web 應用程序的前置控制器。它用於在 Spring MVC 中創建 Web 應用程序和 RESTful 服務。在傳統的 Spring Web 應用程序中,此 Servlet 被定義在 <em>web.xml</em> 文件中。
在本教程中,我們將從 <em>web.xml</em> 文件中遷移代碼到 Spring Boot 應用程序中的 <em>DispatcherServlet</em>。 此外,我們還將將 <em>Filter</em>, <em>Servlet</em>, 和 <em>Listener</em> 類從 <em>web.xml</em> 映射到 Spring Boot 應用程序。
2. Maven 依賴
首先,我們需要將 spring-boot-starter-web Maven 依賴添加到我們的 <em>pom.xml</em> 文件中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>3. DispatcherServlet
DispatcherServlet 接收所有 HTTP 請求並將其委託給控制器類。
在 Servlet 3.x 規範之前,DispatcherServlet 會在 Spring MVC 應用程序的 web.xml 文件中進行註冊。 隨着 Servlet 3.x 規範的發佈,我們可以使用 ServletContainerInitializer 編程方式註冊 Servlet。
下面是在 web.xml 文件中 DispatcherServlet 的示例配置:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>Spring Boot 提供 spring-boot-starter-web 庫,用於使用 Spring MVC 開發 Web 應用程序。Spring Boot 的主要特點之一是自動配置。 Spring Boot 的自動配置會自動註冊和配置 DispatcherServlet。 因此,我們無需手動註冊 DispatcherServlet。
默認情況下,spring-boot-starter-web 啓動器配置 DispatcherServlet 為 “/” URL 模式。因此,我們無需為上述 DispatcherServlet 示例在 web.xml 文件中完成任何額外的配置。但是,我們可以使用 server.servlet.* 在 application.properties 文件中自定義 URL 模式:
server.servlet.context-path=/demo
spring.mvc.servlet.path=/baeldung通過這些自定義配置,<em lang="en">DispatcherServlet</em 被配置為處理 URL 模式 <em lang="en">/baeldung</em>,根 <em lang="en">contextPath</em> 將為 <em lang="en">/demo</em>。因此,<em lang="en">DispatcherServlet</em> 在 <em lang="en">http://localhost:8080/demo/baeldung/</em> 上監聽。
4. 應用配置
Spring MVC Web 應用程序使用 <em >web.xml</em >> 文件作為部署描述文件。它還定義了 URL 路徑和web.xml> 文件中 servlets 之間的映射關係。
現在這種情況不再適用於 Spring Boot。如果需要一個特殊過濾器,我們可以將其註冊到 Java 類配置中。`web.xml> 文件包含過濾器、servlets 和 listeners。
當我們想要從傳統的 Spring MVC 遷移到現代的 Spring Boot 應用程序時,如何將我們的 `web.xml> 端口到新的 Spring Boot 應用程序? 在 Spring Boot 應用程序中,我們可以通過多種方式添加這些概念。
4.1. 註冊 過濾器
通過實現 過濾器 接口來創建過濾器:
@Component
public class CustomFilter implements Filter {
Logger logger = LoggerFactory.getLogger(CustomFilter.class);
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.info("CustomFilter is invoked");
chain.doFilter(request, response);
}
// other methods
}<p>沒有 Spring Boot,我們會在 <em >CustomFilter</em> 中配置 <i >web.xml</em> 文件:</p>
<filter>
<filter-name>customFilter</filter-name>
<filter-class>CustomFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>customFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>為了使 Spring Boot 能夠識別一個過濾器,我們只需要將其定義為一個帶有 @Component 註解的 Bean。
4.2. 註冊一個 Servlet
讓我們通過擴展 HttpServlet 類來定義一個 Servlet:
public class CustomServlet extends HttpServlet {
Logger logger = LoggerFactory.getLogger(CustomServlet.class);
@Override
protected void doGet(
HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
logger.info("CustomServlet doGet() method is invoked");
super.doGet(req, resp);
}
@Override
protected void doPost(
HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
logger.info("CustomServlet doPost() method is invoked");
super.doPost(req, resp);
}
}
<p>沒有 Spring Boot,我們會在 <em >CustomServlet</em> 中配置 <em >web.xml</em> 文件:</p>
<servlet>
<servlet-name>customServlet</servlet-name>
<servlet-class>CustomServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>customServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>在 Spring Boot 應用程序中,servlet 註冊要麼作為 Spring 的 @Bean 注入,要麼通過掃描帶有嵌入式容器的 @WebServlet 註解的類。
使用 Spring 的 @Bean 方式,我們可以使用 ServletRegistrationBean 類來註冊 servlet。
因此,我們將定義 CustomServlet 作為 bean,並使用 ServletRegistrationBean 類:
@Bean
public ServletRegistrationBean customServletBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(new CustomServlet(), "/servlet");
return bean;
}
4.3. 註冊監聽器
通過擴展 ServletContextListener 類來定義一個監聽器:
public class CustomListener implements ServletContextListener {
Logger logger = LoggerFactory.getLogger(CustomListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("CustomListener is initialized");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
logger.info("CustomListener is destroyed");
}
}
<p>沒有 Spring Boot,我們會在 <em >CustomListener</em> 中配置它,在 <em >web.xml</em> 文件中:</p>
<listener>
<listener-class>CustomListener</listener-class>
</listener>要在一個 Spring Boot 應用程序中定義一個監聽器,我們可以使用 @Bean 註解或 @WebListener 註解。
使用 Spring 的 @Bean 方式,我們可以使用 ServletListenerRegistrationBean 類來註冊監聽器。
因此,讓我們將 CustomListener 定義為一個 Bean,並使用 ServletListenerRegistrationBean 類:
@Bean
public ServletListenerRegistrationBean<ServletContextListener> customListenerBean() {
ServletListenerRegistrationBean<ServletContextListener> bean = new ServletListenerRegistrationBean();
bean.setListener(new CustomListener());
return bean;
}啓動我們的應用程序時,我們可以檢查日誌輸出以確認監聽器已成功初始化:
2020-09-28 08:50:30.872 INFO 19612 --- [main] c.baeldung.demo.listener.CustomListener: CustomListener is initialized5. 結論
在本快速教程中,我們學習瞭如何在 Spring Boot 應用程序中定義 <em >DispatcherServlet</em> 和 <em >web.xml</em> 元素,包括 <em >filter</em>、<em >servlet</em> 和 <em >listener</em>。