この章の内容は次のとおりです。
JDeveloperをADF FacesおよびJSFと組み合せて使用すると、EL式の作成や自動コンポーネント・バインディングなどのようにページやマネージドBeanを宣言的に生成できるケースが多くなります。また、ナビゲーションや構成を制御するメタデータなどのXMLメタデータが宣言的に生成されるケースも多くなります。
大まかにとらえると、ADF Facesのビュー・プロジェクト開発プロセスは次の作業で構成されます。
FaceletsページまたはJavaServer Pages (JSP)のいずれかを使用した「表示」ページの作成。
アプリケーションのデプロイ。デプロイの詳細は、『Oracle ADFアプリケーションの管理』を参照してください。アプリケーションでADF FacesをADFモデル・レイヤー、ADFコントローラおよびADFビジネス・コンポーネントとともに使用する場合は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「Fusion Webアプリケーションのデプロイ」の章を参照してください。
開発サイクル全体を通じて継続されるタスクとしては、次のものがあります。
JDeveloperには、デバッグやテストの機能も含まれています。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「ADFコンポーネントのテストとデバッグ」の章を参照してください。
新規アプリケーションを作成する最初のステップは、名前を割り当て、ソース・ファイルを保存するディレクトリを指定することです。ビュー・レイヤーのみ含むアプリケーションを作成するか、ADF Facesプロジェクトを既存のアプリケーションに追加できます。
注意:
このドキュメントでは、使用されているビジネス・サービスやそれらのサービスへのバインドに関係なく、アプリケーションでADF Facesプロジェクトを作成する方法についてのみ説明します。ADF FacesをADFモデル・レイヤー、ADFコントローラおよびADFビジネス・コンポーネントとともに使用する方法の詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』を参照してください。
アプリケーション・ワークスペースの作成には、「アプリケーションの作成」ウィザードを使用します。
アプリケーションを作成する手順:
メニューで、「ファイル」→「新規」→「アプリケーション」を選択します。
「新規ギャラリ」で、「カスタム・アプリケーション」を選択して「OK」をクリックします。
「カスタム・アプリケーションの作成」ダイアログで、選択項目の名前、ディレクトリの場所およびパッケージ接頭辞を設定し、「次へ」をクリックします。
「プロジェクトの名前付け」ページで、必要に応じて、ビュー・プロジェクトの名前と場所を変更できます。「プロジェクトの機能」タブで、「ADF Faces」を「選択済」に移動します。ADF Facesに必要なライブラリとメタデータ・ファイルがプロジェクトに追加されます。「次へ」をクリックします。
「Java設定の構成」ページで、作成するJavaクラスのパッケージ名、Javaソース・パスおよび出力ディレクトリを必要に応じて変更します。「終了」をクリックします。
ヒント:
ADF Facesを既存のプロジェクト(JEE Webアプリケーションのビュー・プロジェクトなど)に追加することもできます。これを行うには、次の手順を実行します。
プロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。
「プロジェクト・プロパティ」ダイアログで、「機能」を選択し、「追加」(緑のプラス記号)アイコンをクリックし、ADF Facesを「選択済」ペインに移動します。
カスタム・テンプレートを使用してアプリケーション・ワークスペースを作成し、プロジェクトに対してADF Facesを選択すると、JDeveloperによって、ADF Facesアプリケーションに必要なすべてのソースおよび構成ファイルを含むプロジェクトが作成されます。また、次のライブラリがJDeveloperでプロジェクトに追加されます。
JSF 2.2
JSTL 1.2
JSPランタイム
プロジェクトの作成後、名前を変更できます。図3-1 に、新規ADF Facesアプリケーションのワークスペースを示します。
図3-1 ADF Facesアプリケーションの新規ワークスペース
アプリケーションの作成時に選択したオプションに基づいて、JDeveloperで構成ファイルに構成パラメータも設定されます。web.xml
ファイルには、JSFアプリケーションの実行に必要な構成が含まれます(ADF Facesに固有の設定は、ADF Facesコンポーネントを使用してJSFページを作成したときに追加されます)。次に、ADF Facesアプリケーションの新規作成時にJDeveloperによって生成されるweb.xml
ファイルを示します。
<?xml version = '1.0' encoding = 'windows-1252'?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> </web-app>
特定のADF Faces機能に必要な構成は、このガイドの別の章で説明されています。たとえば、変更永続性フレームワークを使用するために必要な構成は、「JSFページでのユーザー・カスタマイズの許可」で説明されています。ADF Facesアプリケーションの包括的な情報は、「ADF Facesの構成」を参照してください。
アプリケーション・ワークスペース作成後の次のステップは、通常、UIのフローを設計することです。標準JSFアプリケーションの場合と同様に、ADF Facesアプリケーションでは、ページ・フローの定義にナビゲーション・ケースとルールが使用されます。これらの定義は、faces-config.xml
ファイルに格納されます。JDeveloperには、アイコンを使用してページ・フローを宣言的に定義できるダイアグラマがあります。
図3-2 に、特定の顧客のデータを表示するDisplayCustomer
ページと、ユーザーが顧客情報を編集できるEditCustomer
ページの2つのページを含む簡単なページ・フロー用に作成されたナビゲーション・ダイアグラムを示します。ページの表示からページの編集へ進むナビゲーション・ルールと、ページの編集からページの表示へ戻るナビゲーション・ルールが1つずつあります。
図3-2 JDeveloperのナビゲーション・ダイアグラム
注意:
ADFモデル・データ・バインディングおよびADFコントローラを使用する場合は、ADFタスク・フローを使用してナビゲーション・ルールを定義します。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「ADFタスク・フローの概要」の章を参照してください。
ベスト・プラクティス
ADF ControllerはJSFデフォルト・コントローラの拡張です。技術的にはアプリケーションでJSFコントローラとADF Controllerを使用できますが、いずれか一方のみを使用するようにしてください。
JSF 2.0の登場により、2つのページ間の単純なナビゲーションにはナビゲーション・ケースを作成する必要がなくなりました。すべての使用可能なルールを確認した後で一致するナビゲーション・ケースが見つからない場合、ナビゲーション・ハンドラはアクションの結果がビューIDに対応するかどうかを確認します。アクションの結果に一致するビューが見つかった場合は、一致するビューへの暗黙的なナビゲーションが行われます。JSFアプリケーションでのナビゲーション機能の詳細は、「Java EE 6 tutorial」(http://download.oracle.com/javaee/index.html
)を参照してください。
FaceletまたはJSPXページを使用し、ナビゲーション・ダイアグラマを使用して、ページ・フローを宣言的に作成します。ダイアグラマを使用すると、アプリケーションでナビゲーションが機能するために必要なXMLメタデータが、JDeveloperによってfaces-config.xml
ファイルに作成されます。
始める前に:
ページ・フローに関する知識が役立つ場合があります。詳細は、「ページ・フローの定義」を参照してください。
ページ・フローを作成する手順:
ヒント:
「概要」タブをクリックし、ナビゲーション・ルールとナビゲーション・ケースの作成を概要エディタで行うこともできます。エディタのヘルプを参照するには、「ヘルプ」をクリックするか、[F1]を押します。
また、ソース・エディタでページを直接編集することで、要素をfaces-config.xml
ファイルに手動で追加できます。ソース・エディタにファイルを表示するには、「ソース」タブをクリックします。
アプリケーションのナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用の詳細は、「ナビゲーション・コンポーネントの使用」を参照してください。
ページ・フローの作成にダイアグラマを使用すると、JDeveloperで関連するXMLエントリがfaces-config.xml
ファイルに作成されます。次のコードで、図3-2に示すナビゲーション・ルール用に生成されたXMLを示します。
<navigation-rule> <from-view-id>/DisplayCustomer</from-view-id> <navigation-case> <from-outcome>edit</from-outcome> <to-view-id>/EditCustomer</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/EditCustomer</from-view-id> <navigation-case> <from-outcome>back</from-outcome> <to-view-id>/DisplayCustomer</to-view-id> </navigation-case> </navigation-rule>
計画段階で作成したページ・フローからページ・アイコンをダブルクリックすると、実際のJSFページ・ファイルを作成できます。FaceletページまたはJSPページの作成を選択できます。Faceletページでは、拡張子*.jsf
を使用します。Faceletは、JSF中心の宣言的XMLビュー定義テクノロジであり、JSPエンジンの使用の代替方法を提供します。
ADF FacesアプリケーションのJSPページを作成する場合は、拡張子*.jspx
を使用するXMLベースのJSPドキュメントを作成します。XMLベースのドキュメントの使用には、次の利点があります。
UIコンポーネント・タグの整形式のツリーとしてのページの処理がシンプルになります。
Javaコードとコンポーネント・タグの混在を防げます。
ドキュメント作成やレポート監査のためのページの解析が容易になります。
ベスト・プラクティス
Faceletの使用には、次の利点があります。
FaceletレイヤーはJSF専用に作成されるため、タグのコンパイルと実行時にオーバーヘッドが削減され、パフォーマンスが向上します。
Faceletは、JSF 2.0のプライマリ・ビュー定義テクノロジと考えられます。
JSF標準に対する将来のパフォーマンス拡張の一部は、Faceletでのみ使用可能になります。
ADF Facesには、ページ全体のレイアウトを定義する際に使用可能なコンポーネントが多数用意されています。JDeveloperには、これらのコンポーネントを使用した事前定義済のクイック・スタート・レイアウトが含まれており、すばやく簡単に正しくレイアウトを構築できます。1列、2列または3列のレイアウトから選択でき、列の動作を指定できます。たとえば、1つの列の幅はロックし、他の列は拡大してブラウザの使用可能な領域を埋めることができます。図3-4 に、2番目の列が2つのペインに分割されている2列レイアウトで使用可能なクイック・スタート・レイアウトを示します。レイアウト・コンポーネントの詳細は、「Webページ上のコンテンツの編成」を参照してください。
図3-4 クイック・レイアウト
ベスト・プラクティス
すべてのブラウザで正しく動作するレイアウトの作成には時間がかかる場合があります。事前定義されたクイック・レイアウトを使用して、潜在的な問題を回避します。
レイアウト・コンポーネントの追加とともに、選択したクイック・レイアウトにテーマを適用することも選択できます。これらのテーマは、クイック・スタート・レイアウトで使用されるコンポーネントの一部に色のスタイルを追加します。色および追加する場所を確認するには、「クイック・スタート・レイアウト・テーマ」を参照してください。テーマの詳細は、「スタイルおよびスキンを使用した外観のカスタマイズの概要」を参照してください
同じレイアウトをアプリケーションの多くのページで使用する場合には、ADF Facesでは事前定義済ページ・テンプレートを作成および使用できます。テンプレートを作成する場合、テンプレートの開発者はテンプレートを使用するページのレイアウトを決定するだけではなく、すべてのページに表示される静的コンテンツを含めたり、各ページで有効な値に置き換えられるプレースホルダ属性を作成できます。
たとえば、ADF FacesにはOracle Three-Column-Layoutテンプレートが含まれています。このテンプレートには、図3-5 に示すように、ブランド、ヘッダー、著作権情報などの特定のコンテンツ用の領域が含まれ、静的ロゴおよびビジー・アイコンも表示されます。
図3-5 Oracle3列レイアウト・テンプレート
テンプレートにレイアウトなどの変更を加えるたびに、テンプレートを使用するページも自動的に更新されます。テンプレートの作成と使用の詳細は、「ページ・テンプレートの使用」を参照してください。
ベスト・プラクティス
テンプレートを使用して、一貫性を実現し、将来的にアプリケーションの複数のページを簡単に更新できるようにします。
JSFページを作成する際、ページに関連するバッキングBeanを作成することも選択できます。バッキングBeanを使用すると、ページ上のコンポーネントにプログラムからアクセスできます。JSFページでのバッキングBeanの詳細は、「自動コンポーネント・バインディングに関する必知事項」を参照してください。
ベスト・プラクティス
プログラムからのアクセスや処理が必要なコンポーネントを含むページについてのみバッキングBeanを作成します。リスナーなど、コンポーネント属性のEL式を使用してアクセスする追加機能を提供することのみ必要な場合は、かわりにマネージドBeanを使用します。
ページ・ファイルを作成した後は、そのファイルにUIコンポーネントを追加したり、そのページのソースを操作することができます。
「JSFページの作成」ダイアログを使用して、JSFページ(FaceletまたはJSP)を作成します。
始める前に:
ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、「「表示」ページの作成」を参照してください。
JSFページを作成するには:
注意:
Faceletページでは任意の拡張子を使用できますが、Faceletページをカスタマイズ可能にするには.jsf
拡張子を使用する必要があります。詳細は、「JSFページでのユーザー・カスタマイズの許可」を参照してください。
「JSFページの作成」ダイアログを使用してJSFページを作成すると、JDeveloperによって物理ファイルが作成され、必要なコードがファイル内に追加されます(コンポーネント・ライブラリをインポートし、ページを表示するためのコード)。作成されるコードは、FaceletまたはJSPページを作成するよう選択したかどうかによって異なります。
次に、JDeveloperで最初に作成されたときのFaceletページのコードを示します。
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE html> <f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <af:document title="DisplayCustomer.jsf" id="d1"> <af:form id="f1"></af:form> </af:document> </f:view>
次に、JDeveloperで最初に作成されたときの.jspx
ページのコードを示します。
<?xml version='1.0' encoding='UTF-8'?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <jsp:directive.page contentType="text/html;charset=UTF-8"/> <f:view> <af:document title="EditCustomer" id="d1"> <af:form id="f1"></af:form> </af:document> </f:view> </jsp:root>
クイック・レイアウトの1つを使用することを選択した場合、JDeveloperにより、レイアウトの表示に必要なコンポーネントも追加されます。たとえば、次のコードはJDeveloperで2列のレイアウトを選択した場合に生成されるものです(このレイアウトでは、最初の列はロックされ、2番目の列は使用可能なブラウザ領域全体に拡大され、テーマの適用を選択することもできます)。
<?xml version='1.0' encoding='UTF-8'?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <jsp:directive.page contentType="text/html;charset=UTF-8"/> <f:view> <af:document title="EditCustomer" id="d1"> <af:form id="f1"> <af:panelGridLayout id="pgl1"> <af:gridRow height="100%" id="gr1"> <af:gridCell width="100px" halign="stretch" valign="stretch" id="gc1"> <!-- Left --> </af:gridCell> <af:gridCell width="100%" halign="stretch" valign="stretch" id="gc2"> <af:decorativeBox theme="dark" id="db2"> <f:facet name="center"> <af:decorativeBox theme="medium" id="db1"> <f:facet name="center"> <!-- Content --> </f:facet> </af:decorativeBox> </f:facet> </af:decorativeBox> </af:gridCell> </af:gridRow> </af:panelGridLayout> </af:form> </af:document> </f:view> </jsp:root>
次のコードに示すように、ダイアログの「マネージドBean」タブを使用してバッキングBeanを自動作成するよう選択した場合は、そのページ用のバッキングBeanも作成および登録され、既存のコンポーネントがそのBeanにバインドされます。
package view.backing; import oracle.adf.view.rich.component.rich.RichDocument; import oracle.adf.view.rich.component.rich.RichForm; public class MyFile { private RichForm f1; private RichDocument d1; public void setF1(RichForm f1) { this.f1 = f1; } public RichForm getF1() { return f1; } public void setD1(RichDocument d1) { this.document1 = d1; } public RichDocument getD1() { return d1; } }
ヒント:
バッキングBeanのソースはJSFページからアクセスできます。エディタでページを右クリックして「移動先」を選択し、リストからBeanを選択します。
また、次のライブラリがJDeveloperでビュー・プロジェクトに追加されます。
ADF Facesランタイム11
ADF Commonランタイム
ADF DVT Facesランタイム
ADF DVT Facesデータバインディング・ランタイム
ADF DVT FacesデータバインディングMDSランタイム
Oracle JEWT
JDeveloperは、web.xml
ファイルにエントリも追加します。次に、JSFページの作成後に作成されるweb.xml
ファイルを示します。
<?xml version = '1.0' encoding = 'windows-1252'?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>resources</servlet-name> <servlet-class> org.apache.myfaces.trinidad.webapp.ResourceServlet </servlet-class> </servlet> <servlet> <servlet-name>BIGRAPHSERVLET</servlet-name> <servlet-class>oracle.adf.view.faces.bi.webapp.GraphServlet</servlet-class> </servlet> <servlet> <servlet-name>BIGAUGESERVLET</servlet-name> <servlet-class>oracle.adf.view.faces.bi.webapp.GaugeServlet</servlet-class> </servlet> <servlet> <servlet-name>MapProxyServlet</servlet-name> <servlet-class>oracle.adf.view.faces.bi.webapp.MapProxyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resources</servlet-name> <url-pattern>/adf/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resources</servlet-name> <url-pattern>/afr/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BIGRAPHSERVLET</servlet-name> <url-pattern>/servlet/GraphServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BIGAUGESERVLET</servlet-name> <url-pattern>/servlet/GaugeServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MapProxyServlet</servlet-name> <url-pattern>/mapproxy/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>resources</servlet-name> <url-pattern>/bi/*</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name> <param-value>*.jsf;*.xhtml</param-value> </context-param> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> <param-value>false</param-value> </context-param> <context-param> <description>If this parameter is true, there will be an automatic check of the modification date of your JSPs, and saved state will be discarded when JSP's change. It will also automatically check if your skinning css files have changed without you having to restart the server. This makes development easier, but adds overhead. For this reason this parameter should be set to false when your application is deployed.</description> <param-name>org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION</param-name> <param-value>false</param-value> </context-param> <context-param> <description>Whether the 'Generated by...' comment at the bottom of ADF Faces HTML pages should contain version number information.</description> <param-name>oracle.adf.view.rich.versionString.HIDDEN</param-name> <param-value>false</param-value> </context-param> <context-param> <description>Security precaution to prevent clickjacking: bust frames if the ancestor window domain(protocol, host, and port) and the frame domain are different. Another options for this parameter are always and never.</description> <param-name>org.apache.myfaces.trinidad.security.FRAME_BUSTING</param-name> <param-value>differentOrigin</param-value> </context-param> <context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>oracle.adf.view.rich.geometry.DEFAULT_DIMENSIONS</param-name> <param-value>auto</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_SKIP_XML_INSTRUCTIONS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_DECORATORS</param-name> <param-value> oracle.adfinternal.view.faces.facelets.rich.AdfTagDecorator </param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> <param-value> oracle.adfinternal.view.faces.facelets.rich.AdfFaceletsResourceResolver </param-value> </context-param> <context-param> <param-name>oracle.adf.view.rich.dvt.DEFAULT_IMAGE_FORMAT</param-name> <param-value>HTML5</param-value> </context-param> <filter> <filter-name>trinidad</filter-name> <filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class> </filter> <filter-mapping> <filter-name>trinidad</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> <mime-mapping> <extension>swf</extension> <mime-type>application/x-shockwave-flash</mime-type> </mime-mapping> <mime-mapping> <extension>amf</extension> <mime-type>application/x-amf</mime-type> </mime-mapping> </web-app>
注意:
Faceletsコンテキスト・パラメータは、Faceletsページを作成した場合にのみ作成されます。
JSFページを作成すると、次のADF Facesのデフォルト・レンダー・キット(HTMLクライアントでのコンポーネントの表示に使用)を定義するエントリがJDeveloperによってfaces-config.xml
ファイルに作成されます。
<?xml version="1.0" encoding="windows-1252"?> <faces-config version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"> <application> <default-render-kit-id>oracle.adf.rich</default-render-kit-id> </application> </faces-config>
次のようなtrinidad-config.xml
ファイルのエントリによって、アプリケーションのユーザー・インタフェース(UI)コンポーネントで使用されるデフォルト・スキンが定義されます。
<?xml version="1.0" encoding="windows-1252"?> <trinidad-config xmlns="http://myfaces.apache.org/trinidad/config"> <skin-family>skyros</skin-family> <skin-version>v1</skin-version> </trinidad-config>
ページがJDeveloperに初めて表示される場合、ビジュアル・エディタ(「設計」タブをクリックしてアクセス)に表示され、WYSIWYG環境でページを見ることができます。「ソース」タブをクリックして、ページのソースをソース・エディタに表示することもできます。JDeveloperの左下部にある構造ウィンドウには、ページが階層形式で表示されます。
JSF 2.1 Webアプリケーションは、FaceletsエンジンまたはJSPサーブレット・エンジンを使用して実行できます。デフォルトでは、*.jsf
および*.xhtml
拡張子を持つドキュメントはFaceletsエンジンによって処理され、*.jsp
および*.jspx
拡張子を持つドキュメントはJSPエンジンによって処理されます。ただし、この動作はweb.xml
ファイルでjavax.faces.FACELETS_VIEW_MAPPINGS
コンテキスト・パラメータを設定することで変更できます。ADF FacesではJSPページをFaceletsエンジンで実行できるため、JSPページの既存のアプリケーションでFaceletsエンジンを使用することを決定できます。そのためには、次のコードをweb.xml
ページに挿入します。
<context-param> <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name> <!-- Map both *.jspx and *.jsf to the Facelets engine --> <param-value>*.jsf; *.jspx</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_DECORATORS</param-name> <param-value> oracle.adfinternal.view.faces.facelets.rich.AdfTagDecorator </param-value> </context-param> <context-param> <param-name> javax.faces.FACELETS_RESOURCE_RESOLVER </param-name> <param-value> oracle.adfinternal.view.faces.facelets.rich.AdfFaceletsResourceResolver </param-value> </context-param>
その後、ADF Facesライブラリを再デプロイする必要があります。
Faceletsエンジンを使用するようにアプリケーションを変更した場合は、アプリケーションで、ADF Facesとは現在互換性のないJSFの部分状態保存が使用されます。次に示すエントリを明示的に追加する必要があります。
<context-param> <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> <param-value>false</param-value> </context-param>
この非互換性が解決されたら、エントリを削除して部分状態保存を再び有効にする必要があります。部分状態保存サポートの最新情報は、http://www.oracle.com/technetwork/developer-tools/jdev/documentation/index.html
にある最新のリリース・ノートを確認してください。
注意:
サーブレット・エンジンからFaceletsエンジンに切り替える場合は、アプリケーションの特定の部分が予想どおりに機能しないことがあります。たとえば、カスタムJSPタグがある場合、これらのタグをFaceletsエンジンで機能させるには、再実装する必要があります。詳細は、ADF Facesのリリース・ノートを参照してください。
バッキングBeanは、JSFページのUIコンポーネントのロジックとプロパティを含むマネージドBeanです(マネージドBeanの詳細は、「マネージドBeanの作成と使用」を参照してください)。JSFページを作成する際、「JSFページの作成」ダイアログの「ページの実装」オプションの選択肢の1つを選択してUIコンポーネントを自動的に公開するよう選択すると、JDeveloperでページのバッキングBeanが自動的に作成(または、選択したマネージドBeanが使用)されます。ページに追加するコンポーネントごとに、JDeveloperでそのコンポーネントのBeanプロパティが挿入され、binding
属性を使用してコンポーネント・インスタンスとそのプロパティがバインドされて、Beanでコンポーネント・インスタンスを受け入れたり、返すことができます。
自動コンポーネント・バインディングを使用すると、具体的にはJDeveloperで次の処理が行われます。
JSFファイルと同じ名前を使用してJavaBeanを作成し、view.backing
パッケージに含めます(JDeveloperでバッキングBeanを作成するよう選択した場合)。
バッキングBeanに対するfaces-config.xml
ファイルに、マネージドBeanが作成されます。デフォルトでは、マネージドBeanの名前はbacking_<page_name>
で、Beanはrequest
スコープを使用します(スコープの詳細は、「オブジェクト・スコープ・ライフサイクル」を参照してください)。
注意:
JDeveloperでは、マネージドBeanのプロパティ・エントリはfaces-config.xml
ファイルに作成されません。特定のプロパティ値でBeanをインスタンス化する場合、この構成をfaces-config.xml
ファイルに手動で行う必要があります。詳細は、「faces-config.xmlでのADF Facesの構成方法」を参照してください。
新規に作成したBeanまたは選択したBeanでは、JSFページに配置した各コンポーネント・タグに対するプロパティおよびアクセッサ・メソッドが追加されます。JDeveloperでバインディング属性の値としてEL式を使用し、コンポーネント・タグとそのプロパティがバインドされます。
ページから削除されたコンポーネントのプロパティとメソッドが削除されます。
ページが作成され、コンポーネントが追加された後、ビジュアル・エディタでコンポーネントをダブルクリックして、使用するコンポーネントにメソッド・バインディング式を宣言的に追加できます(これにより、属性をバインドするマネージドBeanおよびメソッドを選択できるエディタが起動します)。ページに自動コンポーネント・バインディングが使用されている場合、コンポーネントをダブルクリックすると、コンポーネントがバインドされる可能性のあるスケルトン・メソッドが、ページのバッキングBeanに自動的に作成されます。たとえば、ボタン・コンポーネントを追加し、ビジュアル・エディタでこれをダブルクリックすると、「バインドActionプロパティ」ダイアログにページのバッキングBeanと新しいスケルトン・アクション・メソッドが、図3-6 に示すように表示されます。
図3-6 「バインドActionプロパティ」ダイアログ
これらのメソッドから選択するか、新しいメソッド名を入力すると、JDeveloperでページのバッキングBeanに新規スケルトン・メソッドが自動的に作成されます。その後、メソッドにロジックを追加する必要があります。
注意:
自動コンポーネント・バインディングがページで使用されていない場合は、既存のマネージドBeanを選択するか、新規バッキングBeanを作成してバインディングを作成する必要があります。
たとえば、myfile.jsf
というファイル名でJSFページを作成したとします。JDeveloperによるデフォルトのバッキングBeanの自動作成を選択した場合は、JDeveloperによって、view.backing.MyFile.java
というバッキングBeanが作成され、ViewController
プロジェクトの¥src
ディレクトリに配置されます。このバッキングBeanはfaces-config.xml
ファイルでマネージドBeanとして構成され、デフォルトのマネージドBean名はbacking_myfile
となります。
次に、自動コンポーネント・バインディングを使用し、form
、inputText
およびbutton
コンポーネントを含むJSFページのコードを示します。
<f:view> <af:document id="d1" binding="#{backing_myfile.d1}"> <af:form id="f1" binding="#{backing_myfile.f1}"> <af:inputText label="Label 1" binding="#{backing_MyFile.it1}" id="inputText1"/> <af:button text="button 1" binding="#{backing_MyFile.b1}" id="b1"/> </af:form> </af:document> </f:view>
次に、対応するバッキングBeanのコードを示します。
package view.backing; import oracle.adf.view.rich.component.rich.RichDocument; import oracle.adf.view.rich.component.rich.RichForm; import oracle.adf.view.rich.component.rich.input.RichInputText; import oracle.adf.view.rich.component.rich.nav.RichButton; public class MyFile { private RichForm f1; private RichDocument d1; private RichInputText it1; private RichButton b1; public void setForm1(RichForm f1) { this.form1 = f1; } public RichForm getF1() { return f1; } public void setD1(RichDocument d1) { this.d1 = d1; } public RichDocument getD1() { return d1; } public void setIt1(RichInputText it1) { this.inputText1 = inputText1; } public RichInputText getInputText1() { return inputText1; } public void setB1(RichButton b1) { this.button1 = button1; } public RichButton getB1() { return b1; } public String b1_action() { // Add event code here... return null; } }
次のfaces-config.xml
ファイルに追加されたコードは、ページのバッキングBeanをマネージドBeanとして登録します。
<managed-bean> <managed-bean-name>backing_MyFile</managed-bean-name> <managed-bean-class>view.backing.MyFile</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
注意:
マネージドBeanをfaces-config.xml
ファイルに登録するかわりに、Faceletを使用している場合は、登録するバッキングBeanで注釈を使用することを選択できます。マネージドBeanおよびバッキングBeanでの注釈の使用の詳細は、http://www.oracle.com/technetwork/java/index.html
にある「Java EE 6 tutorial」を参照してください。
また、JSFページのバッキングBeanであるJavaファイルを編集する際、メソッド・バインディング・ツールバーがソース・エディタに表示され、選択したページのコンポーネントに適切なメソッドを迅速かつ容易にバインドできます。イベントを選択すると、JDeveloperで図3-7 に示すようなイベントのスケルトン・メソッドが作成されます。
図3-7 ソース・エディタでのスケルトン・メソッドの宣言的作成
ページの作成後に、自動コンポーネント・バインディングをオンまたはオフにでき、バッキングBeanを別のJavaクラスに変更することもできます。ビジュアル・エディタでJSFページを開き、「JDeveloper」メニューから「設計」→「ページ・プロパティ」を選択します。ここで、「自動バインド」オプションを選択または選択解除したり、マネージドBeanクラスを変更したりできます。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。
注意:
自動バインディングを無効にした場合、ページでバインドされている既存のコンポーネントのバインド属性は変わりません。自動バインディングを有効にした場合、バインドされているすべての既存のコンポーネントと新たに挿入するコンポーネントが、選択したバッキングBeanにバインドされます。自動バインディングが有効で、Beanの選択を変えた場合、既存のすべてのバインディングと新規バインディングが新しいBeanに切り替わります。
JSFページのバッキングBeanにはページ・エディタからアクセスできます。ページを右クリックして「Beanに移動」を選択し、JSFに関連付けられているBeanのリストからBeanを選択します。
ページの作成後、「コンポーネント」ウィンドウを使用して、コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要なページ・コードが宣言的に自動追加され、各コンポーネント属性に既定の値が設定されます。
ヒント:
特定のADF Facesコンポーネントの追加および使用の詳細な手順と情報は、「一般的なADF Facesコンポーネントの使用」を参照してください。
注意:
ADF FacesコンポーネントをMyFaces Trinidadコンポーネント(tr:
タグ)またはその他のAjax対応ライブラリ・コンポーネントと同じページで使用することはできません。Trinidad HTMLタグ(trh:
)はADF Facesコンポーネントと同じページで使用できますが、ブラウザ・レイアウトに問題が生じる場合があります。常にADF Facesコンポーネントのみを使用してレイアウトを実現するように試みてください。
ADF Facesコンポーネントを使用して作成したページと他のコンポーネントを使用して作成したページはアプリケーションに混在できることに注意してください。
始める前に:
ページの作成について理解しておくと役立ちます。詳細は、「「表示」ページの作成」を参照してください。
ADF Facesコンポーネントをページに追加する手順:
「アプリケーション」ウィンドウで、JSFページをダブルクリックして開きます。
「コンポーネント」ウィンドウが表示されていない場合は、メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」ウィンドウはJDeveloperの右上部に表示されます。
「コンポーネント」ウィンドウで、ドロップダウン・メニューを使用して「ADF Faces」を選択します。
ヒント:
「コンポーネント」ウィンドウで「ADF Faces」ページが使用可能でない場合は、ADF Facesタグ・ライブラリをプロジェクトに追加する必要があります。
Faceletファイルの場合:
プロジェクト・ノードを右クリックして、「プロジェクト・プロパティ」を選択します。
「JSPタグ・ライブラリ」を選択して、ADF Facesライブラリをプロジェクトに追加します。ヘルプを参照するには、「ヘルプ」をクリックするか、[F1]を押します。
JSPXファイルの場合:
「コンポーネント」ウィンドウの中を右クリックし、「タグ・ライブラリの編集」を選択します。
「コンポーネント・ウィンドウのカスタマイズ」ダイアログで、「ADF Facesコンポーネント」を「選択済のライブラリ」に移動し、「OK」をクリックします。
コンポーネントは、「一般コントロール」(ボタン、アイコン、メニューなどのコンポーネントを含みます)、「テキストおよび選択」、「データ・ビュー」(表やツリーなどのコンポーネントを含みます)、「メニューおよびツールバー」、「レイアウト」および「操作」の6つのアコーディオン・パネルに含まれます。
図3-8 に、ADF Facesの一般コントロールを表示している「コンポーネント」ウィンドウを示します。
図3-8 JDeveloperの「コンポーネント」ウィンドウ
使用するコンポーネントを選択し、ページにドラッグします。
新たに追加されたコンポーネントを使用して、JDeveloperでビジュアル・エディタのページが再描画されます。ビジュアル・エディタでは、ページのコンポーネントを直接選択し、ポップアップ・メニューを使用してコンポーネントを追加できます。
ヒント:
「コンポーネント」ウィンドウからコンポーネントをドラッグし、構造ウィンドウにドロップしたり、ソース・エディタ内のコードに直接ドロップすることもできます。
ソース・エディタでページを直接編集することで、いつでもコンポーネントを追加できます。ソース・エディタにページを表示するには、ウィンドウの下部にある「ソース」をクリックします。
コンポーネントを「コンポーネント」ウィンドウからJSFページにドラッグ・アンド・ドロップすると、対応するコードがJSFページに自動的に追加されます。このコードには、コンポーネントのレンダリングに必要なタグと一部のコンポーネント属性の値が含まれます。たとえば、入力テキスト・コンポーネントとボタン・コンポーネントをパレットからドロップした場合のコードを示します。
<af:inputText label="Label 1" id="it1"/> <af:button text="button 1" id="b1"/>
注意:
自動コンポーネント・バインディングを使用するよう選択した場合、ページのバッキングBeanの対応するプロパティに値がバインドされたbinding
属性もJDeveloperによって追加されます。詳細は、「自動コンポーネント・バインディングについて」を参照してください。
必須である子コンポーネントを含むコンポーネント(表、リストなど)をドロップすると、JDeveloperでウィザードが起動され、親と各子コンポーネントを定義できます。図3-9 に、表コンポーネントと表の子である列コンポーネントの作成に使用する「表」ウィザードを示します。
図3-9 JDeveloperの表ウィザード
次に、ウィザードを使用して3つの列を持つ表を作成した場合に作成されるコードを示します。各列はデータの表示にoutputText
を使用します。
<af:table var="row" rowBandingInterval="0" id="t1"> <af:column sortable="false" headerText="col1" id="c1"> <af:outputText value="#{row.col1}" id="ot1"/> </af:column> <af:column sortable="false" headerText="col2" id="c2"> <af:outputText value="#{row.col2}" id="ot2"/> </af:column> <af:column sortable="false" headerText="col3" id="c3"> <af:outputText value="#{row.col3}" id="ot3"/> </af:column> </af:table>
コンポーネントのページへのドロップ後、「プロパティ」ウィンドウ(デフォルトではJDeveloperの右下部に表示)を使用して、各コンポーネントの属性値を設定できます。
ヒント:
「プロパティ」ウィンドウが表示されていない場合は、メイン・メニューから「ウィンドウ」→「プロパティ」を選択します。
図3-10 に、inputText
コンポーネントの属性が表示されている「プロパティ」ウィンドウを示します。
図3-10 JDeveloperの「プロパティ」ウィンドウ
「プロパティ」ウィンドウには、類似のプロパティをグループにした各セクションがあります。たとえば、「プロパティ」ウィンドウでは、inputText
によく使用される属性は「共通」セクションにまとめられ、コンポーネントの動作に影響するプロパティは「動作」セクションにまとめられています。図3-11 に、inputText
コンポーネントの「プロパティ」ウィンドウにある「動作」セクションを示します。
図3-11 「プロパティ」ウィンドウの「動作」セクション
始める前に:
ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、「「表示」ページの作成」を参照してください。
コンポーネント属性の設定手順:
EL式は、属性と実行時に決まるオブジェクト値とのバインドに、ADF Facesアプリケーション全体で使用されます。たとえば、#{UserList.selectedUsers}
は選択したユーザーのセットを参照でき、#{user.name}
は特定のユーザー名を参照でき、#{user.role == 'manager'}
はユーザーがマネージャかどうかを判断します。実行時、汎用式エバリュエータによって、これらの式に対してそれぞれList
、String
およびboolean
の値が返され、コードなしで自動的に各オブジェクトとそのプロパティにアクセスします。
実行時、特定のJSF UIコンポーネント(inputText
コンポーネント、outputText
コンポーネントなど)の値は、そのvalue
属性によって決まります。コンポーネントにはその値として静的テキストを割り当てることができますが、通常、value
属性には、表示データを決定するために実行時インフラストラクチャにより評価されるEL式が含まれます。たとえば、現在ログイン中のユーザーの名前を表示するoutputText
コンポーネントには、value
属性に#{UserInfo.name}
という式を設定できます。コンポーネントの任意の属性(value
属性だけでなく)にEL式を使用して値を割り当てることができるため、動的、かつデータ駆動型のユーザー・インタフェースの作成が容易になります。たとえば、UIコンポーネントのrendered
属性に#{not empty UserList.selectedUsers}
などのブール値の式を使用すると、表示するオブジェクト・セットが空のときにはそのコンポーネントを非表示にできます。UserList
というオブジェクトの選択ユーザーのリストが空の場合、rendered
属性はfalse
と評価されるため、コンポーネントはページに表示されません。
通常のJSFアプリケーションでは、UserList
のようなオブジェクトはマネージドBeanとして作成します。JSFランタイムでは、EL式でBeanを最初に参照した際に、Beanのオンデマンドのインスタンス化が管理されます。値を表示する場合、ページを表示する際にランタイムでEL式が評価され、マネージドBeanから値を得て、コンポーネントにデータが移入されます。ユーザーがUIコンポーネントのデータを更新すると、同じEL式に基づいて、JSFランタイムで該当するマネージドBeanに値が戻されます。マネージドBeanの作成と使用の詳細は、「マネージドBeanの作成と使用」を参照してください。EL式の詳細は、http://www.oracle.com/technetwork/java/index.html
にあるJava EE 6チュートリアルを参照してください。
注意:
EL式を編集可能コンポーネントのvalue
属性に使用している場合は、そのコンポーネントに対応する設定メソッドが必要です。そうでないと、EL式は読取り専用と評価され、値の更新は許可されません。
たとえば、ページにinputText
コンポーネント(IDはit1
)があり、その値が#{myBean.inputValue}
に設定されているとします。inputText
値を更新するには、myBean
マネージドBeanに次のような取得および設定メソッドが必要です。
public void setIt1(RichInputText it1) { this.it1 = it1; } public RichInputText getIt1() { return it1; }
標準のEL到達可能オブジェクトおよびオペランドとともに、ADF FacesはEL関数タグを提供します。これらは、EL式で使用できる特定の機能を提供するタグです。書式タグを使用して文字列メッセージにパラメータを追加でき、タイム・ゾーン・タグを使用して、タイム・ゾーンを返すことができます。書式タグの詳細は、「EL書式タグの使用方法」を参照してください。タイム・ゾーン・タグの詳細は、「inputDateコンポーネントなしでのタイム・ゾーンの選択に関する必知事項」を参照してください。
JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。「プロパティ」ウィンドウからビルダーにアクセスできます。
始める前に:
EL式に関する知識が役立つ場合があります。詳細は、「EL式の作成」を参照してください。
式ビルダーの使用手順:
ADF EL書式タグでは、プレースホルダ・パラメータを使用するテキストを作成でき、このテキストを、String
を受け取るコンポーネント属性の値として使用できます。実行時に、プレースホルダはパラメータ値で置換されます。
たとえば、現在のユーザーの名前がマネージドBeanに格納され、メッセージ内でその名前をoutputText
コンポーネントの値として表示するとします。次に示すように、formatString
タグを使用できます。
<af:outputText value="#{af:formatString('The current user is: {0}, someBean.currentUser)}" />
この例では、formatString
タグはキーが0
である1つのパラメータを受け取り、値someBean.currentUser
に解決します。
formatString
タグおよびformatNamed
タグという2つのタイプの書式タグが使用可能です。formatString
タグは索引付きパラメータを使用しますが、formatNamed
タグは名前付きパラメータを使用します。タイプごとに4つのタグがあり、それぞれ異なる数のパラメータ(最大4)を受け取ります。たとえば、formatString2
タグは2つの索引付きパラメータを受け取り、formatNamed4
タグは4つの名前付きパラメータを受け取ります。
formatNamed
タグを使用する場合は、キーと値の両方を設定します。次の例に、formatNamed2
タグを使用して特定のディスク上のファイル数を表示するメッセージを示します。このメッセージには2つのパラメータが含まれます。
<af:outputText value="#{af:formatNamed2( 'The disk named {disk}, contains {fileNumber} files', 'disk', bean.disk, 'fileNumber', bean.fileNumber)}" />
必要なEL式はJDeveloperで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内でEL式にアクセスしたり、EL式を設定または起動する必要がある場合もあります。
次のコードに、EL式への参照を取得し、適合するオブジェクトを返す(または作成する)方法を示します。
public static Object resolveExpression(String expression) { FacesContext facesContext = getFacesContext(); Application app = facesContext.getApplication(); ExpressionFactory elFactory = app.getExpressionFactory(); ELContext elContext = facesContext.getELContext(); ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class); return valueExp.getValue(elContext); }
次のコードに、メソッド式を解決する方法を示します。
public static Object resloveMethodExpression(String expression, Class returnType, Class[] argTypes, Object[] argValues) { FacesContext facesContext = getFacesContext(); Application app = facesContext.getApplication(); ExpressionFactory elFactory = app.getExpressionFactory(); ELContext elContext = facesContext.getELContext(); MethodExpression methodExpression = elFactory.createMethodExpression(elContext, expression, returnType, argTypes); return methodExpression.invoke(elContext, argValues); }
次のコードに、マネージドBeanに新規オブジェクトを設定する方法を示します。
public static void setObject(String expression, Object newValue) { FacesContext facesContext = getFacesContext(); Application app = facesContext.getApplication(); ExpressionFactory elFactory = app.getExpressionFactory(); ELContext elContext = facesContext.getELContext(); ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class); //Check that the input newValue can be cast to the property type //expected by the managed bean. //Rely on Auto-Unboxing if the managed Bean expects a primitive Class bindClass = valueExp.getType(elContext); if (bindClass.isPrimitive() || bindClass.isInstance(newValue)) { valueExp.setValue(elContext, newValue); } }
マネージドBeanは、様々な構成ファイルを使用してアプリケーションに登録するJavaクラスです。JSFアプリケーションを起動すると、これらの構成ファイルが解析されてBeanが使用可能になり、EL式で参照できるため、Beanのプロパティとメソッドにアクセスできます。マネージドBeanが初めて参照されたときにまだ存在していない場合、マネージドBean作成機能によりBeanのデフォルトのコンストラクタ・メソッドがコールされて、Beanがインスタンス化されます。また、プロパティが宣言されると、宣言されたデフォルトの値が移入されます。
多くの場合、マネージドBeanは、フロント・エンドで処理することが最適なイベントやデータ操作を処理します。標準JSFアプリケーションでのマネージドBeanの使用方法の詳細は、http://www.oracle.com/technetwork/java/index.html
の「Java EE 6 tutorial」を参照してください。
ベスト・プラクティス
マネージドBeanを使用して、現在のユーザーなどのブックキーピング情報のみを格納します。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。
標準JSFアプリケーションでは、マネージドBeanはfaces-config.xml
構成ファイルに登録されます。
注意:
ADFモデル・データ・バインディングおよびADFコントローラを使用する場合は、faces-config.xml
ファイルではなく、ADFタスク・フローにマネージドBeanを登録する必要があります。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「Fusion WebアプリケーションでのマネージドBeanの使用」の章を参照してください。
faces-config.xml
ファイルに概要エディタを使用して、マネージドBeanの作成とJSFアプリケーションへの登録を同時に行えます。
始める前に:
マネージドBeanに関する知識が役立つ場合があります。詳細は、「マネージドBeanの作成と使用」を参照してください。
マネージドBeanの作成および登録手順:
マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。次に、viewパッケージに格納されたMyBean
クラスに追加されるコードを示します。
package view; public class MyBean { public MyBean() { } }
ここでページに必要なロジックを追加する必要があります。このロジックは、マネージドBeanのmanaged-bean-name
を参照するEL式を使用して参照できます。たとえば、my_bean
マネージドBeanのmyInfo
プロパティにアクセスする場合、EL式は次のようになります。
#{my_bean.myInfo}
次に示すように、JDeveloperで、faces-config.xml
ファイルへのmanaged-bean
要素の追加も行われます。
<managed-bean> <managed-bean-name>my_bean</managed-bean-name> <managed-bean-class>view.MyBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
マネージドBeanの問題を回避するには、(コンポーネントのbinding
属性を通じて) Beanでコンポーネント・バインディングを使用する必要がある場合に、request
スコープにBeanを格納する必要があります(アプリケーションでFusionテクノロジ・スタックを使用する場合は、backingBean
スコープに格納する必要があります。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のFusion WebアプリケーションでのマネージドBeanの使用に関する項を参照してください。)ただし、Beanをrequest
またはbackingBean
スコープに格納できない状況が発生することがあります。たとえば、マネージドBeanがクラスタ化環境にデプロイできるようにsession
スコープに格納されているため、シリアライズ可能なインタフェースを実装する必要がある場合があります。シリアライズ可能な場合、リクエスト中に変更されるマネージドBeanは、フェイルオーバーのために他のサーバーに配信できます。一方、ADF Facesコンポーネント(および一般にJSFコンポーネント)はシリアライズ可能ではありません。そのため、シリアライズされたマネージドBeanがコンポーネント・バインディングを使用してコンポーネントにアクセスしようとした場合、参照されるコンポーネントをシリアライズできないため、Beanはシリアライズに失敗します。ADF Facesコンポーネントはスレッド・セーフではないため、シリアライズされたマネージドBeanにバインドされたコンポーネントには、スレッドの安全性の問題もあります。
request
またはbackingBean
スコープを使用していないバッキングBeanにUIコンポーネント・インスタンスへのコンポーネント参照を格納する必要がある場合は、Trinidad ComponentReference
APIを使用してコンポーネント・インスタンスへの参照を格納する必要があります。UIComponentReference.newUIComponentReference()
メソッドは、現在のページのUIComponent
インスタンスを取得するために使用できるシリアライズ可能参照オブジェクトを作成します。次に、マネージドBeanがUIComponentReference
APIを使用して検索フィールドの値を取得および設定する方法を示します。
... private ComponentReference<UIInput> searchField; ... public void setSearchField(UIInput searchField) { if( this.searchField == null) this.searchField = ComponentReference.newUIComponentReference(searchField); } public UIInput getSearchField() { return searchField ==null ? null : searchField.getComponent(); } ....
UIComponentReference
APIを使用する際には、次の点に注意してください。
APIは、リクエスト・スレッドでコールされるかぎりスレッド・セーフです。
渡されるADF FacesコンポーネントにはIDが必要です。
コンポーネントがネーミング・コンテナ間で移動される場合、または祖先ネーミング・コンテナのいずれかでIDが変更された場合は、参照が中断されます。
UIComponentReference
APIの詳細は、Trinidad Javadocを参照してください。