JSP

Javaのビューでよく使うJSPについて。

以下も参照

自分ルール

  • JSPのタグとHTMLのタグでも入れ子構造は保つ
  • HTMLの属性値にタグを使わない。EL式を使う

変数に値を格納する

set を使うことでJSP中で使う変数に値を格納することができる。

<c:set var="hoge">ほげほげ</c:set>

制御構文

分岐

test属性に条件をELで書くのが定番

<c:if test="${hoge == 'ほげ'}">
    <p>ほげ</p>
</c:if>

ループ

みんな大好き foreach を使う。

規定回数ループ

0から9までの10回ループ

<c:forEach var="i" begin="0" end="9" step="1">
    <p>hogehoge ${i}</p>
</c:forEach>

規定回数ループ(2刻み)

<c:forEach var="i" begin="0" end="10" setp="2">
    <p>${i}</p>
</c:forEach>

規定回数ループ(0.5刻み)

ループ範囲を倍にして2で割ると0.5刻みにできる。ちなみにstepに0.5を指定することはできない。

<c:forEach var="i" begin="0" end="20" setp="1">
    <p>${i / 2}</p>
</c:forEach>

コレクションのループ

items に List や 配列を指定(スコープ中の変数名)するとその1個が var で指定した変数に格納される。varStatusに指定したモノからループ状態の情報を得ることができる

<c:forEach var="hoge" items="hoges" varStatus="s">
    <p>ブツそのもの ${hoge}</p>
    <p>インデックス ${s.index}</p>
    <p><c:if test="${s.first}">先頭です</c:if></p>
    <p><c:if test="${s.last}">最後です</c:if></p>
</c:forEach>

indexはゼロスタート。

決まった値でループ

予め決まった値で決まった回数だけループしたい場合はitemsにコンマ区切りで列挙すればよい

<c:forEach var="hoge" items="ほげ,ぴよ,ふが" varStatus="s">
    <p>■■ ${hoge} ■■</p>
</c:forEach>

これはforeachのリテラル表記とも言えるのか

日時操作

現在時をとる

このように書くと指定したスコープにidに指定した変数名で今日日付のdate型を設定することができる。

<jsp:useBean id="hoge" class="java.util.Date" scope="page" />

設定できたのであとはこのようにELを使って自由にやればよい

<fmt:formatDate value="${hoge}" pattern="yyyy" />

日数等の時間間隔を計算する

本当はserviceとかhelperに寄せたい機能ですけどカンタンなものはビュー側でもできるので緊急回避的に・・・

date型にはgetTimeという現在時のミリ秒単位まで取得できるアクセサが用意されているのでこいつを使ってEL中で

${hoge.time}

のようにアクセサを呼び出してやればミリ秒で手に入るのでこいつを引いたり割ったりすると

${(hoge.time - piyo.time) / (24 * 60 * 60)}

日数とかいろいろ求まる。問題はELの商は整数の範囲ではなく小数の単位までいってしまうことだ・・・

文字列の結合

単に結合

JSPは単なるprintの羅列なので普通に並べて書けば文字列の結合になる。

EL式で使う値の結合

EL式中では+記号による文字列結合ができない。なので

<c:set var="hoge">${piyo},${fuge}</c:set>
${hoge}

のように書けば一応できる。ってこんなの正しい使い方なのだろうか・・・

別のJSPを取り込む

動的 include

他のJSPを取り込みたい場合。

hoge.jsp に piyo.jsp を取り込むには、hoge.jsp 中にこのように記述する

<jsp:include page="piyo.jsp" />

これが動的 include と呼ばれるもので hoge.jsp, piyo.jsp がそれぞれ JSP として解釈された後、タグ記述位置に放り込まれる。

この時にpiyo.jspに対してhoge.jsp側からパラメータを与えたい場合はこのようにする。

<jsp:include page="piyo.jsp?aaaa=ああああ" />

取り込まれた piyo.jsp 側ではこのように暗黙に作られた変数から EL式で値を取り出すことができる。

${param.aaaa}

↓のような記述で引数を渡すこともできる

<jsp:param name="aaaa" value="ああああ" />

この場合 取り出す側は

paramValues.aaaa[0]

のように取り出す。

↓こののように個別に取り出すこともできるが前述のように配列扱いにしたほうが中身が空っぽでもエラーが出ないのでこちらのほうが使い勝手が良い。

${param.aaaa}

注意としてこの形式で渡せるパラメータは基本Stringであり、複雑な構造のインスタンスを渡すことはできない。

静的 include

jsp の include タグではなく include ディレクティブを使うと静的に include される。 静的 include とは JSP が解釈される前に単に字面上の JSP っぽい文字列としてディレクティブ位置に放り込まれる。 つまりベースとなる JSP と include される JSP が一体化した JSP になった後それが解釈されて HTML等に変換される。

このため変数のスコープをベースの JSP と共有できるという特徴がある。 逆に include される JSP のスコープが外部に漏れてしまう可能性もある。

スコープの概念が無いので、パラメータを渡すという概念も無い。単にその場に JSP ソースが展開されるだけである。

しかし、パラメータの取りうる値の範囲が狭いのなら多段に静的 include することで呼び出すファイル名にパラメータを練り込むという実装もありだろう。ベースとスコープを共有しているので include される JSP 間での挙動の変化をパラメータ化すればいいだけ。これでいいのか?

タグ

java/jsp/start.txt · 最終更新: 2020-06-05 13:56 by ore