値バインディングについて

コンポーネント・タグの属性の値をアプリケーション内の別のクラスにあるプロパティの値にバインドすることで、動的データを表示または更新できます。これは、値バインディングと呼ばれます。値バインディングにはJSF EL式を使用します。

通常、値バインディングの対象はマネージドBeanのプロパティです。たとえば、従業員の名前を表示する式は、#{employee.firstName}のようになります。この式のemployeeはfaces-config.xmlファイルに登録されているマネージドBeanの名前、firstNameはそのBeanのプロパティです。

JSF実装でJSF EL式が検出されると、式の最初の部分(前述の例ではemployee)が、次の表に示されているJSF事前定義の暗黙オブジェクトのリストで検索されます(セッション・オブジェクト以外のオブジェクトはすべて読取り専用であるため、UIInputコンポーネントの値として使用しないでください)。

暗黙オブジェクト

内容

adfFacesContext 現在のリクエストのadfFacescontext

applicationScope

アプリケーション・スコープの属性値のMap。属性名がキーです。

Cookie

現在のリクエストのCookie値のMap。Cookie名がキーです。

facesContext

現在のリクエストのFacesContextインスタンス。

header

現在のリクエストのHTTPヘッダー値のMap。ヘッダー名がキーです。

headerValues

String配列のMapで、現在のリクエストのHTTPヘッダーに対するすべてのヘッダー値が含まれています。ヘッダー名がキーです。

initParam

このWebアプリケーションのコンテキスト初期化パラメータのMap

param

このリクエストのリクエスト・パラメータのMap。パラメータ名がキーです。

paramValues

String配列のMapで、現在のリクエストのリクエスト・パラメータに対するすべてのパラメータ値が含まれています。パラメータ名がキーです。

requestScope

このリクエストのリクエスト属性のMap。属性名がキーです。

sessionScope このリクエストのセッション属性のMap。属性名がキーです。

view

このリクエストに対するFacesRequestに格納されている、現在のコンポーネント・ツリーのルートUIComponent

このリストで検出されない場合、実装では、リクエスト、セッションおよびアプリケーションのスコープが(この順序で)検索されます。この中でも検出されない場合は、JSF VariableResolverを使用して、名前が、faces-config.xml構成ファイルに登録されているすべてのマネージドBeanの名前と比較されます。ここで検出された場合は、マネージドBean作成機能によって、Beanでデフォルトのコンストラクタ・メソッドがコールされ、Beanがインスタンス化されます。データを表示するコンポーネント・タグに、Beanのプロパティにバインドされている属性がある場合は、対応するgetメソッドがBeanでコールされ、データが表示されます。バインドされたタグでデータが取得されると、対応するsetメソッドがコールされ、新規データでBeanが更新されます。

事前定義のオブジェクト、スコープ内のオブジェクトまたはマネージドBeanのいずれかに加えて、値バインディングの対象をプリミティブ、構造またはコレクションにしたり、式に文字列リテラルを含めることもできます。

たとえば、JSFページで、従業員名、部門番号および雇用日の従業員情報を収集するとします。これらはすべて、既存のview.backing.Employee Beanのプロパティです。ユーザーがそのページで情報を入力して発行したときは、そのデータでEmployee Beanを更新し、アプリケーションのバックエンドでオブジェクトを処理してデータベースを更新します。ページは、次のようになります。

従業員名、部門番号および雇用日を入力するフォーム

Employee Beanを更新するには、JSPで、データを収集するinputTextタグを、JSF EL式を使用してEmployee Beanの対応するプロパティに値バインドします。たとえば、従業員の名前を収集するテキスト・ボックスに対するJSPのコードは、次のようになります。

<h:inputText value="#{employee.name}"/>    

前述のように、コンポーネント・タグの値は、JSPで使用可能な暗黙オブジェクトやリソース・バンドルなどの他のクラスにバインドすることもできます。たとえば、loadBundleタグを使用して、JSPでリソース・バンドルをロードする場合は、コンポーネント・タグの値を、そのリソース・バンドル内のメッセージにバインドできます。前述の例を使用すると、outputLabelタグの値として"Employee Name"と入力するかわりに、式を使用して、値をリソース・バンドルのnameメッセージにバインドします。この方法では、リソース・バンドルの複数のバージョンを使用して、テキストを簡単にローカライズできます。

JSPのコードは、次のようになります。

<f: loadBudle basename="view.messages" var="msgs">

... 

<p>
   <h:outputLabel value="#{msgs.name}"/>
<h:inputText value="#{employee.name}"/> </p> <p> <h:outputLabel value="#{msgs.deptno}"/> <h:inputText value="#{employee.deptno}"/> </p> <p> <h:outputLabel value="#{msgs.hiredate}"/> <h:inputText value="#{employee.hiredate}"/> </p>

この例では、コンポーネント・タグのValue属性がデータにバインドされます。この場合、コンポーネント自体と同じタイプにバインドする必要はありません。

 

Binding属性を使用すると、コンポーネント・インスタンスをBeanのプロパティにバインドすることもできます。この方法では、コンポーネントの表示を詳細に制御できますが、Binding属性の値は、コンポーネントと同じタイプであることが必要です。詳細は、「タグ属性のバインドとコンポーネント・インスタンスのバインドの比較」を参照してください。

ほとんどのタグ属性で値バインディングを使用できます。ただし、次のタグ属性ではメソッド・バインディングを使用する必要があります。

詳細は、「メソッド・バインディングについて」を参照してください。


マネージドBeanについて
マネージドBeanおよびバッキングBeanの開発
プロパティへのコンポーネントの値バインド