知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 中的 DispatcherServlet 和 web.xml

Spring Boot,Spring Web
HongKong
6
12:44 PM · Dec 06 ,2025

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 initialized

5. 結論

在本快速教程中,我們學習瞭如何在 Spring Boot 應用程序中定義 <em >DispatcherServlet</em><em >web.xml</em> 元素,包括 <em >filter</em><em >servlet</em><em >listener</em>

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.