Spring Web MVCを利用するプロジェクトのひな型を作成する手順

# 概要

この記事はSpring Web MVCを利用するプロジェクトのひな型を作成する手順と、そのひな型に簡単な機能を追加して動作確認を行う手順を説明しています。

Spring Bootではプロジェクトのひな型を作成するツールがあるので簡単にプロジェクトを作成することができますが、Spring Frameworkの場合、そのようなツールがないので開発者が1から作成していく必要があります。

**ひな型の作成**

なるべくEclipse上の操作だけで作成できるようにしました。作成の大まかな流れは`動的Webプロジェクトの作成` → `Mavenプロジェクトへ変換` → `Spring WebMvcを依存関係に追加` です。

なお、ひな型が利用するビューは`JSP`としています。

**動作確認用の機能追加**

簡単なメッセージを表示するコントローラとjspを実装します。またビルドしたwarファイルを別途インストールしたTomcat上にデプロイする手順も説明しています。

**環境**

* Windows 10 Professional 1903
* Pleiades All in One Eclipse 2019-06
    * OpenJDK 11
    * Tomcat 9.0
    * Maven 3.6
* Spring WebMvc 5.1.9.RELEASE

**参考**

* [Spring Framework Documentation] (https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/index.html)

# ひな型の作成

Eclipseを起動し`Java EE`パースペクティブを開きます。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/4d6ff1b2-6c6c-afb1-a1e3-4bf0eca74330.png)

## 動的 Web プロジェクトの作成

プロジェクト・エクスプローラービューのメニューから`動的 Web プロジェクトを作成します` のリンクをクリックします。（または、メニューバー → `ファイル` → `新規` → `動的 Web プロジェクト`）
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/e5676dae-d507-d053-23ce-67da481d113b.png)

「新規動的 Web プロジェクト」の画面で下記の項目を入力し`次へ`のボタンをクリックします。

* プロジェクト名 ： 任意（この例では`demo`）
* ターゲットランタイム ： Tomcat9 (Java11)
* 動的 web モジュール バージョン ： 4.0

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/00e3f6ff-280d-2577-9b7a-c16407ed3a1d.png)

次の画面でビルド・パス上のソース・フォルダーを編集します。
最初に表示されている"src"を選択して`除去`ボタンをクリックします。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/ea22d11d-c3f6-feaf-2294-9aa0dba1408f.png)

次に`フォルダーの追加`ボタンをクリックして、Mavenプロジェクトのソースフォルダーの構成にするために下記4つを追加します。

* src\main\java
* src\main\resources
* src\test\java
* src\test\resources

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/7e35b850-22ed-1d4c-6abe-9d6585566f29.png)

追加した結果です。`次へ`ボタンをクリックします。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/5c5c3b58-4ef4-10e2-58a0-a4abc51a1b94.png)

次の画面で `web.xmlデプロイメント記述子の生成` にチェックを入れ`完了`ボタンをクリックします。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/1a140fc3-4dfa-97b0-6b2b-dab6b174df84.png)

プロジェクトを生成した直後の状態です。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/5b6d9e7e-b7ea-052f-1b0a-7583d42e6bf9.png)

## Mavenプロジェクトへ変換

Java リソースの"src/main/java"を右クリック → `新規` → `パッケージ` を選択します。
![07_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/3b674247-d356-54cd-ba05-ec44c4f5bb3e.png)

「新規 Java パッケージ」画面で"com.example.demo"を追加します。
同様に"src/main/test"にも同じパッケージを追加します。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/66300bb1-510f-b6b6-aeae-d0b9558a592f.png)

パッケージを追加した直後の状態です。
![08_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/318f1ccf-fa08-74b8-a4b3-cc5f63a43da5.png)

プロジェクト名を右クリック → `構成` → `Maven プロジェクトへ変換`をクリックします。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/b22cc4b3-7452-9731-e47e-defc42853db9.png)

「新規 POM の作成」画面で以下の項目を入力し`完了`ボタンをクリックします。

* グループId : 任意 （この例では"com.example"）
* アーティファクトId : 任意 （この例では"demo"）

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/75b3a0e8-a1a9-2fab-bc87-844dddc22c11.png)

Mavenプロジェクトへの変換が完了するとpom.xmlファイルが生成されています。下記は生成された直後の内容です。

```xml
<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.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <release>11</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
```

pom.xmlを編集します。

```xml
<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.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>11</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>

  <dependencies>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <compilerArgs>
            <arg>-Xlint:all</arg>
          </compilerArgs>
          <release>${java.version}</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>
```

pom.xmlの編集が終わったらプロジェクト名を右クリック → `Maven` → `プロジェクトの更新` → プロジェクトにチェックを入れて`OK`ボタンをクリックします。
プロジェクトの更新が完了したらプロジェクト名を右クリック → `実行` → `7 Maven ビルド`をクリックします。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/c80ce892-6cb1-b29a-68e0-921082fe9f10.png)

「構成の編集」画面でゴールに"clean package"と入力し`実行`ボタンをクリック
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/8c0d58fd-5b66-f32b-6dcf-dba52d38868c.png)

コンソールに以下のログが出力されれば成功です。

```text
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.766 s
[INFO] Finished at: 2019-08-23T13:58:04+09:00
[INFO] ------------------------------------------------------------------------
```

## Spring Framework WebMvc の追加

pom.xmlを開き`dependencies`にspring-webmvcを追加します。

```xml
<dependencies>
    <!--追加-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
</dependencies>
```

次にSpring設定フィルを作成します。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/d9e55942-7968-cdae-70b1-5d6c646d2799.png)

/WebContent/WEB-INF/root-context.xmlファイルを以下の内容で作成します。

```xml:root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->

</beans>
```

/WebContent/WEB-INF/app-context.xmlファイルを以下の内容で作成します。

```xml:app-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Enables the Spring MVC @Controller programming model -->
    <mvc:annotation-driven />

    <!-- Default Servlet -->
    <mvc:default-servlet-handler />

    <!-- Static Resources -->
    <mvc:resources mapping="/resources/**" location="/public/" cache-period="#{60 * 60}" />

    <!-- View Technologies -->
    <mvc:view-resolvers>
        <mvc:jsp prefix="/WEB-INF/views/" />
    </mvc:view-resolvers>

    <context:property-placeholder location="classpath:*.properties" />

    <context:component-scan base-package="com.example.demo" />

</beans>
```

/WebContent/WEB-INF/web.xmlを編集します。

編集前

```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>demo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
```

編集後

`display-name`要素は任意です。（この例では`memo`）

```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>demo</display-name>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/root-context.xml</param-value>
  </context-param>

  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/app-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>
```

最後に、jspファイルを配置する`/WebContent/WEB-INF/views`ディレクトリと、静的ファイル(画像ファイル)を配置する`/WebContent/public/images`ディレクトリを作成します。
![14_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/5fe4d9bc-6f8c-8516-ab4e-72eab318c17c.png)

画像ファイル以外にcssやjsも同じように配置したい場合は`images`ディレクトリと同様にpublic下に`js`や`css`といった名前のディレクトリを追加します。

```
/WebContent
  |
  `--- /public
         |
         `--- /images  // 画像ファイル
         |
         `--- /js      // javascriptファイル
         |
         `--- /css     // cssファイル
```

これでアプリケーションのひな型の作成は**終了**です。

# 動作確認用の機能追加

## シンプルなコントローラを追加する

動作確認用に簡単なメッセージを返すだけのコントローラを追加してみます。

### プロパティファイルの作成

アプリケーションからプロパティファイルが参照できることを確認するためにダミーのプロパティファイルを作成します。
この例ではJava リソースの"src/main/resources"にdemo.propertiesというプロパティファイルを作成しました。
![15_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/7927ce2b-93ba-22fe-48b1-4dc569ec4428.png)

```properties:demo.properties
application.name = spring 5 demo application
```

### 画像ファイルの配置

jspから画像ファイルにアクセスできるか確認するためにダミーの画像ファイルを配置します。
この例では"/WebContent/public/images"にsample_1.pngという画像ファイルを配置しました。
![16_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/aa357515-2657-6aae-4240-3310331c4ec2.png)

この画像ファイルは`localhost:8080/demo/resources/images/sample_1.png`というURLでアクセスできます。

### HelloController.javaの作成

パッケージ"com.example.demo"直下にHelloControllerクラスを作成します。

![16_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/89510eb0-f0b6-885a-f9d5-8aa365afe095.png)

```java
package com.example.demo;

import java.time.LocalDateTime;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    // (1)
    @Value("${application.name}")
    private String appName;

    // (2)
    @GetMapping(value = "/")
    public String hello(Model model) {
    	model.addAttribute("message", "Hello World");
    	model.addAttribute("now", LocalDateTime.now());
    	model.addAttribute("appName", appName);
        return "hello";
    }

}
```

**(1)** Valueアノテーションでdemo.propertiesの`application.name`というキーの値をフィールドに代入しています。

```java
@Value("${application.name}")
private String appName;
```

**(2)** クライアントからパス`/`へのGetリクエストをhelloメソッドにマッピングしています。

具体的には以下のURLへアクセスするとhelloメソッドが実行されます。

```
http://localhost:8080/demo/
```

また、戻り値の"hello"はhelo.jspファイルを指します。

```
/WebContent
  |
  `--- /WEB-INF
         |
         `--- /views
                |
                `--- hello.jsp
```

### hello.jspの作成

"/WebContent/WEB-INF/views"にhello.jspというファイルを作成します。
![16_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/2dffb229-2025-17e8-47c4-f257caa98a32.png)

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
  <h1>${appName}</h1>
  <div>
    <p>${message}</p>
    <p>${now}</p>
  </div>
  <div>
    <img src="/demo/resources/images/sample_1.png" />
  </div>
</body>
</html>
```

### Tomcatサーバの作成

Eclipse上でアプリケーションを起動するためにサーバービューでTomcatサーバーを追加します。
サーバービューを開き`使用可能なサーバーがありません。このリンクをクリックして新規サーバーを作成してください...`をクリックします。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/35516781-76b3-8de0-359f-669042add415.png)

"サーバーのタイプ"に`Tomcat v9.0 サーバー`を選択し`次へ`ボタンをクリックします。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/4269b355-e73b-4dc0-7af7-60d707911125.png)

使用可能なリソースの欄からこのアプリケーション（demo）を選択して`追加`ボタンをクリックして構成済みへ移動させて最後に`完了`ボタンをクリックします。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/5bf6d024-af34-df26-e8b2-3a6065a9db51.png)

追加した直後にプロジェクト名にエラーマーク（赤いアイコン）が表示されている場合は、プロジェクト名を右クリック → `リフレッシュ`をクリックします。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/1af79aa5-93fa-ecd0-f7fd-16ed56cd77a9.png)

サーバービューに追加したTomcatサーバー(ローカルホスト の Tomcat9 (java11))を右クリック → `開始` でアプリケーションを起動します。
コンソールに下記のような起動メッセージが表示されたことを確認したら、

```
情報: Completed initialization in 1341 ms [金 8月 23 19:55:18 JST 2019]
情報: プロトコルハンドラー ["http-nio-8080"] を開始しました。 [金 8月 23 19:55:18 JST 2019]
情報: プロトコルハンドラー ["ajp-nio-8009"] を開始しました。 [金 8月 23 19:55:18 JST 2019]
情報: サーバーの起動 [3,850]ms [金 8月 23 19:55:18 JST 2019]
```

ブラウザで `http://localhost:8080/demo/` にアクセスして次のようなページが表示されれば成功です。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/eb98734f-f19e-fd06-6c4b-6a0036aa746c.png)

## JSP標準タグライブラリを使う

pom.xmlを開き`dependencies`に以下の依存関係を追加します。

```xml
<dependency>
  <groupId>javax.servlet.jsp.jstl</groupId>
  <artifactId>jstl-api</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>org.apache.taglibs</groupId>
  <artifactId>taglibs-standard-impl</artifactId>
  <version>1.2.5</version>
</dependency>
```

HelloController.javaを開き、helloメソッドに以下の修正を行います。

```java
@GetMapping(value = "/")
public String hello(Model model) {
    model.addAttribute("message", "Hello World");
    model.addAttribute("now", LocalDateTime.now());
    model.addAttribute("appName", appName);
    // ↓ 追加
    List<String> fruits = List.of("apple", "banana", "cherry");
    model.addAttribute("fruits", fruits);
    // ↑ 追加
    return "hello";
}
```

hello.jspを開き、以下の修正を行います。

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- ↓ (1) 追加 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- ↑ 追加 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
  <h1>${appName}</h1>
  <div>
    <p>${message}</p>
    <p>${now}</p>
  </div>
  <div>
    <img src="/demo/resources/images/sample_1.png" />
  </div>
  <!-- ↓ (2) 追加 -->
  <div>
    <ol>
    <c:forEach var="value" items="${fruits}" varStatus="index">
      <li>${value} (${index.count})</li>
    </c:forEach>
    </ol>
  </div>
  <!-- ↑ 追加 -->
</body>
</html>
```

**(1)** Coreタグライブラリを使用する宣言を行っています。prefixに指定した文字（この場合は"c"）がJSP内のタグ名になります。

**(2)** CoreタグライブラリのforEachを使った実装例です。

## ログファイルを出力する

アプリケーションのログを出力するようにロギングライブラリ(slf4jとlog4j2)を使用します。
pom.xmlを開き`dependencies`に以下の依存関係を追加します。

```xml
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.12.1</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version>2.12.1</version>
    <scope>runtime</scope>
</dependency>
```

log4j2の設定ファイルlog4j2.xmlを"src/main/resources"に以下の内容で作成します。
property要素で指定しているログ出力先(filenamePattern)およびファイル名(filename)は、環境に合わせて任意の値に書き換えます。（この例ではC:\var\logs\demo.logにログを出力します）

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration strict="true">
  <properties>
    <property name="patternlayout">%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</property>
    <property name="filename">C:/var/logs/demo.log</property>
    <property name="filenamePattern">C:/var/logs/demo-%d{yyyy-dd-MM}-%i.log.gz</property>
  </properties>
  <appenders>
    <appender name="Console" type="Console" target="SYSTEM_OUT">
      <layout type="PatternLayout" pattern="${patternlayout}"/>
    </appender>
     <appender name="File" type="RollingFile" fileName="${filename}" filePattern="${filenamePattern}" append="true">
       <layout type="PatternLayout" pattern="${patternlayout}"/>
       <Policies>
         <OnStartupTriggeringPolicy/>
         <SizeBasedTriggeringPolicy size="100 KB"/>
       </Policies>
       <DefaultRolloverStrategy max="30"/>
     </appender>
  </appenders>
  <loggers>
    <logger name="com.example.demo" level="debug" additivity="false">
      <appender-ref ref="Console"/>
      <appender-ref ref="File"/>
    </logger>
    <root level="info">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>
```

アクセスしてきたクライアントのユーザーエージェントをログを出力するようにコントローラを修正します。

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;

@Controller
public class HelloController {
    // ↓ 追加
    private static final Logger LOG = LoggerFactory.getLogger(HelloController.class);
    // ↑ 追加

    @GetMapping(value = "/")
    // ↓ 修正
    public String hello(HttpServletRequest req, Model model) {
    // ↑ 修正
      // ↓ 追加
      LOG.debug("call hello - UA : {}", req.getHeader("User-Agent"));
      // ↑ 追加

      // ...省略...
    }

}
```

Eclipseのコンソールとログファイルに以下のようなログが出力されます。

# Eclipseを使わずにビルド・デプロイを行う

Eclipseを使わずにアプリケーションをビルドし、生成したwarファイルをTomcatサーバーにデプロイしてアプリケーションを起動する手順を説明します。

このためにJava (OpenJDK)、Maven、Tomcatを別途インストールします。
以降の説明は下記のディレクトリにインストールしたという前提で進めます。

```
C:\dev
    |
    `--- \jdk-11.0.2
    |
    `--- \apache-maven-3.6.1
    |
    `--- \apache-tomcat-9.0.24
```

## インストール

### OpenJDK

https://jdk.java.net/archive/

上記のアーカイブページにアクセスしてOpenJDK 11.0.2をダウンロードします。
ダウンロードしたアーカイブファイルを展開して`C:\dev\jdk-11.0.2`へ配置します。

**環境変数を設定できる場合**

|環境変数  |値                |備考      |
|:--------|:-----------------|:--------|
|JAVA_HOME|C:\dev\jdk-11.0.2 |新規登録、すでに登録されている場合は書き換えて問題ないか確認してください |
|PATH     |%JAVA_HOME%\bin   |PATHに追加|

**環境変数を設定できない場合**

コマンドプロンプトを起動し、以下のコマンドで環境変数を追加します。（コマンドプロンプトを閉じると追加した内容が消えます。）

```
> set JAVA_HOME=C:\dev\jdk-11.0.2
> set PATH=%PATH%%JAVA_HOME%\bin;
```

確認

```
> java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
```

### Maven

https://maven.apache.org/download.cgi

上記のダウンロードページにアクセスしてBinary zip archiveのMaven 3.6.1をダウンロードします。
ダウンロードしたアーカイブファイルを展開して`C:\dev\apache-maven-3.6.1`へ配置します。

**環境変数を設定できる場合**

|環境変数   |値                        |備考     |
|:---------|:-------------------------|:--------|
|MAVEN_HOME|C:\dev\apache-maven-3.6.1 |新規登録、すでに登録されている場合は書き換えて問題ないか確認してください|
|PATH      |%MAVEN_HOME%\bin          |PATHに追加|

**環境変数を設定できない場合**

```
> set MAVEN_HOME=C:\dev\apache-maven-3.6.1
> set PATH=%PATH%%MAVEN_HOME%\bin;
```

確認

```
> mvn --version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00)
Maven home: C:\dev\apache-maven-3.6.1\bin\..
Java version: 11.0.2, vendor: Oracle Corporation, runtime: C:\dev\jdk-11.0.2
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
```

### Tomcat

https://tomcat.apache.org/download-90.cgi

上記のダウンロードページにアクセスして64-bit Windows版のTomcat 9.0.24をダウンロードします。
ダウンロードしたアーカイブファイルを展開して`C:\dev\apache-tomcat-9.0.24`へ配置します。

**環境変数を設定できる場合**

|環境変数      |値                          |備考   |
|:------------|:---------------------------|:------|
|CATALINA_HOME|C:\dev\apache-tomcat-9.0.24 |新規登録、すでに登録されている場合は書き換えて問題ないか確認してください |
|PATH         |%MAVEN_HOME%\bin            |PATHに追加|

**環境変数を設定できない場合**

```
> set CATALINA_HOME=C:\dev\apache-tomcat-9.0.24
> set PATH=%PATH%%CATALINA_HOME%\bin;
```

確認

```
> version
Using CATALINA_BASE:   "C:\dev\apache-tomcat-9.0.24"
Using CATALINA_HOME:   "C:\dev\apache-tomcat-9.0.24"
Using CATALINA_TMPDIR: "C:\dev\apache-tomcat-9.0.24\temp"
Using JRE_HOME:        "C:\dev\jdk-11.0.2"
Using CLASSPATH:       "C:\dev\apache-tomcat-9.0.24\bin\bootstrap.jar;C:\dev\apache-tomcat-9.0.24\bin\tomcat-juli.jar"
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Server version: Apache Tomcat/9.0.24
Server built:   Aug 14 2019 21:16:42 UTC
Server number:  9.0.24.0
OS Name:        Windows 10
OS Version:     10.0
Architecture:   amd64
JVM Version:    11.0.2+9
JVM Vendor:     Oracle Corporation
```

インストールディレクトリの`conf\logging.properties`をテキストエディタで開き、51行目の下記の行をコメントアウトします。

```text
#java.util.logging.ConsoleHandler.encoding = UTF-8
```

## アプリケーションのビルド

コマンドプロンプトでアプリケーションのプロジェクトディレクトリへ移動します。（pom.xmlファイルのあるディレクトリ）
以下のコマンドでアプリケーションをビルドします。

```
> mvn clean package
```

次のようなメッセージが画面に表示されればビルドは成功です。targetディレクトリにwarファイルが生成されています。

```text
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.039 s
[INFO] Finished at: 2019-08-24T16:00:42+09:00
[INFO] ------------------------------------------------------------------------
```

targetディレクトリに移動します。

```
> cd target
```

ここに`demo-0.0.1-SNAPSHOT.war`というwarファイルが生成されていることを確認します。

```
> dir *.war
```

以上でビルドは完了です。

## アプリケーションのデプロイ

このwarファイルをTomcatサーバのwebappsディレクトリへdemo.warというファイル名でコピーします。

```
> copy demo-0.0.1-SNAPSHOT.war %CATALINA_HOME%\webapps\demo.war
```

コピーが出来たらTomcatサーバを起動します。

```
> catalina start
```

コマンドプロンプトとは別のウィンドウが開き、Tomcatサーバの起動ログが画面に表示されます。
この画面に"サーバーの起動 [x,xxx]ms"と表示されれば起動完了です。

ブラウザで "http://localhost:8080/demo/" にアクセスしてページが表示されることを確認します。

Tomcatサーバを停止させるには、起動したコマンドプロンプトで下記のコマンドを実行します。

```
> catalina stop
```

# GitHubからソースコードをダウンロード

https://github.com/rubytomato/demo-spring5-webmvc

緑色のボタン(Clone or download)をクリック → Download ZIPをクリックします。
ソースコードがzipファイルでダウンロードされます。
![g01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/b76716f2-1368-72c1-bcda-5addc024674f.png)

ダウンロードしたzipファイル(demo-spring5-webmvc-master.zip)を適当な場所へ展開します。
展開して出来たディレクトリ名を`demo-spring5-webmvc`にリネームして、Eclipseのワークスペースへコピーします。

Eclipseを起動しプロジェクト・エクスプローラー上で右クリック → `インポート` → `インポート...` → `Maven` → `既存 Maven プロジェクト`をクリックします。
![g02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/a8c90ec9-96fa-e2fc-6b3c-6bd1f430a264.png)

`参照...`ボタンをクリックしてワークスペース内にコピーした`demo-spring5-webmvc`ディレクトリを選択、次に`完了`ボタンをクリックします。
![g04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/17f88c38-1424-309a-5cc5-bf5e5dadbd1a.png)

プロジェクト・エクスプローラーに`demo-spring5-webmvc`がインポートされます。
プロジェクト名を右クリック → `ビルド・パス` → `ビルド・パスの構成...`をクリックし、下記4カ所を確認します。
**Java のビルド・パス**
ビルド・パス上のソース・フォルダーが図の通りであることを確認
![g08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/732ccb9c-41ea-3dac-5c58-8b4bd2820f2b.png)
**ターゲット・ランタイム**
Tomcat9 (java11)にチェックを入れ`適用`ボタンをクリック
![g05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/79a7c432-3f70-138c-c73b-208666e4b032.png)
**Web デプロイメント・アセンブリー**
パッケージ構造が図の通りであることを確認
![g06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/23da0452-8009-30fc-d092-98a64aff312d.png)
**プロジェクト・ファセット**
Javaおよび動的 Web モジュールのバージョンが図の通りであることを確認
![g07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/50203a6d-80ff-3cf4-4523-6ae18dbe6315.png)

図の通りであれば最後に`適用して閉じる`ボタンをクリックします。

サーバビュー上の`ローカルホストの Tomcat9(java11)`を右クリック → `追加および除去...`をクリックします。（Tomcat9を作成していなければ作成から）
![g09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/44349846-63f2-33b7-fad4-95e76d5afba1.png)

使用可能の欄から`demo-spring5-webmvc`を選択し`追加`ボタンをクリックして構成済みへ移動させ、`完了`ボタンをクリックします。
![g10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/3b3a6bb0-5e19-7363-b32b-1a95a2a52c71.png)

サーバビュー上の`ローカルホストの Tomcat9(java11)`を右クリック → `開始`をクリックします。
![g11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22772/b31734f9-6984-ed08-83ea-3325f7d3147c.png)

アプリケーションが起動したらブラウザで下記URLにアクセスしてページが表示されることを確認します。

`http://localhost:8080/demo-spring5-webmvc/`

`開始`をクリックしてもエラーが発生して開始できない場合

* プロジェクトにエラーが起きていないか確認（赤いエラーアイコンが付いていないか）
* プロジェクト名を右クリック → `Maven` → `プロジェクトの更新`
* メニューバー → プロジェクト → `クリーン` → `すべてのプロジェクトをクリーン`にチェック → `クリーン`
* サーバビューの`ローカルホスト の Tomcat9 (Java11)`を右クリック → `クリーン` 続いて、再度`ローカルホスト の Tomcat9 (Java11)`を右クリック → `公開`をクリック