JSF EL 2の概要
1. 前書き
式言語(EL)は、Spring withSpELやJBoss with JBoss ELなど、多くのJavaフレームワークで採用されているスクリプト言語です。
この記事では、JSFによるこのスクリプト言語の実装であるUnifiedELに焦点を当てます。
ELは現在、バージョン3.0にあります。これは、たとえばJava SEプラットフォームなど、スタンドアロンモードで処理エンジンを使用できるようにするメジャーアップグレードです。 以前のバージョンは、JavaEE準拠のアプリケーションサーバーまたはWebコンテナに依存していました。 この記事では、ELバージョン2.2について説明します。
2. 即時および延期された評価
JSFのELの主な機能は、JSFビュー(通常はXHTMLマークアップ)とJavaベースのバックエンドを接続することです。 バックエンドは、ユーザーが作成したマネージドBean、またはHTTPセッションのようなコンテナ管理のオブジェクトにすることができます。
EL 2.2を検討します。 JSFのELには、即時構文ELと遅延構文ELの2つの一般的な形式があります。
2.1. 即時構文EL
これは、JSP ELとも呼ばれ、Java Webアプリケーション開発のJSP時代から引き継がれたスクリプト形式です。
JSP EL式は、ドル記号($)で始まり、左中括弧(\{)、実際の式、最後に右中括弧(\{)で終わります。 t2)s):
${ELBean.value > 0}
この構文は
-
ページのライフサイクルで(最初に)1回だけ評価されます。 これが意味することは、その値です。 上記の例の式による読み取りは、ページがロードされる前に設定する必要があります。
-
Bean値への読み取り専用アクセスを提供します。
-
その結果、JavaBeanの命名規則に従う必要があります。
ほとんどの用途では、この形式のELはあまり汎用的ではありません。
2.2. Deferred Execution EL
遅延実行ELは、JSF固有に設計されたELです。 JSP ELとの主な構文上の違いは、「$」ではなく「#”」でマークされていることです。
#{ELBean.value > 0}
遅延EL:
-
JSFライフサイクルと同期しています。 つまり、遅延ELのEL式は、JSFページのレンダリングのさまざまな時点(開始時と終了時)で評価されます。
-
Bean値への読み取りおよび書き込みアクセスを提供します。 これにより、ELを使用してJSFバッキングBean(またはその他の場所)に値を設定できます。
-
プログラマーがオブジェクトの任意のメソッドを呼び出し、ELのバージョンに応じて、そのようなメソッドに引数を渡すことができます。
Unified ELは、遅延ELとJSP ELの両方を統合する仕様であり、同じページで両方の構文を使用できます。
3. ユニファイドEL
Unified ELでは、値式とメソッド式という2つの一般的な式を使用できます。
そして、簡単なメモ-次のセクションでは、アプリで利用可能ないくつかの例を示します(最後のGithubリンクを参照)。
http://localhost:8080/jsf/el_intro.jsf
3.1. 値の式
値式により、配置場所に応じて、マネージドBeanプロパティを読み取ったり設定したりできます。
次の式は、マネージドBeanプロパティをページに読み取ります。
Hello, #{ELBean.firstName}
ただし、次の式では、ユーザーオブジェクトに値を設定できます。
この種の処理に適格であるためには、変数はJavaBean命名規則に従う必要があります。 Beanの値をコミットするには、囲んでいるフォームを保存するだけです。
3.2. メソッド式
Unified ELは、JSFページ内からパブリックな非静的メソッドを実行するメソッド式を提供します。 メソッドには戻り値がある場合とない場合があります。
以下に簡単な例を示します。
参照されているsave()メソッドは、ELBean.という名前のバッキングBeanで定義されています。
EL 2.2以降、ELを使用してアクセスされるメソッドに引数を渡すこともできます。 これにより、次のように例を書き換えることができます。
ここで行ったことは、inputTextコンポーネントのページスコープのバインディング式を作成し、value属性をメソッド式に直接渡すことです。
変数は特別な表記、中括弧またはエスケープ文字なしでメソッドに渡されることに注意してください。
3.3. 暗黙のELオブジェクト
JSF ELエンジンは、いくつかのコンテナ管理オブジェクトへのアクセスを提供します。 それらのいくつかは以下のとおりです。
-
{Application}:{servletContext}としても使用できます。これは、Webアプリケーションインスタンスを表すオブジェクトです。
-
#{applicationScope}:Webアプリケーション全体でアクセス可能な変数のマップ
-
#{Cookie}:HTTPCookie変数のマップ
-
#{facesContext}:FacesContextの現在のインスタンス
-
#{flash}:JSFFlashスコープオブジェクト
-
#{header}:現在のリクエストのHTTPヘッダーのマップ
-
#{initParam}:Webアプリケーションのコンテキスト初期化変数のマップ
-
#{param}:HTTPリクエストクエリパラメータのマップ
-
#{request}:HTTPServletRequestオブジェクト
-
#{requestScope}:変数のリクエストスコープマップ
-
#{sessionScope}:セッションスコープの変数マップ
-
#{session}:HTTPSessionオブジェクト
-
#{viewScope}:変数のビュー(ページ-)スコープマップ
次の簡単な例では、headers暗黙オブジェクトにアクセスして、すべてのリクエストヘッダーと値を一覧表示します。
#{header.key}
#{header.value}
4. ELでできること
ELは、その汎用性において、Javaコード、XHTMLマークアップ、Javascript、さらにはfaces-config.xmlファイルなどのJSF構成ファイルでも使用できます。 いくつかの具体的なユースケースを調べてみましょう。
4.1. ページマークアップでELを使用する
ELは、標準のHTMLタグで紹介できます。
4.2. JavaScriptでELを使用する
ELは、Javascriptまたは
ここでは、バッキングBean変数がjavascript変数として設定されます。
4.3. 演算子を使用してELのブール論理を評価する
ELはかなり高度な比較演算子をサポートしています。
-
eq等式演算子、「==.”」と同等
-
ltは演算子より小さく、「<」と同等です。
-
leが演算子以下で、「⇐」に相当します。
-
gtが演算子より大きく、「>」と同等です。
-
ge以上、「>=.」と同等
4.4. バッキングBeanのELを評価する
バッキングBeanコード内から、JSFアプリケーションを使用してEL式を評価できます。 これにより、JSFページとバッキングBeanを接続する可能性が広がります。 暗黙のELオブジェクトを取得するか、バッキングBeanから実際のHTMLページコンポーネントまたはその値を簡単に取得できます。
FacesContext ctx = FacesContext.getCurrentInstance();
Application app = ctx.getApplication();
String firstName = app.evaluateExpressionGet(ctx, "#{firstName.value}", String.class);
HtmlInputText firstNameTextBox = app.evaluateExpressionGet(ctx, "#{firstName}", HtmlInputText.class);
これにより、開発者はJSFページと対話する際の柔軟性が大幅に向上します。