1) EL式について
JSP2.0で採用されたEL式(Expression Language)をXHTMLで使用することができます。
ただし現段階では、値の参照にしか用いることができないため、演算式のような記述や、
スコープの指定ができません。
EL式は式言語とも呼ばれ、${式}
のような形式で記述します。
以下はEL式の使用例です。
<?xml version="1.0" encoding="Shift_JIS" ?>
<html><head><title>Hello</title></head>
<body>
ようこそ${hello.name}さん<br/>
${hello.name}さんは
${hello.age}歳ですね。<br/>
</body>
</html>
${hello.name}は「オブジェクト"hello"の
メンバ"name"を参照する」という意味になります。
又、メンバを指定しない(${hello})場合は、スコープから取得したデータのtoString()を
返します。
JSPで記述すると以下の構文と同じ意味になります。
<%
HelloBean bean = (HelloBean)request.getAttribute("hello");
String name = bean.getName();
out.print(name);
%>
この例では、リクエストスコープから引数"hello"に指定した値を取得していますが、
EL式の場合は、以下の順序で全てのスコープを対象に、データの検索を行います。
(1) リクエストスコープから引数helloに該当するデータを検索
(1-1) helloデータがHitした場合は、helloのプロパティnameを取得します
(2) リクエストスコープに無ければ、セッションスコープから引数helloに該当するデータを検索
(2-1) helloデータがHitした場合は、helloのプロパティnameを取得します
(3) セッションスコープに無ければ、アプリケーションスコープから引数helloに該当するデータを検索
(3-1) helloデータがHitした場合は、helloのプロパティnameを取得します
(4) どのスコープからもhelloデータが検出できなかった場合は、メンバの有無によって動作が以下のように
変わります。
(4-1) メンバ(name)が指定されている場合、nameに該当するデータを各スコープから検索し、
nameに該当するデータが見つかった場合は、nameデータを返します※1
(4-2) メンバ(name)が指定されていない(${hello}のみ)場合は、nullを返します
(4-1)のパターンが少し特殊で(というより仕様として妥当かどうかといった根本的な問題を含んではいますが )、以下のようなケースで用いることができます。、
たとえば、更新画面表示アクションでは、ポストされた情報がmessageオブジェクト(フォームオブジェクト)
として渡されてきます。
そして、このオブジェクトをリクエストスコープにセットしているので、更新画面を作成するときの
データ検索パターンは、(1-1)パターンが該当します。
又、更新画面で入力内容を編集後、サブミットすると、更新アクションを実行しています。
このとき入力チェック(doValidateメソッド内)で入力エラーが発生した場合、
フレームワーク内部でリクエストされたデータをリクエストスコープに再セットし、
呼出もとの画面に戻ります。
この場合のデータ検索パターンは、(4-1)パターンに該当します(前回値保持のケース)。