Spring Web MVC

HelloWorld

更新日:2019.07.20

Spring Framework の公式サイトには Guides というページがあって、いろいろなチュートリアルが載っている。その中に、Spring Web MVC を使ってウェブコンテンツを作ってみるものがあったのでやってみた。チュートリアルでは基本的なものが出来上がってるソースから始めるパターンと、フルスクラッチで作成するパターンがあるが今回はフルスクラッチで作っていく。

Setting Gradle

まずプロジェクトの作成だが、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 を使用しているが、これはいくつかの便利な機能が含まれているらしい。

詳しくは以下のページに載っているのであとでまとめてみようと思う。

コントローラーの作成

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

HTTPメソッドに対応したアノテーションがある一方で、 @RequestMapping というアノテーションのパラメーターにHTTPメソッドを明記するアノテーションも用意されている。

@RequestParam アノテーションでHTTPリクエストのパラメータをバインドする。ここでは name パラメータを String name にバインドしている。 requiredfalse になっているため、必須のパラメータではない。送られてこなかった場合は defaultValue で示されている World がバインドされる。

HTTPリクエストがバインドされた name 引数は、 Model と呼ばれるオブジェクトに addAttribute メソッドで渡している。こうすることで、 nameView に渡すことができる。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値を出力している。

Webアプリの開発

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 はいくつかの便利な機能を含んだアノテーション。