9
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Spring Boot Servletマッピング

このページでは、Spring Boot Servletマッピングの例を見ていきます。サーブレットマッピングは、ServletRegistrationBeanを使用するか、Spring Bootの@ServletComponentScanアノテーションを使用することによって実現できます。 ServletRegistrationBeanはサーブレットをSpring Beanとして登録します。 @ServletComponentScanは、@WebServletのアノテーションが付けられたサーブレットをスキャンします。アノテーション@ServletComponentScanは、Spring Bootの組み込みサーバーを使用してのみ機能します。このページでは、2つのサーブレットと1つのSpring Controllerクラスを作成します。 ServletRegistrationBeanと@ServletComponentScanを使ってサーブレットを段階的に使用する例を示します。

前提条件

  1. Java 9
  2. Spring 5.0.7.RELEASE
  3. Spring Boot 2.0.3.RELEASE
  4. Maven 3.5.2
  5. Eclipse Oxygen

pom.xml

pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

        <modelVersion>4.0.0</modelVersion>
        <groupId>com.concretepage</groupId>
        <artifactId>spring-boot-app</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>spring-boot-app</name>
        <description>Spring Boot Application</description>

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
            <relativePath/>
        </parent>
        <properties>
            <java.version>9</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies> 

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project> 

ServletRegistrationBeanを使用してサーブレットをSpring Beanとして登録する

ServletRegistrationBeanはサーブレットをServlet 3.0以降のコンテナに登録するために使用されます。 JavaConfigにServletRegistrationBeanのBeanを作成する必要があります。 サーブレットを設定するために使用されるServletRegistrationBeanのいくつかのメソッドを見つけます。

setServlet():登録するサーブレットを設定します。
addUrlMappings():サーブレットのURLマッピングを追加します。
setLoadOnStartup:起動時にサーブレットをロードする優先順位を設定します。

HelloCountryServletとHelloStateServletの2つのサーブレットがあり、次のようにServletRegistrationBeanを使用してそれらをSpring Bootに登録します。

WebConfig.java
    package com.concretepage;
    import javax.servlet.http.HttpServlet;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import com.concretepage.servlets.HelloCountryServlet;
    import com.concretepage.servlets.HelloStateServlet;

    @Configuration
    public class WebConfig {
       @Bean    
       public ServletRegistrationBean<HttpServlet> countryServlet() {
           ServletRegistrationBean<HttpServlet> servRegBean = new ServletRegistrationBean<>();
           servRegBean.setServlet(new HelloCountryServlet());
           servRegBean.addUrlMappings("/country/*");
           servRegBean.setLoadOnStartup(1);
           return servRegBean;
       }
       @Bean    
       public ServletRegistrationBean<HttpServlet> stateServlet() {
           ServletRegistrationBean<HttpServlet> servRegBean = new ServletRegistrationBean<>();
           servRegBean.setServlet(new HelloStateServlet());
           servRegBean.addUrlMappings("/state/*");
           servRegBean.setLoadOnStartup(1);
           return servRegBean;
       }   
    } 

すべてのサーブレットに対して、ServletRegistrationBean Beanを作成します。 サーブレットHelloCountryServletおよびHelloStateServletは、それぞれURL /country および /state を使用してアクセスできます。
この例で使用されているサーブレットを見つけます。

HelloCountryServlet.java
    package com.concretepage.servlets;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class HelloCountryServlet extends HttpServlet   {
        private static final long serialVersionUID = 1L;
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
            doGet(request,response);
        }
            public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
            out.println("<h3>Hello India!</h3>");   
        }
    } 
HelloStateServlet.java
    package com.concretepage.servlets;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class HelloStateServlet extends HttpServlet   {
        private static final long serialVersionUID = 1L;
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
           doGet(request,response);
        }
            public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
               response.setContentType("text/html");
               PrintWriter out = response.getWriter();
           out.println("<h3>Hello Uttar Pradesh!</h3>");    
        }
    } 

この例で使用されているコントローラです。

HelloWorldController.java
    package com.concretepage.controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class HelloWorldController {     

        @RequestMapping("/world")
        public String helloMsg() {
            String msg = "Hello World!";
            return msg;
        }
    } 

アプリケーションを起動するためのMainクラスです。

SpringBootAppStarter.java
    package com.concretepage;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication
    public class SpringBootAppStarter {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootAppStarter.class, args);
        }
    } 

@ServletComponentScanを使用したサーブレットの例

Spring Bootの@ServletComponentScanは、@WebServletで注釈が付けられたサーブレット、@WebFilterで注釈が付けられたフィルタ、および@WebListenerが付けられたListenersをスキャンします。 アノテーション@ServletComponentScanは、JavaConfigのクラスレベルで使用されます。 @ServletComponentScanは、埋め込みWebサーバを使用してのみサーブレット、フィルタ、およびリスナをスキャンします。 @WebServletのアノテーションが付けられたサーブレットです。

HelloCountryServlet.java
    package com.concretepage.servlets;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @WebServlet(urlPatterns = "/country/*", loadOnStartup = 1)
    public class HelloCountryServlet extends HttpServlet   {
        private static final long serialVersionUID = 1L;
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
             doGet(request,response);
        }
            public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
                 response.setContentType("text/html");
                 PrintWriter out = response.getWriter();
             out.println("<h3>Hello India!</h3>");  
        }
    } 
HelloStateServlet.java
    package com.concretepage.servlets;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @WebServlet(urlPatterns = "/state/*", loadOnStartup = 1)
    public class HelloStateServlet extends HttpServlet   {
        private static final long serialVersionUID = 1L;
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
            doGet(request,response);
        }
            public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
            out.println("<h3>Hello Uttar Pradesh!</h3>");   
        }
    } 

次のように@ServletComponentScanを使用できます。

SpringBootAppStarter.java
    package com.concretepage;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;

    @ServletComponentScan
    @SpringBootApplication
    public class SpringBootAppStarter {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootAppStarter.class, args);
        }
    } 

テストアプリケーション

以下の方法でSpring Bootアプリケーションを実行することができます。

  • Maven Commandを使用する:プロジェクトのソースコードをダウンロードしてください。 コマンドプロンプトを使用してプロジェクトのルートフォルダに移動し、コマンドを実行します。
    mvn spring-boot:run
  • Eclipseを使う:記事の最後にあるダウンロードリンクを使ってプロジェクトのソースコードをダウンロードしてください。 プロジェクトをEclipseにインポートしてください。 コマンドプロンプトを使用して、プロジェクトのルートフォルダに移動して実行します。
    mvn clean eclipse:eclipse

をクリックしてからeclipseでプロジェクトを更新します。
Run as -> Java Application をクリックして、メインクラスSpringBootAppStarterを実行します。その後、Tomcatサーバーが起動されます。

  • 実行可能JARの使用:コマンドプロンプトを使用して、プロジェクトのルートフォルダに移動してコマンドを実行します。
    mvn clean package

ターゲットフォルダーに実行可能なJAR spring-boot-app-0.0.1-SNAPSHOT.jar を取得します。 このJARを以下のように実行します。

    java -jar target / spring-boot-app-0.0.1-SNAPSHOT.jar

Tomcatサーバが起動されます。

これでアプリケーションをテストする準備が整いました。

HelloCountryServletを実行するURLです。

http://localhost:8080/country

HelloStateServletを実行するURLです。

http://localhost:8080/state

HelloWorldControllerメソッドを実行するURLです。

http://localhost:8080/world

参考文献

Spring Boot Reference Guide
ServletRegistrationBean
@ServletComponentScan

翻訳元サイト

Spring Boot Servlet Mapping

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
9
Help us understand the problem. What are the problem?