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

#進行状況
- jsp⇔サーブレット間のパラメータの受け渡し
- クッキー／セッション管理

##今回やること
- EL式
- JSTLタグ

#EL式使いましょう
EL式（Expression Language）とは、ざっくり言うとjsp側でリクエストパラメータの受け渡しを簡潔に記述できる方法です。
`${パラメータ名}`と書くだけです。（オブジェクトの場合は`${パラメータ名.プロパティ名}`）

jsp側で`name`という名前のパラメータを受け取って表示させる場合、

```jsp:mypage.jsp(今まで)
<%
  String username=request.getAttribute("name").toString();
%>
<%=username%>さん、ようこそ
```

と二段階のプロセスを踏んでいましたが、EL式を使うと

```jsp:mypage.jsp
${name}さん、ようこそ
```
と書くだけで良くなります。
記述量が減って見やすくなるのもそうですが、`javaのロジックを書く必要がなくなる`ことが最大のメリットです。
EL「式」と付いているように、${age > 20}のように簡単な式を記述することも可能です。

#JSTLタグ使いましょう
前項でEL式が使えるようになりましたが、ループや条件分岐といった処理はどうしてもjavaのコードを埋め込まないといけません。
そこで登場するのが`JSTL`と呼ばれる`タグライブラリ`です。タグライブラリとは、`<forEach>`のように、HTMLのようなタグを使ってjavaのロジックを表現することができる機能を集めたファイル群です。
##導入方法
JSTLはApacheが提供している無料で使えるオープンソースのライブラリです。

・[Apache Taglibs Downloads](https://tomcat.apache.org/download-taglibs.cgi#Standard-1.2.5)

１．上記リンクを開き、ページ下部のjarファイルのうち`impl、spec、jstl`をダウンロード。
２．プロジェクトフォルダの`WEB-INF/lib`内に上記3つのjarファイルを格納。
３．jspファイルに以下を記述。

```jsp:mypage.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
```

４．`web.xml`のappバージョンが3.0以上の場合、2.4に書き換えましょう。（このコーナーでは3.1で作っていましたが、2.4以降ではJSTL内でEL式が使えないらしいです。不便！）

```xml:web.xml
<!-- 3.1はコメントアウト -->
<!--
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID"
version="3.1">
-->
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
```

ちなみに、appバージョン別のweb-appタグの記述方法は以下のサイトに詳しく載っています。
[KATSUMI KOKUZAWA'S BLOG](https://kokuzawa.github.io/blog/2015/04/07/web-dot-xmlfalsebaziyonbie-dtdxsdfalsexuan-yan-fang-fa/)

##使い方
- if文

```jsp:mypage.jsp
  <c:choose>
    <c:when test="${name == 'hato'}">管理者さん、こんにちは</c:when>
    <c:when test="${name == ''}">名無しさん、こんにちは</c:when>
    <c:otherwise>一般ユーザーさん、こんにちは</c:when>
  </c:choose>
```

|タグ|要素|内容|
|:-:|:-:|:-:|
|choose|-|このタグで囲った中身が一連のif文ブロック。|
|when|-|if文のif elseに相当。|
|when|item|このitemがtrueの場合、タグで囲まれた部分が実行。|
|otherwise|-|if文のelseに相当。whenのどこにもヒットしなかった場合に実行。|

- for文

```java:LoginServlet.java
List<String> list=Arrays.asList("one","two","three","four");
req.setAttribute("list",list);
```

```jsp:mypage.jsp

<c:forEach var="v" items="${list}" varStatus="list">
	${v} ${list.count}
	<!--
	one 1
	two 2
	three 3
	four 4
	が出力
	-->
</c:forEach>

<c:forEach begin="1" end="7" step="2" varStatus="c">
	hello ${c.count}
	<!--
	hello 1
	hello 2
	hello 3
	が出力
	-->
</c:forEach>
```

|タグ|要素|内容|
|:-:|:-:|:-:|
|forEach|var|itemsから取り出した要素にアクセスする変数|
||items|コレクションを指定（大体はEL式を書く）|
||varStatus|繰り返しの状態にアクセスする変数（ループ回数など）|
||begin|ループの開始位置|
||end|ループの終了位置|
||step|増加量（基本は1）|

上のforEachは拡張for文

```java:exFor.java
for(String item:list){
  System.out.println(item);
}
```

下のforEachは普通のfor文

```java:For.java
for(int i=1;i<=7;i=i+2){
  System.out.println("hello"+i);
}
```

と挙動が似ているので覚えやすいです。
##その他のタグについて
coreライブラリには他にも`<c:param>`や`<c:set>`などありますが、全てを説明するには長いので省略します。また、ライブラリも`format`、`xml`など豊富にそろっています。

#まとめ
- EL式で`<% request.getAttribute("hogehoge"); %>`から卒業
- JSTLで`<% if(～) %>`、`<% for(～) %>`から卒業
実用的に作る場合はjavascriptはどうしても必要になってきますが、EL式とJSTLを駆使することでjavaのロジックを書く必要がなくなり、jspファイルを簡潔にすることができます。