ここでは、JavaServer Faces 1.1 式言語について説明します。JavaServer Faces 1.1 コンポーネントを使用する、J2EE 1.4 および J2EE 1.3 のプロジェクトでこの式言語を使用します。Java EE 5 のプロジェクトを使用している場合、コンポーネントは JavaServer Faces 1.2 コンポーネントで、統合式言語を使用します。この言語に関する記事については、次の Web ページを参照してください。
統合式言語の仕様の全体は、JavaServer Pages (JSP) 2.1 仕様をダウンロードする必要があります。JSP テクノロジおよびダウンロード用のリンクについては、次の Web ページを参照してください。
このトピックは、IDE によって作成される値バインド式を使わずに、独自の式を入力する必要がある上級ユーザーを対象としています。このページは、次の節で構成されています。
JavaServer Faces には、Web アプリケーションのページで、ページ Bean、およびセッション Bean やアプリケーション Bean など、Web アプリケーションに関連付けられたほかの Bean 内の JavaBeans コンポーネントにアクセスするために使用する式言語 (JSF EL) があります。たとえば、コンポーネントの「 text 」プロパティーをデータプロバイダまたは JavaBean プロパティーにバインドするときなど、ほとんどの場合、IDE によって正しい式が指定されます。
コンポーネントのプロパティーをバインドするには、Visual Web JSF ページにそのコンポーネントを追加し、コンポーネントを右クリックして「プロパティーのバインド」を選択します。表示される「プロパティーのバインド」ダイアログで、コンポーネントのプロパティーを選択し、そのプロパティーをバインドする JavaBean のプロパティーを選択できます。
コンポーネントをデータベース表にバインドする例として、コードサンプルには、 静的テキスト コンポーネントを使用しています。コードサンプルの作成方法は、次のとおりです。
IDE は自動的にデータベース表のデータプロバイダオブジェクトをページに追加し、「text」プロパティーをデータプロバイダの PERSON.PERSONID フィールドにバインドします。コンポーネントのテキストが 123 に変わります。
PERSON.NAME フィールドを選択し、「了解」をクリックして「text」プロパティーを正しいフィールドにバインドし直します。
JSP エディタで生成されたコードは、次のようになります。
<ui:staticText binding="#{Page1.staticText1}"
id="staticText1"
style="position: absolute; left: 216px; top: 192px"
text="#{Page1.personDataProvider.value['PERSON.NAME']}"/>
staticText を示します。staticText コンポーネントの XML 名前空間を定義する修飾子 ui: を使用します。ui: 修飾子は、ページのヘッダーで xmlns:ui="http://www.sun.com/web/ui" と定義されます。この名前空間は、「パレット」ウィンドウの「基本」、「複合」、「レイアウト」カテゴリで UI コンポーネントを描画するカスタムタグライブラリを示します。
同じ行で定義される JSP コード内の修飾子は、あと 2 つあります。
h: - ページのヘッダーで xmlns:h="http://java.sun.com/jsf/html" と定義されます。この名前空間は、JavaServer Faces リファレンス実装のコンポーネントを描画する JavaServer Faces カスタムタグライブラリを示し、主に「パレット」ウィンドウの「標準」カテゴリにあります。
f: - ページのヘッダーで xmlns:f="http://java.sun.com/jsf/core" と定義されます。この名前空間は、既存のイベントハンドラ、バリデータ、およびほかのアクションの JavaServer Faces カスタムタグライブラリを示します。
この 2 つの修飾子についての TLD ドキュメントは、次の場所にあります。
binding 属性は、このコンポーネントを、Page1 ページ Bean 内の特定の JavaBeans オブジェクト staticText1 に接続します。binding 属性と id、style、および text の各属性は、すべて JavaServer Faces のタグライブラリの属性です。最後の 3 つの属性 id、style、および text は、IDE でコンポーネントのプロパティーとして表され、コンポーネントの「プロパティー」ウィンドウで設定できます。
binding 属性と text 属性には、JavaServer Faces の式言語を使います。コンポーネントの「プロパティー」ウィンドウで、JavaServer Faces の式言語を使って value 属性を設定できます。
このあとの節で説明するように、JavaServer Faces の式言語の構文では区切り文字に #{} を使います。JavaServer Faces の式は、値バインド式 (UI コンポーネントまたはその値を外部データソースにバインド) またはメソッドバインド式 (バッキング Bean のメソッドを参照) のいずれかです。2.0 の式言語の混合リテラルや、評価の構文や演算子も使用できます。
JSF EL を使って、JavaBeans をコンポーネントのプロパティーにバインドし、コンポーネントがさまざまなソースのデータにアクセスする方法を簡素化できます。JSF EL の式では、 #{expr}; という構文を使います。
値バインド式の構文は、次の点を除き、JavaServer Pages の仕様 (第 2 版) の第 2.3 節~第 2.9 節で定義されている式言語の式の構文と同じです。
${ と } ではなく、#{ と } です。
区切り文字の違いに加えて、この 2 種類の式には、次の意味構文の違いもあります。
getValue メソッドを呼び出すことで JavaServer Faces の実装によって評価されます。
Application オブジェクトから取得された VariableResolver オブジェクトと PropertyResolver オブジェクトの機能が利用されます。アプリケーションで、機能を追加するプラグインのクラスを作成できます。
EditableValueHolder コンポーネント (任意の入力フィールドコンポーネント) の「value」プロパティーに値バインド式を使った場合、式は、要求処理ライフサイクルの Update Model Values 段階で、参照値の取得ではなく、参照値の変更に使用されます。
有効な値バインド式の例を示します。
#{Page1.name}
#{Foo.bar}
#{Foo[bar]}
#{Foo[“bar”]}
#{Foo[3]}
#{Foo[3].bar}
#{Foo.bar[3]}
#{Customer.status == ‘VIP’}
#{(Page1.City.farenheitTemp - 32) * 5 / 9}
Reporting Period: #{Report.fromDate} to #{Report.toDate}
setValue メソッドが呼び出される値バインド式では (たとえば、Update Model Values 段階での入力フィールドへの text プロパティーのバインド)、値バインド式の構文は、次のいずれかの形式に限られます。ここで expr-a は何らかのオブジェクトに評価される一般的な式で、value-b は識別子です。
#{expr-a.value-b}
#{expr-a[value-b]]
#{value-b}
ValueBinding インスタンスの getValue メソッドが呼び出され (たとえば、ページの表示中に、JSP タグ属性の式が評価されているとき)、式が評価され、その評価の結果が返されるとき、評価は次のように行われます。
. 演算子と [] 演算子の処理が統合されます。expr-a.expr-b は a["expr-b"] に相当します。式 expr-b が、値が識別子であるリテラルの構築に使用され、その値に [] 演算子が使用されます。
VariableResolver インスタンスによって評価されます。. 演算子または [] 演算子の左側の値が RowSet の場合、右側のオブジェクトが列名として処理されます。これらの演算子の評価の詳しい説明については、次の節を参照してください。
. 演算子または [...] 演算子は、すべてこの Web アプリケーションの Application インスタンスから取得された PropertyResolver インスタンスによって評価されます。
変数のプロパティーは、 . 演算子を使ってアクセスされ、任意に入れ子にできます。
ValueBinding の setValue メソッドが呼び出されるとき (たとえば、Update Model Values 段階での入力フィールドへの「text」プロパティーのバインド)、前の節で説明したように値バインド式の構文が限られます。実装では、次の処理を行なって、#{expra.value-b} または #{expr-a[value-b]} の形式の式を評価する必要があります。
expr-a を評価し、結果を value-a とします。
value-a が null の場合、PropertyNotFoundException をスローします。
value-b が null の場合、PropertyNotFoundException をスローします。
value-a がマップの場合、value-a.put(value-b, new-value) を呼び出します。
value-a が List または配列の場合
value-b を int に変換し、エラーが発生した場合は ReferenceSyntaxException をスローします。
value-a.set(value-b, new-value) または Array.set(value-b, new-value) を実行しようとします。
IndexOutOfBoundsException または ArrayIndexOutOfBoundsException がスローされた場合、PropertyNotFoundException をスローします。
EvaluationException をスローします。
value-a が JavaBeans オブジェクトである)
value-b を String に変換します。
value-b が value-a の書き込み可能なプロパティーである場合、設定メソッドを呼び出して new-value を渡します。例外がスローされた場合、 ReferenceSyntaxException をスローします。
PropertyNotFoundException をスローします。
式全体が 1 つの識別子から構成される場合は、次の規則が適用されます。
ReferenceSyntaxException をスローします。
new-value に置き換えられます。
new-value になります。
式言語では、次の暗黙オブジェクトが定義されています。
facesContext - 現在の要求の FacesContext インスタンス
param - 要求パラメータ名を 1 つの値にマップ
paramValues - 要求パラメータ名を値の配列にマップ
header - 要求ヘッダー名を 1 つの値にマップ
headerValues - 要求ヘッダー名を値の配列にマップ
cookie - Cookie 名を 1 つの Cookie にマップ
initParam - コンテキスト初期化パラメータ名を 1 つの値にマップ
さまざまなスコープの変数にアクセスできるオブジェクト
requestScope - 要求スコープの変数名をその値にマップ
sessionScope - セッションスコープの変数名をその値にマップ
applicationScope - アプリケーションスコープの変数名をその値にマップ
式でこれらのオブジェクトを名前で参照すると、適切なオブジェクトが返されます。暗黙的なオブジェクトは、同じ名前の属性よりも優先されます。たとえば、#{facesContext} は、別の値を含む既存の facesContext 属性があっても、FacesContext オブジェクトを返します。
式言語では次のリテラルが定義されています。
true と false
" は \"、' は \'、\ は \\ とエスケープします。
null
getValue の意味構文とその次の節で説明している . 演算子と [] 演算子に加えて、式言語には次の演算子があります。
+、- (2 項)、*、/、div、%、mod、- (単項)
and、&&、or、||、not、!
==、eq、!=、ne、<、lt、>、gt、<=、ge、>=、le。ほかの値、または Boolean、文字列、整数、または浮動小数点のリテラルと比較できます。
empty 演算子は、値が null であるか、空であるかの判別に使用できる前置演算子です。
A ? B : C。A の評価の結果によって、B または C を評価します。
演算子を優先順位の高い順に上から下、左から右に示します。
[] .
() (演算子の優先順位を変更)
- (単項) not ! empty
* / div % mod
+ - (2 項)
< > <= >= lt gt le ge
== != eq ne
&& および
|| or
? :
次の語は式言語用に予約されているので、識別子として使用できません。
および
|
false
|
le
|
not
|
div
|
ge
|
lt
|
null
|
empty
|
gt
|
mod
|
or
|
eq
|
instanceof
|
ne
|
true
|