更新日:2019.07.20
Spring Framework の公式サイトには Guides というページがあって、いろいろなチュートリアルが載っている。その中に、Spring Web MVC を使ってウェブコンテンツを作ってみるものがあったのでやってみた。チュートリアルでは基本的なものが出来上がってるソースから始めるパターンと、フルスクラッチで作成するパターンがあるが今回はフルスクラッチで作っていく。
まずプロジェクトの作成だが、Gradle、Maven、IDEのどれかを使用して作成することができる。今回はGradleを使ってIntelliJで作成していく。
手順に沿って作成したら以下の build.gradle
になった。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar {
baseName = 'gs-serving-web-content'
version = '0.1.0'
}
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.springframework.boot:spring-boot-starter-thymeleaf"
implementation "org.springframework.boot:spring-boot-devtools"
testCompile group: 'junit', name: 'junit', version: '4.12'
}
Spring Boot gradle plugin を使用しているが、これはいくつかの便利な機能が含まれているらしい。
public static void main()
を探し出し実行クラスとしてフラグを付与する詳しくは以下のページに載っているのであとでまとめてみようと思う。
SpringWebMVCでは、HTTPリクエストをコントローラーと呼ばれる役割を担うJavaクラスが受け取る仕組みになっている。コントローラーの役割をJavaクラスに付与するにはクラスに対して @Controller
アノテーションを付与する。手順に従って作成すると、以下のようなコントローラーJavaクラスができた。
package hello;
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
パスへのGETメソッドに対応するメソッドであることを示している。そのリクエストがくると、 greeting
メソッドが呼び出されるわけだ。当然だが、GETメソッド以外にも対応できるように以下のアノテーションが用意されている。
Spring MVC | 1.3.2. Request Mapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
HTTPメソッドに対応したアノテーションがある一方で、 @RequestMapping
というアノテーションのパラメーターにHTTPメソッドを明記するアノテーションも用意されている。
@RequestParam
アノテーションでHTTPリクエストのパラメータをバインドする。ここでは name
パラメータを String name
にバインドしている。 required
が false
になっているため、必須のパラメータではない。送られてこなかった場合は defaultValue
で示されている World
がバインドされる。
HTTPリクエストがバインドされた name
引数は、 Model
と呼ばれるオブジェクトに addAttribute
メソッドで渡している。こうすることで、 name
を View
に渡すことができる。Modelの説明は公式ドキュメントのハンドラーメソッドの引数一覧に書いてある。
Spring MVC | 1.3.3 HandlerMethods
このチュートリアルではHTMLのレンダリングにThymeleafを使用している。Thymeleafはサーバーサイドレンダリングライブラリの一種。以下のファイルを src/main/resources/templates/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>
th:text
属性を使って、Modelに渡したname値を出力している。
Spring-boot-devtoolsを使うことでWebアプリの開発に便利な機能を利用できる。
作成したアプリケーションを実行できるようにするにはWARファイルとしてビルドし、サーバーに配置するといった方法があるが、簡単に動作をデモするのであればJavaの main()
メソッドを以下のように用意する。このようにすることで、Springが組み込みTomcatサーバを用意し、アプリケーションを配置してくれる。
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
はいくつかの便利な機能を含んだアノテーション。
@Configuration
... Bean定義クラスであると示す。Spring Framework | 1.12.1@EnableAutoConfiguration
... クラスパスを元にBeanを検索&登録することを示す。 Spring Boot 11.3.2@EnableEwbMvc
... spring-webmvc がクラスパスに存在する場合付与される、アプリケーションんがWebアプリである事を示す。 Spring Boot 29.1.1@ComponentScan
... hello
パッケージのコンポーネント、コンフィグレーション、サービスなどをBean登録する事を示す。 Spring Framework 1.10.3