このガイドでは、Spring を使用して「Hello, World」Web サイトを作成するプロセスについて説明します。

構築するもの

静的なホームページを持ち、HTTP GET リクエストを受け入れるアプリケーションを作成します: http://localhost:8080/greeting

HTML を表示する Web ページで応答します。HTML の本文には、「Hello, World!」という挨拶が含まれます。

クエリ文字列のオプションの name パラメーターを使用して、グリーティングをカスタマイズできます。その場合、URL は http://localhost:8080/greeting?name=User になります。

name パラメーター値は、World のデフォルト値をオーバーライドし、「Hello、User!」に変更されるコンテンツによるレスポンスに反映されます

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Spring Initializr から開始に進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-serving-web-content/complete のコードに対して結果を確認できます。

Spring Initializr から開始

すべての Spring アプリケーションの場合、Spring Initializr (英語) から開始する必要があります。Initializr は、アプリケーションに必要なすべての依存関係をすばやく取得する方法を提供し、多くのセットアップを行います。この例には、Spring Web、Thymeleaf、および Spring Boot DevTools の依存関係が必要です。次のイメージは、このサンプルプロジェクト用に設定された Initializr を示しています。

initializr
前の図は、Maven がビルドツールとして選択された Initializr を示しています。Gradle も使用できます。また、com.example および serving-web-content の値をそれぞれグループおよびアーティファクトとして表示します。このサンプルの残りの部分では、これらの値を使用します。

次のリストは、Maven を選択したときに作成される 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>serving-web-content</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>serving-web-content</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

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

</project>

次のリストは、Gradle を選択したときに作成される build.gradle ファイルを示しています。

plugins {
	id 'org.springframework.boot' version '2.2.2.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	developmentOnly
	runtimeClasspath {
		extendsFrom developmentOnly
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

Web コントローラーを作成する

Web サイトを構築する Spring のアプローチでは、HTTP リクエストはコントローラーによって処理されます。@Controller(Javadoc) アノテーションによってコントローラーを簡単に識別できます。次の例では、GreetingController は View(Javadoc) (この場合は greeting)の名前を返すことにより、/greeting の GET リクエストを処理します。View は、HTML コンテンツのレンダリングを担当します。次のリスト(src/main/java/com/example/servingwebcontent/GreetingController.java から)は、コントローラーを示しています。

package com.example.servingwebcontent;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class GreetingController {

	@GetMapping("/greeting")
	public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
		model.addAttribute("name", name);
		return "greeting";
	}

}

このコントローラーは簡潔でシンプルですが、多くのことを示しています。段階的に分解していきましょう。

@GetMapping アノテーションは、/greeting への HTTP GET リクエストが greeting() メソッドにマップされることを保証します。

@RequestParam(Javadoc) は、クエリ文字列パラメーター name の値を greeting() メソッドの name パラメーターにバインドします。このクエリ文字列パラメーターは required ではありません。リクエストにない場合、World の defaultValue が使用されます。name パラメーターの値が Model(Javadoc) オブジェクトに追加され、最終的にビューテンプレートからアクセスできるようになります。

メソッド本体の実装は、ビューテクノロジー(この場合は Thymeleaf (英語) )に依存して、HTML のサーバー側レンダリングを実行します。Thymeleaf は、greeting.html テンプレートを解析し、th:text 式を評価して、コントローラーに設定された ${name} パラメーターの値をレンダリングします。次のリスト(src/main/resources/templates/greeting.html から)は、greeting.html テンプレートを示しています。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>
クラスパスに Thymeleaf があることを確認してください(アーティファクト座標: org.springframework.boot:spring-boot-starter-thymeleaf)。Github の「初期」および「完全」サンプルにはすでに存在しています。

Spring Boot Devtools

Web アプリケーション開発の一般的な機能は、変更のコーディング、アプリケーションの再起動、およびブラウザーをリフレッシュして変更を表示することです。このプロセス全体で多くの時間が消費されます。このリフレッシュサイクルを高速化するために、Spring Boot は spring-boot-devtools として知られる便利なモジュールを提供しています。Spring Boot 開発ツール:

  • ホットスワップを有効にします。

  • テンプレートエンジンを切り替えて、キャッシュを無効にします。

  • LiveReload がブラウザを自動的にリフレッシュできるようにします。

  • 本番ではなく開発に基づいたその他の合理的なデフォルト。

アプリケーションの実行

Spring Initializr は、アプリケーションクラスを作成します。この場合、Spring Initializr によって提供されるクラスをさらに変更する必要はありません。次のリスト(src/main/java/com/example/servingwebcontent/ServingWebContentApplication.java から)は、アプリケーションクラスを示しています。

package com.example.servingwebcontent;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServingWebContentApplication {

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

}

@SpringBootApplication は、次のすべてを追加する便利なアノテーションです。

  • @Configuration: アプリケーションコンテキストの Bean 定義のソースとしてクラスにタグを付けます。

  • @EnableAutoConfiguration: クラスパス設定、他の Bean、およびさまざまなプロパティ設定に基づいて Bean の追加を開始するよう Spring Boot に指示します。例: spring-webmvc がクラスパスにある場合、このアノテーションはアプリケーションに Web アプリケーションとしてフラグを立て、DispatcherServlet のセットアップなどの主要な動作をアクティブにします。

  • @ComponentScan: Spring に、com/example パッケージ内の他のコンポーネント、構成、およびサービスを探して、コントローラーを検出させるように指示します。

main() メソッドは、Spring Boot の SpringApplication.run() メソッドを使用してアプリケーションを起動します。XML が 1 行もないことに気付きましたか? web.xml ファイルもありません。この Web アプリケーションは 100% 純粋な Java であり、接続機能やインフラストラクチャの構成に対処する必要はありませんでした。

実行可能 JAR を構築する

コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、およびリソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、およびデプロイできます。

Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar build/libs/gs-serving-web-content-0.1.0.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-serving-web-content-0.1.0.jar
ここで説明する手順は、実行可能な JAR を作成します。クラシック WAR ファイルを作成することもできます。

ロギング出力が表示されます。アプリケーションは数秒以内に稼働します。

アプリケーションをテストする

Web サイトが実行されたため、http://localhost:8080/greeting にアクセスすると、「Hello, World!」が表示されます。

http://localhost:8080/greeting?name=User にアクセスして、name クエリ文字列パラメーターを提供します。メッセージが「Hello, World!」から「Hello、User!」に変化することに注目してください。

この変更は、GreetingController の @RequestParam(Javadoc) 配置が期待どおりに機能していることを示しています。name パラメーターには、デフォルト値 World が指定されていますが、照会ストリングを介して明示的にオーバーライドできます。

ホームページを追加する

HTML、JavaScript、CSS を含む静的リソースは、Spring Boot アプリケーションからソースコードの適切な場所にドロップすることで提供できます。デフォルトでは、Spring Boot は /static (または /public)のクラスパスのリソースから静的コンテンツを提供します。index.html リソースは、存在する場合は「 `welcome page、"serving-web-content/ which means it is served up as the root resource (that is, at `http://localhost:8080/」として使用されるため特別です。そのため、次のファイルを作成する必要があります(src/main/resources/static/index.html にあります)。

<!DOCTYPE HTML>
<html>
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p>Get your greeting <a href="/greeting">here</a></p>
</body>
</html>

アプリケーションを再起動すると、http://localhost:8080/ に HTML が表示されます。

要約

おめでとう! Spring を使用して Web ページを開発しました。

関連事項