HttpServletRequestとHttpServletResponse

## HttpServletRequest、リクエスト情報の取得
サーブレットに対して送られてきたリクエストに関して、フォームなどで設定されたパラメータの取得やクッキーなどの情報などリクエストに含まれている情報を取得するには、doGetメソッドやdoPostメソッドの引数に指定されているHttpServletRequestインターフェースのオブジェクトを使用する。

「HttpServletRequest」インターフェースのオブジェクトからは色々な情報が取り出せる。
一番利用頻度が高いのが**リクエストパラメータ**（クライアント側のフォームから送られてきたデータ）取得する事。
リクエストパラメータは **「名前（キー名）」と「値」のペア** で送られ,
GETメソッドとPOSTメソッドの両方で送られてくる可能性がある

下記はサーブレットに対して「GET」メソッドでリクエストがあった場合に呼び出される「doGet」メソッド
```
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
                ~
                ~
  }
}
```
2つの引数が「doGet」メソッドには渡されていてその中の1つが「HttpServletRequest」インターフェースのオブジェクト。
クライアントからサーブレットに送られてくるリクエストに関する情報はこのオブジェクトに含まれている

### よく使われるメソッド
・**getParameterメソッド**:クライアントから送られてきたデータであるリクエストパラメーターを取得する
引数には、リクエストパラメーターの値に紐づかれているキー名を文字列で設定し、「値」を取得する。戻り値はString型で戻る。
```
String 変数名（オブジェクト） = request.getParameter("キー名");
```
・**getParameterValuesメソッド**:指定したリクエストパラメータ名に対応する全てのパラメータ値を取得し、「キー名」を引数に指定すると「値」を取得することが出来、パラメータが存在しない場合は、NULLを返す。
```
String[] 変数名（オブジェクト） = request.getParameterValues("キー名");
```

## HttpServletResponse、クライアントへの出力
サーブレットがリクエストのあったクライアントに対してHTML情報を出力するには、doGetメソッドやdoPostメソッドの引数に指定されているHttpServletResponseインターフェースのオブジェクトを使用する

下記はサーブレットに対して「GET」メソッドでリクエストがあった場合に呼び出される「doGet」メソッド。
```
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
                ~
                ~
  }
}
```
2つの引数が「doGet」メソッドには渡されていて、その中の1つが「HttpServletResponse」インターフェースのオブジェクト。
サーブレットはクライアントに何か出力する場合、このオブジェクトを利用して出力を行う。

### よく使われるメソッド
・**setContentTypeメソッド**:クライアントに対して何か出力するにあたってどのようなデータを送るのかコンテンツタイプの設定を指定するメソッド
コンテンツタイプの設定とは、クライアントサーバー間のコンテンツの種類を設定することである。
| 種類 | 拡張子 | コンテンツタイプ |
| --- | --- | --- |
| HTMLファイル | html, htm | text/html |
| テキストファイル | txt | text/plain |
| GIF | gif | image/gif |
| PNG | png | image/png |
| Windows 実行ファイル | exe | application/octet-stream |

```
public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
    //引数にコンテンツタイプを指定
    response.setContentType("text/html");
```

・**getWriterメソッド**:コンテンツタイプを設定したら、クライアントに対してデータ本文を送る。データを送信するには出力用のストリーム（ストリームというのは文字が順番に連続して並んでいる入れ物のこと）を取得し、そのストリームに書き出していく。その出力ストリームを取得するためのメソッド
（文字出力用のストリームの取得とは、HttpServletResponseオブジェクトから文字を出力する入れ物を取り出すこと）
```
public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
    response.setContentType("text/html");
    // 出力ストリームを取得
    PrintWriter out = response.getWriter();
```
＊PrintWriterクラスは書き込みに特化したクラスで主なメソッドに「print」メソッドと「println」メソッドがある。

## サンプルコード
```:html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>サンプル</title>
  </head>
  <body>
    <form action="test/SampleServlet" method="post">
      <input type="text" name="memo" />
      <input type="checkbox" name="address" value="tokyo" />東京
      <input type="checkbox" name="address" value="osaka" />大阪
      <input type="checkbox" name="address" value="nagoya" />名古屋
      <input type="submit" value="送信" />
    </form>
  </body>
</html>
```
```:Servlet
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.PrintWriter;
import java.io.IOException;
 
public class SampleServlet extends HttpServlet{
 
  public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException{
       
      // 引数にコンテントタイプの指定と合わせて文字コードを指定している
      res.setContentType("text/html; charset=UTF-8");
 
      //パラメータ"memo"の値を取得する　（String値の場合はgetParameterを使用）
      String str = req.getParameter("memo");
 
      //パラメータ"address"の値を取得する　（配列値の場合はgetParameterValuesを使用）
      String[] arr = req.getParameterValues("address");
 
      //結果を返す
      PrintWriter out = res.getWriter();
 
      //String値の場合
      out.println("<p>");
      out.println(str);
      out.println("</p>");
 
      //配列値の場合
      for(String a : arr){
        out.println("<p>");
        out.println(a);
        out.println("</p>"); 
      }
  }
}
```

## 参考記事
https://blog.java-reference.com/servlet-getparametervalues/

https://www.javadrive.jp/servlet/