進行状況
- jsp⇔サーブレット間のパラメータの受け渡し
- クッキー/セッション管理
今回やること
- EL式
- JSTLタグ
EL式使いましょう
EL式(Expression Language)とは、ざっくり言うとjsp側でリクエストパラメータの受け渡しを簡潔に記述できる方法です。
${パラメータ名}
と書くだけです。(オブジェクトの場合は${パラメータ名.プロパティ名}
)
jsp側でname
という名前のパラメータを受け取って表示させる場合、
<%
String username=request.getAttribute("name").toString();
%>
<%=username%>さん、ようこそ
と二段階のプロセスを踏んでいましたが、EL式を使うと
${name}さん、ようこそ
と書くだけで良くなります。
記述量が減って見やすくなるのもそうですが、javaのロジックを書く必要がなくなる
ことが最大のメリットです。
EL「式」と付いているように、${age > 20}のように簡単な式を記述することも可能です。
JSTLタグ使いましょう
前項でEL式が使えるようになりましたが、ループや条件分岐といった処理はどうしてもjavaのコードを埋め込まないといけません。
そこで登場するのがJSTL
と呼ばれるタグライブラリ
です。タグライブラリとは、<forEach>
のように、HTMLのようなタグを使ってjavaのロジックを表現することができる機能を集めたファイル群です。
導入方法
JSTLはApacheが提供している無料で使えるオープンソースのライブラリです。
1.上記リンクを開き、ページ下部のjarファイルのうちimpl、spec、jstl
をダウンロード。
2.プロジェクトフォルダのWEB-INF/lib
内に上記3つのjarファイルを格納。
3.jspファイルに以下を記述。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4.web.xml
のappバージョンが3.0以上の場合、2.4に書き換えましょう。(このコーナーでは3.1で作っていましたが、2.4以降ではJSTL内でEL式が使えないらしいです。不便!)
<!-- 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
使い方
- if文
<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文
List<String> list=Arrays.asList("one","two","three","four");
req.setAttribute("list",list);
<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文
for(String item:list){
System.out.println(item);
}
下のforEachは普通のfor文
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ファイルを簡潔にすることができます。