このページでは、Spring Boot Servletマッピングの例を見ていきます。サーブレットマッピングは、ServletRegistrationBeanを使用するか、Spring Bootの@ServletComponentScanアノテーションを使用することによって実現できます。 ServletRegistrationBeanはサーブレットをSpring Beanとして登録します。 @ServletComponentScanは、@WebServletのアノテーションが付けられたサーブレットをスキャンします。アノテーション@ServletComponentScanは、Spring Bootの組み込みサーバーを使用してのみ機能します。このページでは、2つのサーブレットと1つのSpring Controllerクラスを作成します。 ServletRegistrationBeanと@ServletComponentScanを使ってサーブレットを段階的に使用する例を示します。
前提条件
- Java 9
- Spring 5.0.7.RELEASE
- Spring Boot 2.0.3.RELEASE
- Maven 3.5.2
- Eclipse Oxygen
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に登録します。
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 を使用してアクセスできます。
この例で使用されているサーブレットを見つけます。
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>");
}
}
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>");
}
}
この例で使用されているコントローラです。
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クラスです。
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のアノテーションが付けられたサーブレットです。
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>");
}
}
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を使用できます。
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