EclipseでServletプログラムを作成する

#はじめに
前提としてEclipseを導入済みとします。
[Eclipseダウンロード](http://mergedoc.osdn.jp/)
今回はEclipseでServletとJSPを利用してHelloWorldを出力することを目指します。

##そもそもServletって何？
サーブレットとはWebサーバー上、つまりバックエンドで動くプログラムであり動的なWebページを実現するためのJavaで書かれたプログラムです。


>**動的なWebページ**とは...
同じURLをリクエストされた場合でもアクセスした人に応じてページの見え方を変えて提供するページのこと。例えばECサイト（ネットショッピングができるサイト）で、自分の閲覧履歴やお気に入りに追加した情報などを考慮してページが構成され、アクセスした人それぞれの好みや行動の傾向に合わせたページが提供されます。そのうちの1つの方法としてサーブレットが利用できます。

##Servletを学ぶこと
Java初心者にとってサーブレットを学ぶことは良い

- 現在も非常によく使われている技術。
- WebフレームワークがServletを隠ぺいしているので、素のServletを書くことはあまりないが
問題が起きたときは、Servletの知識が必要になること。
- Webアプリの基本的な仕組みが身につく


#Servletを動かす
##実行環境
- Eclipse4.16 
- Tomcat9
- Java11

##Servletプロジェクト作成
サーブレットの作成を行なう。
Eclipseの`ファイル`→`新規`→`その他`→`Webフォルダ`→`動的Webプロジェクト`の順に進める。
`適したプロジェクト名を入力`→`ターゲットランタイムは自分が持っているJavaのバージョンを選択`（設定から使用できるjavaバージョンを確認できる）→`完了`

##Servletクラスの作成
Webサーバー上で動くサーブレットを作成する。
`ファイル`→`新規`→`その他`→`Webフォルダ`→`サーブレット`→`適したパッケージ名`、`クラス名`（今回はservlet,SampleTest）を入力→`完了`
すると下のようなJavaファイルが作成される。

```java:SampleTest.java

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SampleTest
 */
@WebServlet("/SampleTest")
public class SampleTest extends HttpServlet {

    /**
     * @see HttpServlet#HttpServlet()
     */
    public SampleTest() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}
```

#HelloWorldを出力する
※今回はHTMLをServletで出力する方法もありますが省略します。

##フォワードを行うサーブレットクラス
今回はdoGetメソッドを編集します。

```java:SampleTest.java
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/view/sample.jsp").forward(request, response);
  }
```
フォワードは、RequestDispatcherインスタンスのfoward()メソッドで行います。
>**フォワード構文**

```java
RequestDispatcher dispatcher =
  request.getRequestDispatcher("フォワード先");
dispatcher.foward(request,response);
```
フォワード先はJSPファイルだけでなくサーブレットクラスも指定できる。
※ただし同じWebアプリケーションのものであること

- JSPファイルの場合
 - /Web-Contentからのパス
- サーブレットクラスの場合
 - /URLパターン  

##JSPファイルを利用する
コントローラーはユーザーからリクエストを受けて全体の制御を行うことに適したサーブレットクラスが担当し、
出力を行うビューはHTMLの出力を得意とするJSPファイルが担当する
###JSPファイルの作成
`WebContent/WEB-INF` を右クリックし `新規` → `フォルダ` →`フォルダー名を入力`→`完了`
※今回のフォルダ名は**view**とする
`view` を右クリックし `新規` → `その他` →`JSPファイル`→`次へ`→`フォルダー名を入力`→`完了`
でJSPファイル作成
※今回のファイル名は**sample.jsp**とする

#####JSPファイルへの直接リクエストの禁止
**`WEB-INF`配下に配置すること**
WEBアプリケーションを作ると、ブラウザからリクエストされるのは基本的にサーブレットクラスになります。JSPファイルはサーブレットクラスからフォワードされて動くことを前提に作成するので、ブラウザから呼び出されるとエラーや不具合が発生することがあるので直接リクエストができないようにしておきます。
ブラウザは`WEB-INF`以下に配置されたファイルを直接リクエストすることができません。

##表示するJSPファイル

```jsp:sample.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
```
今回は`Hello World`を出力したいのでJSPファイルに入力します。

##サーバーの起動
これで準備は整ったのでサーバーを起動しましょう。
`SampleTest.java`を右クリック`実行` → `サーバーで実行`
サーバーのタイプを`Tomcat v9.0サーバー`を選択
<img width="1000" alt="HelloWorld出力" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676116/d91ab98d-455c-c777-fac6-776825d041b4.png">
######上記の画面が出力されれば成功！

#最後に
今回はSevletを使用して基礎のHelloWorldを出力しましたが
次回はdoPostメソッドを使用してパラメーター取得を行います。