JSF EL 2の紹介

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. ページのライフサイクルで(最初に)1回だけ評価されます。 これが意味することは、その値です。 上記の例の式による読み取りは、ページがロードされる前に設定する必要があります。

  2. Bean値への読み取り専用アクセスを提供します。

  3. その結果、JavaBeanの命名規則に従う必要があります。

ほとんどの用途では、この形式のELはあまり汎用的ではありません。

2.2. Deferred Execution EL

遅延実行ELは、JSF固有に設計されたELです。 JSP ELとの主な構文上の違いは、「$」ではなく「#”」でマークされていることです。

#{ELBean.value > 0}

遅延EL:

  1. JSFライフサイクルと同期しています。 つまり、遅延ELのEL式は、JSFページのレンダリングのさまざまな時点(開始時と終了時)で評価されます。

  2. Bean値への読み取りおよび書き込みアクセスを提供します。 これにより、ELを使用してJSFバッキングBean(またはその他の場所)に値を設定できます。

  3. プログラマーがオブジェクトの任意のメソッドを呼び出し、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ページと対話する際の柔軟性が大幅に向上します。

5. ELでできないこと

EL <3.0にはいくつかの制限があります。 次のセクションでは、それらのいくつかについて説明します。

5.1. オーバーロードなし

ELはオーバーロードの使用をサポートしていません。 そのため、次のメソッドを使用したバッキングBeanで:

public void save(User theUser);
public void save(String username);
public void save(Integer uid);

JSF ELは、次の式を適切に評価できません。

JSFELResolverは、beanのクラス定義を内省し、java.lang.Class#getMethodsによって返される最初のメソッド(クラスで使用可能なメソッドを返すメソッド)を選択します。 返されるメソッドの順序は保証されておらず、これにより必然的に未定義の動作が発生します。

5.2. 列挙型または定数値なし

JSF EL <3.0は、スクリプトでの定数値または列挙の使用をサポートしていません。 したがって、次のいずれかを持つ

public static final String USER_ERROR_MESS = "No, you can’t do that";
enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };

次のことができないことを意味します


5.3. 組み込みのヌルセーフティはありません

JSF EL

したがって、以下の式のpersonがnullの場合、式全体が見苦しいNPEで失敗します。

Hello Mr, #{ELBean.person.surname}"

6. 結論

JSF ELの基本、長所、制限のいくつかを検討しました。

これは主に用途の広いスクリプト言語であり、改善の余地があります。これは、JSFビューをJSFモデルとコントローラーにバインドする接着剤でもあります。

この記事に付属するソースコードは、GitHubで入手できます。