JSTLの再入門

#はじめに
歴史長いJSPで描画を書く際にはJSTLを使うと便利です。
JSTLはJavaServer Pages Standard Tag Libraryです。

`<% xxx %>`を使うとJSPのフォーマットなどは階層きれいに整理できないため、メンテナンス性は悪いです。
複雑のJSPの場合は、JSPファイルを分割するほか、JSTLのcoreタグを利用して分岐、LOOPなどを分かりやすくしましょう。

#ＥＬ式(Expression Langage）
EL式は${ ～ }タグを使用して記述します。

単純計算例：`${100 + 200 * 30}`, `${ "1" eq "1" ? "trueです" : "falseです"}`
pageContext、request例：`${user.userName}`, `${count}`
セッション例： `${sessionScope.user.userName}`
初期パラメータ例：`${initParam["param1"]}`
クッキー例：`${cookie["param1"].value}`
ヘッダー例：`${header['user-agent']}`

よく使う比較の書き方
１、等しい： `${a eq b}`
２、等しくない：`${a ne b}`　
３、Not：`${not a}`
４、Empty：`${empty a}`
５、Not Empty：`${not empty a}`
６、より大きい：`${a gt b}`
７、より小さい：`${a lt b}`
８、以上：`${a ge b}`
９、以下：`${a le b}`

EL式で書く際には、必ずsetする必要があります。
##NG例

```jsp
String data = "testです。";

<%= data %>  // OK

<c:out value=${data} /> // NG。data変数はrequest,pageContextなどに設定していないため

```

##OK例
```jsp
String data = "testです。";

pageContext.setAttribute("data", data);

<%= data %>  // OK

<c:out value=${data} /> // OK
```

#使えるタグライブラリ
|種類	|説明|
|:---:|:---|
|core	|forEach、if、変数の参照/設定などの基本的なタグ|
|fmt|	数値や日付のフォーマットなど|
|xml	|XML文書の解析、XSLスタイルシート|
|functions|	文字列一般関数（containsなど）|
|sql|	SQLを発行し、データベース操作する関数|

よく使うのは、core,function, fmtです。

#coreタグ
##導入
`<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>`

##タグ
|タグ	|説明|
|:---|:---|
|c:set|	変数をセット|
|c:remove|	変数を削除|
|c:out|	出力|
|c:if|	if文（単一の条件分岐）|
|c:choose, c:when, c:otherwise|if-else,if-elseif-else文（複数の条件分岐）|
|c:forEach|	ループ|
|c:forTokens|	文字列を区切り文字で分割|
|c:import|ファイルをインポート|
|c:redirect	|リダイレクト|
|c:url|URLを生成|
|c:catch	|例外処理|
|c:param	|パラメータを指定|

##利用例
```jsp
<c:set var="score" value="80" />

<c:choose>
	<c:when test=${score gt 90}>
		<c:out value="とても素晴らしいです。" />
	</c:when>
	<c:when test=${score gt 80}>
		<c:out value="優秀です。" />
	</c:when>
	<c:otherwise>
		<c:out value="頑張ってください。" />
	</c:otherwise>
</c:choose>
```

#fmtタグ
##導入
`<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>`

##タグ


|タグ|	説明|
|:---|:-----|
| fmt:formatNumber|	数値データをフォーマット|
|fmt:formatDate|	日付データをフォーマット|
|fmt:parseNumber|	文字列を数値データに変換|
|fmt:parseDate	|文字列を日付データに変換|
|fmt:bundle, fmt:message|リソースのメッセージを取得|
|fmt:requestEncording>|	リクエストの文字エンコーディングをセット|
|fmt:setLocale|	ロケールをセット|
|fmt:setTimeZone|	タイムゾーンをセット|
|fmt:timeZone|タイムゾーンをセット|

##利用例：日付フォーマット
```jsp
<fmt:formatDate value="${data.updateDate}" pattern="yyyy/MM/dd HH:mm"/>
```

#functionsタグ
##導入
`<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>`

##タグ
|タグ|	説明|
|:---|:-----|
|fn:contains()|	指定文字列が入っているか|
|fn:containsIgnoreCase()|	指定文字列が入っているか（大文字、小文字区別せず）|
|fn:endsWith()|	末尾文字列は指定文字列か|
|fn:escapeXml()|	エスケープ|
|fn:indexOf()|	指定文字列のindexを返す。存在しない場合は-1|
|fn:trim()|	文字列の前後の空白を削除|
|fn:startsWith()|	頭文字列は指定文字列か|
|fn:split()|指定文字列で分割|
|fn:toLowerCase()|	小文字に変換|
|fn:toUpperCase()|	大文字に変換|
|fn:substring()|	指定範囲内の文字列を取り出す|
|fn:substringAfter()|	指定文字列の後ろを取り出す|
|fn:substringBefore()|	指定文字列の前を取り出す|
|fn:length()|	文字列の長さを返す|
|fn:replace()|置換|

##利用例
```jsp
<c:set var="favs" value="サーカー、読書" />

<c:out value="${fn:contains(favs, '読書') ? '読書が大好きです。' : '読書に興味がありません。' }"></c:out>
```

#sql
##導入
`<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>  `

詳細：https://www.javatpoint.com/jstl-sql-tags

#xml
##導入
`<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> `

詳細：https://www.javatpoint.com/jstl-xml-tags

以上