サーブレットの作成

# はじめに
こんばんわ、きりです。
本記事は[Nablarchを使ってみよう](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17)のサブ記事として作成しております。

[前回](https://qiita.com/kirin1218/items/eca5f166274b376410be)はMavenのアーキタイプより基本的なWebアプリケーションを作成しました。

今回は、簡単なサーブレットを作成してみたいと思います。

本記事は、[前回](https://qiita.com/kirin1218/items/eca5f166274b376410be)で作成したプロジェクトを使用しますので、プロジェクトをまだ作成していない場合は、まずは前回の記事を御覧ください。

本記事以外のコンテンツは[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)から閲覧可能です。

なるべく、初心者目線で作成するつもりですが、分かりづらい部分ありましたら、コメント頂きたいです。

# 動作環境
|種類|バージョン|
|---|---|
|OS|Windows Professional 20H2|
|Eclipse|2022 Full Edition|

※Eclipseのダウンロードについては、[こちら](https://qiita.com/kirin1218/items/02bfeb333335842c56ae)の記事をご確認ください。

# サーブレットとは
サーブレットはJavaで作成されたウェブコンポーネントでサーブレット・コンテナによって実行されます。

サーブレット・コンテナはウェブ・サーバまたはアプリケーション・サーバの一部で、クライアントからHTTP/HTTPSのリクエストに対して、サーブレットの設定に基づいてどのサーブレットを呼び出しを行ういます。また、サーブレットが生成した応答データをクライアントに応答します。

サーブレット・コンテナの例ととしてtomcatが存在します。

まとめると、サーブレットを動作させるには以下の３つが必要となります。
* サーブレットを実行するサーブレット・コンテナ(tomcatなど）
* サーブレット・コンテナが対象のサーブレットを決定するためのサーブレット設定
* Javaによって作成されたサーブレットというなのJavaプログラム

# プロジェクト設定の変更
サーブレットの話を進める前にMavenで作成したプロジェクトの設定をEclipseで作業しやすいように変更します

## Eclipseプロジェクトへ変更
以下の実行構成を追加して、Eclipseプロジェクトに変換します
※変換してもMavenコマンドは利用できます

|キー|値|例|
|---|---|---|
|種類|Mavenビルド||
|名前|任意の値|mvn-2-eclipse|
|基底ディレクトリー|${project_loc:web-app-sample}||
|ゴール|eclipse:eclipse||

## ファセットの設定
ファセットとはなんぞや？と思ったりもしますが、Eclipseに「私はWebアプリケーションのプロジェクトですよ」と認識してもらうための設定であり、その特性や要件を定義するための設定。ぐらいに思っておけばよいかなと思います。

プロジェクトのプロパティーを表示し、プロジェクト・ファセットを選択し、「ファセット・フォームへ変換」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/3e4f8011-f593-64bb-338d-90413d9a95ff.png)

動的Webモジュールをチェックし、「より詳しい構成が使用可能」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/460dd785-9c42-d30d-c2f6-a7f6940ef8eb.png)

「web.xmlデプロイメント記述子の生成」を選択し、OKボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/857fa2f6-bdd4-6d68-c0e8-ffbc17c25417.png)

元のダイアログで適用して閉じます

この作業により、プロジェクト内のeclipseの設定ファイルが自動生成されたり変更されたりして、動的Webモジュールの設定が追加されたようです。

## tomcatで実行
これまでの設定によりEclipseからtomcatにてプロジェクトを実行することができます

プロジェクト名を右クリック > 実行 > サーバで実行をクリックします

コンパイラのJavaバージョンに合わせて対象のtomcatを選択し、完了ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/b8e7d8df-c8d6-6b3b-5ee8-636bf9d94f9f.png)

サーバービューが表示され、下図のように、「起動済み、同期済み」となれば成功です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/c916509e-5279-579f-448e-d9e512708449.png)

ブラウザが立ち上がり画面が表示されるます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/a7a63c4e-1197-2f2c-7c37-9134eaeba3c4.png)

## tomcatの停止や実行、デバッグ
サーバの停止や実行、デバッグ起動はサーバービューより行えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/7fe79af7-cbd1-05a6-0b42-07badaadecd3.png)

## Javaソースフォルダの作成
MavenのWebアプリのアーキタイプですとソースフォルダが用意されていないため、ソースフォルダを以下の手順で作成する必要があるようです。

プロジェクト名を右クリック > 新規 > その他を　クリック
ウィザードにて、Java > ソースフォルダー　の順番で選択し、次へボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/e599b25b-897c-bd7b-76ad-023c95de8c80.png)

フォルダー名欄に「./src/main/java」と入力して、完了ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/df08e5cd-7747-c97f-8134-7a1c37fbb357.png)

プロジェクトにソースフォルダが追加されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/123c26fc-fa9a-f467-ad0b-7e9ff3f79dd8.png)

同じ要領で「./src/test/java」も追加しておきます

# サーブレット設定
さて、やっとはサーブレット設定について話を進めます。

さっそくですが、サーブレットという名のJavaクラスを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/c54f7e34-2ac5-9220-3feb-ad1a93d116bf.png)

パッケージとクラス名を指定して、完了ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/479c68f0-1e80-37ea-0318-9582e6e6a4a2.png)

ファイルは期待通り作成されましたが、エラーがいっぱい出てそうです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/968f2ff0-0599-98c2-1165-0bfe30f014a5.png)

必要なライブラリがプロジェクトに追加されていないようです。
pom.xml側で追加も可能ですが、今回はeclipseの設定から追加します。

プロパティー設定 > Javaのビルド・パス > クラスパス > ライブラリーの追加ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/75db9adf-34de-4a9d-4171-2eef229addb2.png)

サーバー・ランタイムを選択し、次へボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/18c4fe3f-b731-1d40-b3cf-2455ff103ee8.png)

実行環境に合わせて、選択し完了ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/dafe1355-ff7f-a644-b529-e97abfcc2f0d.png)

適用して閉じます

エラーが消えビルドが成功します。
マーカービューからもエラーが消えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/dea7fa92-f3b4-a1df-0a38-674b201d7635.png)

# サーブレットの動作確認
作成したサーブレットはソース（./serc/main/java/com/example/HelloServlet.java)内のWebServletアノテーション名(＠WebServletがアノテーションです）でアクセス可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/c4f94a1e-1925-0d95-7ca2-6b00128efc5a.png)
具体的には[tomcatの実行](##tomcatで実行)を行ったあと、URLに/HelloServletを追加してEnterを押すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/0778c23d-0ca7-41fc-5613-cc70bbb11a49.png)

上記のような画面が表示されれば成功です。


# サーブレットのソースの内容について
作成したサーブレットはソース（./serc/main/java/com/example/HelloServlet.java)にはdoGetとdoPostという2つのメソッドが用意されており、その名の通り、クライアントからGETアクセスとPOSTアクセスが行われた場合にそれぞれの関数が呼び出されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/658204e7-5dbc-bd00-e8a4-3218c2668bf3.png)

# 最後に
今回はサーブレットの作成と動作確認を行いました。
tomcatとサーブレットを利用することで、Httpリクエストに対してJavaで実装したプログラムを行うことができました。

次回はサーブレットと[JSPファイル](https://qiita.com/kirin1218/items/99a51d8ffed8b107b4f9#jspjava-servlet-pages%E3%81%A8%E3%81%AF)を組み合わせたページの表示を行ってみたいと思います。

他の記事については[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)から御覧ください。




# 参考リンク
* [Javaプロジェクト・ファセットという聞き覚えのない横文字について](https://kumaskun.hatenablog.com/entry/2019/06/17/231749)
* [プロジェクト・ファセット](https://www.ibm.com/docs/ja/rsas/7.5.0?topic=projects-project-facets)