1. 序章

Expression Language(EL)は、Spring with SpELやJBosswithJBoss ELなど、多くのJavaフレームワークで採用されているスクリプト言語です。

この記事では、JSFによるこのスクリプト言語の実装であるUnifiedELに焦点を当てます。

ELは現在バージョン3.0であり、これにより、処理エンジンをスタンドアロンモード(たとえば、Java SEプラットフォーム)で使用できるようになります。 以前のバージョンは、JakartaEE準拠のアプリケーションサーバーまたはWebコンテナに依存していました。 この記事では、ELバージョン2.2について説明します。

2. 即時および延期された評価

JSFでのELの主な機能は、JSFビュー(通常はXHTMLマークアップ)とJavaベースのバックエンドを接続することです。 バックエンドは、ユーザーが作成したマネージドBean、またはHTTPセッションなどのコンテナー管理対象オブジェクトにすることができます。

EL2.2を見ていきます。 JSFのELには、即時構文ELと遅延構文ELの2つの一般的な形式があります。

2.1. 即時構文EL

JSP ELとも呼ばれるこれは、JavaWebアプリケーション開発のJSP時代から引き継がれたスクリプト形式です。

JSP EL式は、ドル記号( $ )で始まり、左中括弧( {)、実際の式、最後に右中括弧で閉じられます。角かっこ(} ):

${ELBean.value > 0}

この構文:

  1. ページのライフサイクルで(最初に)一度だけ評価されます。 これが意味するのは、その値です。 上記の例の式によって読み取られることは、ページがロードされる前に設定する必要があります。
  2. Bean値への読み取り専用アクセスを提供します。
  3. その結果、JavaBeanの命名規則を順守する必要があります。

ほとんどの用途では、この形式のELはあまり用途が広くありません。

2.2. 遅延実行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}

ただし、次の式を使用すると、ユーザーオブジェクトに値を設定できます。

<h:inputText id="firstName" value="#{ELBean.firstName}" required="true"/>

この種の処理に適格であるためには、変数はJavaBeanの命名規則に従う必要があります。 Beanの値をコミットするには、同封のフォームを保存する必要があります。

3.2. メソッド式

Unified ELは、JSFページ内からパブリックな非静的メソッドを実行するためのメソッド式を提供します。 メソッドには戻り値がある場合とない場合があります。

簡単な例を次に示します。

<h:commandButton value="Save" action="#{ELBean.save}"/>

The 保存() 参照されるメソッドは、という名前のバッキングBeanで定義されます ELBean。

EL 2.2以降では、ELを使用してアクセスするメソッドに引数を渡すこともできます。 これにより、例を次のように書き直すことができます。

<h:inputText id="firstName" binding="#{firstName}" required="true"/>
<h:commandButton value="Save"
  action="#{ELBean.saveFirstName(firstName.value.toString().concat('(passed)'))}"/>

ここで行ったことは、 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} :変数のビュー(ページ-)スコープマップ

次の簡単な例では、 headersimplicitオブジェクトにアクセスしてすべてのリクエストヘッダーと値を一覧表示します。

<c:forEach items="#{header}" var="header">
   <tr>
       <td>#{header.key}</td>
       <td>#{header.value}</td>
   </tr>
</c:forEach>

4. ELでできること

その汎用性において、ELは、Javaコード、XHTMLマークアップ、Javascript、さらにはfaces-config.xmlファイルのようなJSF構成ファイルで機能することができます。 いくつかの具体的なユースケースを調べてみましょう。

4.1. ページマークアップでELを使用する

ELは、標準のHTMLタグで使用できます。

<meta name="description" content="#{ELBean.pageDescription}"/>

4.2. JavaScriptでELを使用する

ELは、Javascriptまたは