目次へ

15.JSP2.1 Unified ELとは

2.1. Unified ELの導入

JSPではバージョン2.0からEL式(Expression Language)が導入されています。 EL式は「 ${式} 」というような形で記述し、 {} で囲まれた式を計算・評価し、その結果を出力します。 (詳しくはこちらをご覧ください) 一方JSFでも「 #{式} 」という形のEL式が使われていますが、その性質はJSPのEL式と互いに少し異なったものとなっています。 それゆえ、双方のEL式の相性が合わない、という事態が発生することがありました。

たとえば以下のようなコードを書いた場合です。

	<c:forEach var="book" items="${BooksBean.books}">
		...
		<h:inputText id="quantity" value="#{book.quantity}" ... />
		...
	</c:forEach>

JSPのforEachタグの中にJSFのinputTextタグが入れ子になっており、 それぞれのタグの中でJSPのEL式「 ${} 」とJSFのEL式「 #{} 」が使われています。 このような場合、forEachの繰り返しの度にinputTextタグは同じ"quantity"というIDで 入力フォームを生成しようとするため、エラーになります。 またitems属性で参照されているJSPのEL式"${BooksBean.books}"は、 JSFのライフサイクルに関わらず参照された時点での値を返すため、 入力された情報が適切に反映されないなどの問題もありました。

このように互換性のなさを指摘されていたEL式ですが、 今回のJSPのバージョンアップで「統一された式言語: Unified EL 」が導入されたことにより、 2つのEL式の整合性がとれたことになります。

具体的にはJSPで従来使われていた即時評価型のEL式「 ${} 」に加えて、 JSFで用いられていた遅延評価型のEL式「 #{} 」もJSPで使用可能になりました。 ちなみに、Unified ELは将来JSPの仕様の一部に留まらず独自のJSRを持つようになるだろう、 とSunのページには書かれています。

2.2 即時評価と遅延評価

Unified ELでは、即時評価式「 ${} 」と遅延評価式「 #{} 」の両方が使えるようになりました。 両者について簡単に説明します。

即時評価式では、ページがレンダリングされた時点で即座にその式が評価され、その結果が返されます。 たとえば、

	<t:test value=“${hoge}”/>

のように記述した場合、value属性には式が読み込まれた時点で変数hogeに入っている値が渡されます。 即時評価式はその性質から値をgetする場合にしか使えず、値をsetすることはできません。

いっぽう遅延評価式では、たとえば

	<t:test value=“#{hoge}”/>

と記述すると、value属性には式を評価した結果ではなく、式 "#{hoge}" がそのまま渡されます。 こうすることで、ページライフサイクル中の適切なタイミングでその式が評価されるというわけです。 実際の評価はタグハンドラの内部で行われることになります。 したがって遅延評価式はタグの中でしか使うことができません。 また、遅延評価式は値のget・setの両方に使えます。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp