Java Servlet

# Java Servletとは
Java Servletとは，Webサーバ上でWebページなどを動的に生成したり，データ処理を行うためにJavaで作成されたプログラム及びその仕様である．単にサーブレットと呼ばれる

サーブレットはMVCモデルにおける<font color="blue">コントローラ</font>であり，Webブラウザ(クライアント)からのリクエストを受け取ったり，レスポンスを返すことが役割となる.
Webページなどの生成に関する処理やデータベースの連携などは，**JSP**や**JavaBeans**などに依頼する．


また，サーブレットを実行するためには<font color="green">サーブレットコンテナ</font>という環境が必要である．サーブレットコンテナとは，クライアントからHTTPリクエストを受け取る役割を担い，受け取ったリクエストをJavaServletに渡して処理させるという仕組み．

# Servletの特徴やメリット

- **ライフサイクルの管理**
ライフサイクルとは，処理が始まってから終了するまでの一連の流れのこと．インスタンスが作成されてから破棄されるまでは，メモリ上にデータを保管するため，2回目以降の処理速度が速くなる
- **マルチスレッドに対応**
同時に複数の処理を行うことができる．複数のユーザから同時にアクセスがある場合でも，複数の処理が行えるので効率が良い
- **プラットフォームに依存しない**
Javaのプログラムから作られるので，OSやハードウェアなどに依存することはない．「一度書いたらどこでも動く」というJavaの理念をそのまま受け継いでいる．

# Servletファイルの基本構成
```java
//(1)必要なパッケージのインポート
import javax.servlet.*;
import javax.servlet.http.*;

@WebServlet("/hello") //(2)アノテーションでマッピング
public class HelloWorld extends HttpServlet{ //(3)HTTPServletクラスを継承
    //(4)HTTPリクエストに対するメソッドを記述
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException{
    /* 処理内容を記述*/
  }
}
```

**1. パッケージのインポート**
サーブレットを作成する上で必要となるクラスが含まれているパッケージは以下の２つ
```java
import javax servlet. * ;
import javax. servlet.http.* ;
```
**2. アノテーションでマッピング名を指定**
アノテーションのマッピング機能を利用することで，サーブレットをパス(URL)にマッピングすることができる．
`http://サーバホスト名:ポート番号/プロジェクト名/@WebServletアノテーション`のようにURLにアクセスされた場合にどのServletファイルを実行するかを指定する．

**3. HttpServletクラスを継承**
HttpServletクラスには多くのメソッドが定義されていおり，それを利用するために，作成したクラスに継承する．

**4. HTTPメソッドに対する処理を記述**
HTTPメソッドの種類ごとに対応するメソッドがそれぞれ用意されており，HTTPリクエストのメソッドによって対応するサーブレットのリクエストを変える．

|HTTPメソッド|用意されているメソッド|
|:--:|:--:|
|GET|doGet|
|POST|doPost|
|PUT|doPut|
|DELETE|doDelete|
|HEAD|doHead|
|TRACE|doTrace|
|OPTIONS|doOptions|

サーブレットクラスにこのどれかのメソッドを最低１つは実装する．

# HttpServletRequestとHttpServletResponse
全てのHTTPメソッドの引数には**HttpServletRequest**インスタンスと，**HttpServletResponse**インスタンスを引数にとる．
**HttpServletRequest**
HTTPリクエストに関する情報やデータを取得するために使用する．
クライアントからのパラメータ，ヘッダ，セッション情報を取得することができる．

**HttpServletResponse**
HTTPレスポンスに関する情報やデータを管理するために使用する．
クライアントに返すデータ・HTMLコンテンツ・JSON・画像などをクライアントへの出力データを設定することができる．

それぞれ多くのメソッドが用意されており，それを利用することでデータのやりとりなどを行う．

# JSPからServletにデータを送る
**JSP側のコード**
```jsp
<form action="/Servlet" method="post">
    <input type="text" name="inputName">
    <input type="submit" value=Submit">
</form>
```
JSPはフォーム送信することで，Servletにデータを送ることができる．form要素のaction属性は，データの送信先となるServletのURLを指定する．

**Servlet側のコード**
```java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // フォームの入力値を取得
    String inputValue = request.getParameter("inputName"); 
    // フォームの入力値(配列)を取得
	String[] inputValues = request.getParameterValues("inputNames");
}
```

`request.getParameter`によって入力値を受け取る．メソッドの引数にはフォームのinput要素のname属性に対応している．
(配列を受け取る場合，getParameterValuesメソッドを利用することで受け取ることができる．)

# ServletからJSPにデータを送る
**Servlet側のコード**
```java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String name = "Taro"
    
    request.setAttribute("user",name);

    RequestDispatcher dispatcher = request.getRequestDispatcher("/sample.jsp");
    dispatcher.foward(request,response);
}
```
`request.setAttribute()`を利用して，キーと値のセットでデータを指定する．
`RequestDispatcher`オブジェクトを利用して，データを受け渡すJSPのパスを指定する．

**JSP側のコード**
```jsp
<div>
    <% String name = (String request.getAttribute("user"); %>
    <p><%= name %>
</div>
```
`request.getAttribute()`の引数にServlet側の`setAttribute`で指定したキーを使用して，対応する値受け取る．