【JavaServlet】千里の道も一歩から　二歩目


#jspファイル作りましょう
まずはひな形から

```html:login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン画面</title>
</head>
<body>

</body>
</html>
```
1行目の<%@　～　%>はjspファイルを記述するときのお約束で、それ以外は基本的にHTMLのように扱える
ではbody内を実装していくよ

```html:login.jsp
<form action="/ServletApp/mypage" method="post">
name:<input type="text" name="name"><br>
password:<input type="text" name="password"><br>
<input type="submit" value="login">
</form>
```
以下は起動時の画面※現時点では起動しても何も表示されないよ
<img width="409" alt="servlet5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/3d701366-c01f-705e-1b8f-ece04cc55ba2.png">
それでは順に解説

|タグ名|要素名|説明|
|:-:|:-:|:-:|
|**form**|action|submit要素をクリックしたときの遷移先<br>フォルダ構造にもよるが、基本的には<br>http\://localhost:8080/プロジェクト名/action名|
||method|getとpostの2種類から指定<br>get・・・遷移先のURLの最後に入力したパラメータがくっつく(　/action名?name=hoge&password=foo　といった感じ)<br>post・・・くっつかない(今回使用する方)<br>使い分ける要点は後日記事にする|
|**input**|type="text"|テキストフィールド|
||name|サーバー側で入力データを取得するときのキー|
|**input**|type="submit"|formタグ内のデータをサーバーへ送信するボタン|
formのactionに指定するパスですが、
プロジェクト名＝`ServletApp`
遷移させたいjsp＝`mypage.jsp`
の時は`/ServletApp/mypage`と指定します
#サーブレット作りましょう
適当にパッケージを作成したらjavaファイルを新規作成
[スーパークラス]にHttpServletと入力して[参照]をクリック
<img width="440" alt="2020-05-25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/b911b8e0-66eb-4b33-0b0d-d6dca4eea800.png">
[一致する項目]からHttpServletを選択して[OK]をクリック
<img width="290" alt="2020-05-25 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/53a2d299-d1ff-c3da-479a-d5d5fb272cca.png">
クラスを作成したら、[ソース]-[メソッドのオーバーライド]の順にクリック
<img width="270" alt="servlet6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/545e7476-3677-d07c-f400-ce7f8bb8498e.png">
[オーバーライドまたは実装するメソッドを選択]から、
「doGet」、「doPost」、「destroy」、「init（引数なし）」の4つを選択して[OK]をクリック
<img width="380" alt="2020-05-25 (4).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/44ca34d8-eec4-04b8-2588-29a1c713c6eb.png">
これでサーブレットで使うメソッドが追加される
メソッドの中身は消してOK
※レスポンス用の引数の命名は基本的に「res」なので、下の画像ように「resp」となっていたら「res」に直した方がいいかも
<img width="669" alt="servlet7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/29a34d82-2d46-2d80-6fab-600761e932da.png">
まずメソッドから解説

|メソッド|説明|用途|
|:-:|:-:|:--:|
|**doGet**|jspのformタグのmethodにgetを指定するとこのメソッドが呼びだされる|画面遷移時に実行したい主な処理|
|**doPost**|〃にpostを指定すると呼び出されるとこのメソッドが呼び出される|〃|
|**destroy**|サーブレット破棄時に動く処理|ログ出力処理など|
|**init**|最初に動く処理|変数の初期化処理など|
doGetとdoPostは利用する方だけを実装しても動くが、method="post"を指定したのにdoGetしか実装してなかった・・・といった事を防ぐため、基本的には両方宣言する
このとき、利用しない方のメソッド内には`doXXX(req,res)`を記述する
そうすると下のような感じになる
<img width="668" alt="servlet8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/91ef30e0-9043-cb24-3dc7-914ea63612b0.png">
では中身を書いていきましょう
主に使うのは下のやつ

|変数|メソッド|説明|
|:-:|:-:|:-:|
|res|setCharacterEncoding(String charset)|jspから受け取ったパラメータを指定した文字コードに変換|
|〃|addCookie(Cookie cookie)|クッキーを設定※後日解説|
|〃|sendRedirect(String URL)|指定したURLにリダイレクト（遷移）|
|req|getParameter(String key)|jspのnameで指定した要素名の値を取得|
|〃|getSession|セッションを取得（後日解説）|
|〃|setAttribute(String key,Object value)|jspに送る要素名と値を設定|
|〃|getRequestDispacher(String jsppath)|送りたいjspへのファイルパスを設定|
具体的な実装内容がこちら
<img width="646" alt="servlet10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624514/8eac6f8a-18e2-9b99-ea08-60bec6822044.png">


・18行目　文字コードをUTF-8に設定する
・19、20行目　それぞれ引数にname、passwordを指定することで

```html:login.jsp
name:<input type="text" name="name"><br>
password:<input type="text" name="password"><br>
```
↑の2つのテキストフィールドから入力値を取得できる

・22行目　パスワードにgoogleを入力していたらグーグルのページへ遷移させる
・24、25行目　次のjspに渡す要素の名前と値を設定する
（25行目のように、もとのjspには無い要素でも関係なく設定できる）
・26行目　次のjspの格納パスを拡張子付きで指定する
最後にforward(req,res)を忘れずにつなげること

#遷移先のjsp書きましょう

```html:mypage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>マイページ</title>
</head>
<body>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%
	String name=request.getParameter("name");
	List<String> list=new ArrayList<>();
	list.add("Hello!");
%>
<%=name%>さん、<%=list.get(0)%>
</body>
</html>
```
説明のため、する必要性皆無なコードになっていますが許して
・javaのコードを書きたい　⇒　<%　～　%>で囲う
・変数の値を出力したい　⇒　<%=　～　%>で囲う
・javaのライブラリを使用したい　⇒　<%@　～　%>で囲う
ちなみに、requestとresponseはライブラリの宣言をしなくても使えます

[三歩目に続く](https://qiita.com/hatopo/items/74c4d62899ab8d810a6d)