JSF EL


JavaServer Facesは、Webアプリケーションページで使用される表現言語(JSF EL)を提供し、ページBeanおよびWebアプリケーションに関連する他のBean(セッションBeanおよびアプリケーションBean)のJavaBensコンポーネントにアクセスする。ほとんどの場合、IDEは正しい表現を指定します。たとえば、コンポーネントのtextデータ提供器またはJavaBean属性に属性が紐付けられている場合。
JavaServer Faces表現言語文法にはセパレータ#{}以下のようなものが使われています。JavaServer Faces表現は、UIコンポーネントまたはその値を外部データソースに結びつけるための値バインディング式であってもよく、方法バインディング式であってもよい(Beacnメソッドを参照するための)。この表式はまた、混合型と計算文法、および2.0式言語の演算子を受け入れることができます。
JavaServer Faces EL表式文法
JSF ELは、様々なソースからのデータアクセスを容易にするために、JavaBensをコンポーネント属性に結びつけるために使用されてもよい。JSF EL表式は文法墯{expr}を使います。
値バインディング表現の文法はJavaServer Pages仕様(バージョン2.0)2.3節から2.9節まで定義されている表現言語表現の文法と類似していますが、以下の違いがあります。
  • 値バインディング表現の表式セパレータは、(##)ではなく、嚖{と}です。
  • 値バインディング表現はJSP表現言語関数をサポートしていません。
  • これらの2つの表現は、セパレータにおいて区別がある以外に、以下の意味においても異なる。
  • プレゼンテーション中に、値バインディング表現はJavaServer Facesにより計算されます。ページのコンパイルコードではなく、(getValueメソッドを呼び出すことにより)。
  • ページがなくても、プログラミングで値バインディング式を計算することができます。
  • 値バインディング式計算は、現在のWebアプリケーションのAppplicationオブジェクトを通じて、既に設定されているVarable ResolaverとPropertyResolaverオブジェクトの利用可能な機能を利用して、アプリケーションに追加の機能をもたらすプラグインの代替クラスを提供することができます。
  • Editable ValueHolderコンポーネント(任意の入力フィールドコンポーネント)の値属性に対する値バインディング表現を使用すれば、参照の値を変更することができ、ライフサイクルの「更新モデル値」の段階で検索するのではなく、参照の値を変更することができます。
  • 有効な値バインディング式の例は、
       #{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メソッドを呼び出すための値バインディング式(例えば、モデル値を更新する間にフィールドの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は、その値が識別子の種類を作成するために使用され、その後、[]演算子はその値とともに使用される。
  • Varable Resoliverインスタンスにより、表式の一番左の識別子が計算され、この例は、このWebアプリケーションのAppplicationの例から得られたものである。演算子の左側にある値がRowSetである場合、右側のオブジェクトは列名として扱われます。これらの演算子の完全な計算については、次のセクションを参照してください。
  • PropertyResolaverのインスタンス計算式において.または[...]演算子の各例において、PropertyResolaverは、このWebアプリケーションのAppplicationの例から得られたものである。
  • 変数の属性に演算子を使ってアクセスし、任意にネストすることができます。
  • 設定値語義
    Value BindingのsetValue方法が起動された場合(例えば、モデル値の更新中にフィールドのtext属性バインディングを入力する)、値バインディング文法の制限は、上述のように一部に記載されている。下記の処理を実行しなければ、26852;{expra.value-b}または萼{expr-a[value-b]]フォーマットの表現を計算することができません。
  • expr-aをvalue-aと計算します。
  • value-aが空であれば、PropertyNot FoundExceptionを抛り出す。
  • value-bが空であれば、PropertyNotFoundExceptionを抛り出す。
  • value-aをマッピングするとvalue-a.put(value-b,new-value)を呼び出します。
  • もしvalue-aがListまたは配列であれば:
  • value-bをintに強制し、エラーが発生した場合はReferenceSyntxExceptionをスローします。
  • 適宜value-a.set(value-b,new-value)またはAray.set(value-b,new-value)を実行してみる。
  • IndexOutOfBounds ExceptionまたはArayIndexOutOfBounds Exceptionがすでに投げ出されている場合は、PropertyNotFoundExcetion ptもスローされます。
  • 他の異常が発生した場合、Everaluation Exceptionを抛り出す。
  • そうでなければ以下の操作を行う(value-aはJavaBensオブジェクト):
  • value-bをStringに強制する。
  • value-bがvalue-aの作成可能な属性である場合(JavaBens毎の仕様)、setterメソッドを呼び出す。異常が発生したらReferenceSyntax Exceptionをスローします。
  • そうでないとPropertyNotFoundExceptionを投げ出します。
  • この表式全体に識別子が含まれている場合、以下の規則が適用されます。
  • 識別子が以下に説明するいずれかの隠しオブジェクトの名称に一致する場合、ReferenceSyntxExceptionをスローする。
  • そうでなければ、識別子が要求範囲、セッション範囲、またはアプリケーション範囲内の属性のキーワードと一致すると、対応する属性値がnew-valueに置き換えられる。
  • そうでなければ、新しい要求範囲属性が作成され、そのキーワードは識別子であり、その値はnew-valueである。
  • オブジェクトを隠す
    表式言語は隠しオブジェクトのセットを定義します。
  • faces Contect-現在要求されているFaces Contectの例。
  • param-要求パラメータ名を単一の値にマッピングします。
  • パラムValues-要求パラメータ名を値の配列にマッピングします。
  • header−要求タイトル名を単一の値にマッピングする。
  • headerValues−要求タイトル名を値の配列にマッピングする。
  • クッキー-クッキー名を単一のクッキーにマッピングします。
  • init Param−コンテキスト初期化パラメータ名を単一の値にマッピングする。
  • 様々な範囲の変数のオブジェクトへのアクセスを許可します。
  • request Scope-要求範囲の変数名をそれらの値にマッピングします。
  • session Scope-セッション範囲の変数名をその値にマッピングします。
  • アプリケーション範囲の変数名をその値にマッピングします。
  • 表式が名前でオブジェクトを参照すると、該当するオブジェクトが返されます。隠しオブジェクトは同じ名前の属性より優先度が高いです。例えば、既存のfaces Contect属性がいくつかの他の値を含んでいても、xtはFaces Contectオブジェクトに戻ります。
    タイプ
    式言語には以下のタイプが定義されています。
  • ブール型:trueとfalse
  • フルサイズ:Javaと同じ
  • 浮動小数点型:Javaと同じ
  • 文字列型:単引用符と二重引用符を使用;転じて、'、'は\'に転じ、\'は\'に転じます。
  • 空:null
  • 演算子
    上記意味を得る以降の章で論じる.[]演算子のほかに、式言語には次の演算子があります。
  • 算術演算子:+、-(二元)、*、/、div、%、mod、-(一元)
  • 論理演算子:and、&&&、or、𞓜、not、!
  • 関係演算子==、eq、!=、ヌ、<、lt、>、gt、<=、ge、>=、le。他の値、またはブール型、文字列型、整数または浮動小数点型と比較することができます。
  • 空演算子:empty演算子は、値がnullか空かを判定するために使用できるプレフィックス演算です。
  • 条件演算子:A?B:Cです。BまたはCを計算します。具体的な状況はAの計算結果に依存します。
  • 高い順から低い順に並べられた演算子の優先度は以下の通りです。
  • []
  • ()(演算子の優先度を変更する)
  • -(一元)not!emppty
  • */div%mod
  • +-(二元)
  • <=>=lt gt le ge
  • =eq ne
  • &and
  • 12462 or
  • 単語を保留する
    以下の単語は表現言語のために保存されています。識別子としては使えません。
    and
    false
    はい、
    not
    div
    ge
    lt
    Null
    empty
    gt
    mod
    or
    eq
    instance of

    true
    1.from Sun
    http://developers.sun.com/docs/jscreator/help/2update1/jsp-jsfel/jsf_expression_laguage.intro.
    2.from Java Enterprise in a NutShell
    http://book.itzero.com/read/others/0512/OReilly.Java.Enterprise.in.a.Nutshell.3rd.Edition.Nov.2005_html/059101422/javantnut 3-CHP-5-SEC-4.