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

```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](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)
[ServletRegistrationBean](https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/servlet/ServletRegistrationBean.html)
[＠ServletComponentScan](https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/servlet/ServletComponentScan.html)

# 翻訳元サイト
[Spring Boot Servlet Mapping](https://www.concretepage.com/spring-boot/spring-boot-servlet-mapping)