Java Servlet と JSP で Hello World (Maven + Jetty で手軽に Web サーバ起動)

## 概要

- Java Servlet と JSP をローカル環境で動かす
- サーブレットコンテナには Jetty を使用する
- Maven のプラグインで Jetty を起動する

## 環境

- macOS Mojave
- OpenJDK 11.0.2
- Apache Maven 3.6.1
- Jetty 9.4.19.v20190610 (Servlet API 3.1, JSP 2.3)

## ソースコード

### ソースコード一覧

- pom.xml: Maven 用ビルド設定ファイル
- MyServlet.java: Java サーブレットのソースコード
- index.jsp: JSP のソースコード
- web.xml: Web アプリケーションの設定ファイル

```
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── MyServlet.java
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp
```

### pom.xml: Maven 用ビルド設定ファイル

- Java Servlet API 3.1 を使用するため dependency に javax.servlet-api を追加する。
- Maven から手軽に Jetty を起動して動作確認できるよう jetty-maven-plugin を追加する。

```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.example</groupId>
  <artifactId>my-servlet</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>my-servlet</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <jetty.version>9.4.19.v20190610</jetty.version>
  </properties>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- https://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html -->
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.version}</version>
      </plugin>
    </plugins>
  </build>

</project>
```

### MyServlet.java: Java サーブレットのソースコード

```java
package com.example;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

public class MyServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setContentType("text/html; charset=utf-8");
    PrintWriter out = resp.getWriter();
    out.println("<html><body>Hello, Servlet World!</body></html>");
    out.flush();
    out.close();
  }
}
```

### index.jsp: JSP のソースコード

```html
<html><body>Hello JSP World!</body></html>
```

### web.xml: Web アプリケーションの設定ファイル

- MyServlet.java のサーブレットに /my-servlet/* でアクセスできるようマッピングしている。

```xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>My Servlet Web Application</display-name>

  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/my-servlet/*</url-pattern>
  </servlet-mapping>
</web-app>
```

## Jetty を起動して Web アプリケーションにアクセスする

mvn jetty:run で Jetty を起動できる。

```
$ mvn jetty:run
```

http://localhost:8080/my-servlet/ にアクセスすると MyServlet.java で出力したコンテンツが返ってくる。

```
$ curl http://localhost:8080/my-servlet/
<html><body>Hello, Servlet World!</body></html>
```

http://localhost:8080/ にアクセスすると index.jsp に書いたコンテンツが返ってくる。

```
$ curl http://localhost:8080/
<html><body>Hello JSP World!</body></html>
```

## 参考資料
- [Maven Webapp Archetype – Maven Webapp Archetype](https://maven.apache.org/archetypes/maven-archetype-webapp/)
- [Chapter 23\. Maven and Jetty](https://www.eclipse.org/jetty/documentation/current/maven-and-jetty.html)
- [Configuring the Jetty Maven Plugin](https://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html)
- [What Version Do I Use?](https://www.eclipse.org/jetty/documentation/current/what-jetty-version.html)
- [web\.xml デプロイメント記述子の要素](http://otndnld.oracle.co.jp/document/products/wls/docs70/webapp/web_xml.html)
- [Overview \(Servlet 3\.1 API Documentation \- Apache Tomcat 8\.0\.53\)](https://tomcat.apache.org/tomcat-8.0-doc/servletapi/)