1. 概要

DispatcherServlet は、SpringWebアプリケーションのフロントコントローラーです。 SpringMVCでWebアプリケーションとRESTサービスを作成するために使用されます。 従来のSpringWebアプリケーションでは、このサーブレットはweb.xmlファイルで定義されています。

このチュートリアルでは、コードをweb.xmlファイルからSpring BootアプリケーションのDispatcherServletに移行します。 また、 Filter Servlet 、およびListenerクラスをweb.xmlからSpring Bootアプリケーションにマップします。

2. Mavenの依存関係

まず、 spring-boot-starter-webMaven依存関係をpom.xmlファイルに追加する必要があります。

<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ファイルに登録されていました。サーブレット3.x仕様以降、ServletContainerInitializerを使用してプログラムでサーブレットを登録できます。 ]。

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は、SpringMVCを使用してWebアプリケーションを開発するためのspring-boot-starter-webライブラリを提供します。 Spring Bootの主な機能の1つは、自動構成です。 Spring Boot自動構成は、DispatcherServletを自動的に登録および構成します。 したがって、DispatcherServletを手動で登録する必要はありません。

デフォルトでは、 spring-boot-starter-web スターターは、DispatcherServletをURLパターン「/」に構成します。 したがって、web.xmlファイルで上記のDispatcherServletの例の追加構成を完了する必要はありません。 ただし、application.propertiesファイルのserver.servlet。*を使用してURLパターンをカスタマイズできます。

server.servlet.context-path=/demo
spring.mvc.servlet.path=/baeldung

これらのカスタマイズにより、 DispatcherServletはURLパターン/baeldung を処理するように構成され、ルートcontextPath/demoになります。 したがって、 DispatcherServlethttp:// localhost:8080 / demo /baeldung/でリッスンします。

4. アプリケーション構成

Spring MVC Webアプリケーションは、web.xmlファイルをデプロイメント記述子ファイルとして使用します。 また、web.xmlファイル内のURLパスとサーブレット間のマッピングを定義します。

これは、SpringBootには当てはまりません。 特別なフィルターが必要な場合は、Javaクラス構成に登録できます。 web.xml ファイルには、フィルター、サーブレット、およびリスナーが含まれています。

従来のSpringMVCから最新のSpringBootアプリケーションに移行する場合、web.xmlを新しいSpring Bootアプリケーションに移植するにはどうすればよいですか? Spring Bootアプリケーションでは、これらの概念をいくつかに追加できます。方法。

4.1. フィルターの登録

Filterインターフェースを実装してフィルターを作成しましょう。

@Component
public class CustomFilter implements Filter {

    Logger logger = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        logger.info("CustomFilter is invoked");
        chain.doFilter(request, response);
    }

    // other methods 
}

Spring Bootがない場合、[X84X] CustomFilter web.xmlファイルで構成します。

<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. サーブレットの登録

HttpServlet クラスを拡張して、サーブレットを定義しましょう。

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);
    }
}

Spring Bootがない場合、web.xmlファイルでCustomServletを構成します。

<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アプリケーションでは、サーブレットはSpring @Bean として登録されるか、組み込みコンテナを使用して@WebServlet注釈付きクラスをスキャンします。

Spring @Bean アプローチでは、ServletRegistrationBeanクラスを使用してサーブレット登録できます。

したがって、CustomServletServletRegistrationBeanクラスのbeanとして定義します。

@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");
    }
}

Spring Bootがない場合は、web.xmlファイルでCustomListenerを構成します。

<listener>
    <listener-class>CustomListener</listener-class>
</listener>

Spring Bootアプリケーションでリスナーを定義するには、@Beanまたは@WebListenerアノテーションのいずれかを使用できます。

Spring @Bean アプローチでは、 ServletListenerRegistrationBean クラスを使用して、Listenerを登録できます。

それでは、CustomListenerServletListenerRegistrationBean クラスでbeanとして定義しましょう。

@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. 結論

このクイックチュートリアルでは、DispatcherServletおよびweb.xml要素を定義する方法を説明しました。 SpringBootアプリケーション。 そして、いつものように、上記の例のソースコードはGitHubにあります。