Help us understand the problem. What is going on with this article?

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

進行状況

  • jsp⇔サーブレット間のパラメータの受け渡し
  • クッキー/セッション管理

今回やること

  • EL式
  • JSTLタグ

EL式使いましょう

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

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

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

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

mypage.jsp
${name}さん、ようこそ

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

JSTLタグ使いましょう

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

導入方法

JSTLはApacheが提供している無料で使えるオープンソースのライブラリです。

Apache Taglibs Downloads

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

mypage.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式が使えないらしいです。不便!)

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

使い方

  • if文
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文
LoginServlet.java
List<String> list=Arrays.asList("one","two","three","four");
req.setAttribute("list",list);
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文

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

下のforEachは普通のfor文

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

と挙動が似ているので覚えやすいです。

その他のタグについて

coreライブラリには他にも<c:param><c:set>などありますが、全てを説明するには長いので省略します。また、ライブラリもformatxmlなど豊富にそろっています。

まとめ

  • EL式で<% request.getAttribute("hogehoge"); %>から卒業
  • JSTLで<% if(~) %><% for(~) %>から卒業 実用的に作る場合はjavascriptはどうしても必要になってきますが、EL式とJSTLを駆使することでjavaのロジックを書く必要がなくなり、jspファイルを簡潔にすることができます。
hatopo
java/SpringBoot/python 底辺SESから大手子会社のSEへ奇跡の転職を果たしました。これからも日々勉強です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away