Edited 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