【おそらく一番簡単】Apache Tomcat + Java ServletでWEBアプリケーション開発

# 概要
JavaでWEBアプリケーション開発を行おうとした時に、色々と調べてみると、
JavaEEやSpring Bootを用いたWEBアプリケーション開発の記事が大量に出てくると思います。
（※おそらく今のトレンド的にも、当たり前の話なんでしょうが。）

上記技術やMaven（やGradle）を、組み合わせて自動デプロイを
やってみようと思う人も多いと思います。

ただ、いざ上記を組み合わせて、開発環境を構築しようと試みてみると、
思わぬ所でエラーが大量に発生したり、
サーバ起動しているのに「404 Not Found」のレスポンスステータスが返ってきたりと、
逆にハマるポイントが多々出てくるかと思います。

なので、まずは、純粋な「Apache Tomcat」と「Java Servlet」を使っての
WEBアプリケーション開発を行って、画面の表示を行うことを考えました。

JavaEEやSpring Bootの使用や、Mavenを使ってみるとかなんて、その後拡張すれば良いのです。

# 開発環境
・Eclipse IDE for Enterprise Java Developers
・Apache Tomcat v8.0

※Eclipseは事前にダウンロード＆インストールしておいて下さい。
　Apache Tomcatは本書内でダウンロード＆インストールします。

# 動的WEBプロジェクトの作成
① Eclipseから以下手順で動的WEBプロジェクトの作成を行います。
　「ファイル」->「新規」->「動的WEBプロジェクト」

② プロジェクト名は、本記事を見ていらっしゃる方のお好きにつけて頂いて構いませんが、
　ここでは「helloworld」としておきます。

③ ターゲット・ランタイムですが、デフォルトで「Apache Tomcat v7.0」となっていると思います。
　「Apache Tomcat v7.0」ではJavaEE7をサポートしていない為、
　ここでは、新規ランタイムから「Apache Tomcat v8.0」をダウンロード＆インストールしましょう。
　![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/eb454a71-2225-9914-1c76-6bc44363dd11.png)
　
④ 画面を進めると次のような画面になります。
　ここでは、「ダウンロードしてインストール」を選択して下さい。

　※注意※
　　この後、ディレクトリを指定してダウンロード＆インストールが開始されるのですが、
　　予め、eclipseのディレクトリに、新規フォルダ（apache-tomcat-8.0）といったフォルダを作成して、
　　そこにダウンロート＆インストールするようにしてください。
　　これをしないと、フォルダ構成がグチャグチャになります。
　![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/d5c8be34-70da-4263-71f0-ef5ea85ffaee.png)

⑤ Apache Tomcatのインストール完了すると、「完了」ボタンが活性化されるので、
　「完了」ボタンを押下すれば、プロジェクト作成完了です。

# ソースコード作成
① 「hellowold」のパッケージを開いて、「Javaリソース -> src」のディレクトリを右クリックし、
　「新規 -> クラス」を押下する。その際に、名前を「HelloWorld」にして下さい。
　
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/b3b29fbe-9d1b-99ae-c2f9-968d9a9f6003.png)

③ 完了ボタンを押下し、「HelloWorld.java」が出来ている事を確認できると思います。

```java:HelloWorld.java
package helloworld;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
　*  「HelloWorld」を画面に表示するクラス
 */
@WebServlet("/helloworld01")
public class HelloWorld extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("Hello World!");
	}
}
```

④ 「helloworld」のパッケージを右クリックし、「エクスポート -> WARファイル」から、
　「helloworld.war」の作成を行って下さい。（※出力先はどこでもいいです。）


# サーバ作成（Apache Tomcat v8.0）＆起動
① ここからはEclipseを用いて、新規に「Apache Tomcat v8.0」のサーバを作成していきましょう。
　Eclipseに「サーバ」タグが存在すると思います。こちらをクリックして下さい。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/2354be6e-3887-56fa-0e43-77efaaae6afe.png)

② 新規サーバを作成をクリックして、サーバーのタイプを「Apache Tomcat v8.0」に設定して、
　**※※特に設定をいじらず、そのまま「終了」して下さい。※※**
　（「次へ」押下後の構成済みリソースの選択等は、ここでは気にしないでおいて下さい。
　　設定を行おうと思うと、本書の理解の妨げになると思ってます。）

③ 作成したサーバを起動したいところですが、もう少し設定に付き合って下さい。
　作成したサーバに対して右クリックして「プロパティ」を選択すると、以下の画面に遷移します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/0a275a70-ef4e-a1c1-ca83-8a58b2c51e4a.png)

④ ここでロケーションが初期値**「ワークスぺース・メタデータ」**になっていると思いますので、
　ロケーションの切り替えを実施して、上記のような「/***/ローカルホストのTomcat」にロケーションの切り替えを実施して下さい。（その後、適用して閉じる）

⑤ その後、サーバーをダブルクリックし、以下の画像を参照に、設定を行ってください。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/a980a8be-f270-53d5-69ee-aabeddcc76a1.png)

⑥ この後、やっとサーバ起動です！
　サーバを右クリックして「開始」を押下して下さい。（※サーバー変更の保存を促す表示が出た際には、適用して下さい）

⑦ サーバ起動が完了しましたら、以下URLをブラウザ上で打ってみてください。
　Apache Tomcatの管理画面が表示されればOKです。
　http://localhost:8080/
　![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/cda677f2-e62a-80c2-175b-9d8374e64c80.png)

# WARファイルのデプロイ
① 以降は、作成したWARファイルをApache Tomcatに、デプロイする流れです。
　デプロイする為には、上記画面の右端にある**「Manager App」**のボタンから行うのですが、
　ユーザの認証画面が表示され、先に進めないと思います。
　これらの設定は「Apache Tomcatv8.0」をインストールしたディレクトリから以下で設定します。
　・tomcat-users.xml（※confディレクトリ内）

　まずは、上記のファイルを開きましょう。

② 33行目～39行目に以下の記述があると思います。

[設定前]

```
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
  <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
  <user username="role1" password="<must-be-changed>" roles="role1"/>
-->
```
③ <-- と --> は、コメントアウトにあたるので、削除しちゃいましょう。
　残った個所は以下の[設定後]で、全て上書きを行っちゃってください。（いろいろと制約があったりするので…。）

[設定後]

```
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager-gui"/>
  <role rolename="manager-status"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>
  <user username="tomcat" password="s3cret" roles="tomcat"/>
  <user username="both" password="s3cret" roles="tomcat,role1"/>
  <user username="role1" password="s3cret" roles="role1"/>
  <user username="manager" password="s3cret" roles="manager-gui,manager-status,manager-script,manager-jmx"/>
  <user username="admin" password="s3cret" roles="admin-gui,admin-script"/>
```

④ 設定後に書き換えたら、「tomcat-users.xml」を保存しておいて下さい。

⑤ ユーザの設定も完了したので、サーバを右クリックして「再開」（※サーバ再起動）して下さい。

④ Apache Tomcatの管理画面が開いたら**「Manager App」**をクリックし、以下で認証を行ってください。
　ユーザー　: manager
　パスワード: s3cret

⑤ ページ遷移が正しく行われると思います。
　[補足]
　　今回の設定では以下のボタンは、以下のユーザで認証出来るようになっております。
　　別の機会に他ページも見てみてください。（※パスワードは、s3cret固定）
　　・「Server Status」ボタン
　　　　⇒ ユーザー「manager」を利用
　　・「Manager App」ボタン
　　　　⇒ ユーザー「manager」を利用
　　・「Host Manager」ボタン
　　　　⇒ ユーザー「admin」を利用

⑥ 「Manager App」の画面が開いたら、真ん中くらいにある以下から、
　「helloworld.war」の選択を行ってください。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/f3825d6b-a9ce-73d7-07bc-4af3dc1789ee.png)

⑦ 「配備」ボタンを押下でデプロイ完了です！
　これで、以下のURLをブラウザ上で見てみると・・・
　http://localhost:8080/helloworld/helloworld01
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644011/d872e667-dcee-e7f3-af46-11d90b92f92b.png)

無事、「Hello World!」が表示できました！


# 終わりに
今回、スクラッチでサーバアプリケーションの作成を行おうとしたのですが、
サーバエラーが発生したり、画面が「404 Not Found」が出たりとうまくいきませんでした。

もちろん調べれば、各々解決策が出てくるのですが、
今回自分がハマった点について、全て１つのサイトに纏まっているサイトがなかなか見つからなかったので、
本記事の作成を行いました。

同じようなエラーの原因でハマっている人の参考になれば幸いです。