Oracle® Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド 11gリリース1(11.1.1.9.0) B52029-12 |
|
![]() 前 |
![]() 次 |
この章では、JDeveloperを使用してADF Facesアプリケーションを宣言的に作成する方法について説明します。
この章では、次の項目について説明します。
JDeveloper 11gをADF FacesおよびJSFと組み合せて使用すると、EL式の作成や自動コンポーネント・バインディングなどのようにページやマネージドBeanを宣言的に生成できるケースが多くなります。また、ナビゲーションや構成を制御するメタデータなどのXMLメタデータが宣言的に生成されるケースも多くなります。
大まかにとらえると、ADF Facesのビュー・プロジェクト開発プロセスは次の作業で構成されます。
アプリケーション・ワークスペースの作成
ページ・フローの設計
JavaServer Pages (JSP)またはFaceletページを使用したページの設計および作成
アプリケーションのデプロイ。デプロイメントの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework管理者ガイド』を参照してください。アプリケーションでADF FacesをADFモデル・レイヤー、ADFコントローラおよびADFビジネス・コンポーネントとともに使用する場合は、『Oracle Fusion Middleware Oracle Application Development FrameworkのためのFusion開発者ガイド』の「Fusion Webアプリケーションのデプロイ」の章を参照してください。
開発サイクル全体を通じて継続されるタスクとしては、次のものがあります。
マネージドBeanの作成
EL式の作成および使用
ADF Facesソース・コードおよびJavadocの表示
JDeveloperには、デバッグやテストの機能も含まれています。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「ADFコンポーネントのテストとデバッグ」を参照してください。
新規アプリケーションを作成する最初のステップは、名前を割り当て、ソース・ファイルを保存するディレクトリを指定することです。JDeveloperに用意されているアプリケーション・テンプレートを使用してアプリケーションを作成すると、ワークスペースの編成と、作成するアプリケーションのタイプに必要な多くの構成ファイルおよびライブラリが自動的にプロジェクトに含められます。
アプリケーション・ワークスペースの作成には、「アプリケーションの作成」ウィザードを使用します。
アプリケーションを作成する手順:
JDeveloperのメイン・メニューで、「ファイル」→「新規」の順に選択します。
新規ギャラリが開き、作成するアプリケーション・コンポーネントを選択できます。
「新規ギャラリ」で「一般」ノードを展開し、「アプリケーション」→「Java EE Webアプリケーション」を選択して、「OK」をクリックします。
このテンプレートは、ビューにJSFを使用し、ビジネス・サービスにEnterprise JavaBean (EJB)セッションBeanとJava Persistence API (JPA)エンティティを使用するWebアプリケーションの作成に必要な基礎となります。アプリケーションのビジネス・レイヤー用のファイルとディレクトリはすべて、Model
というデフォルト名のプロジェクトに格納されます。ビュー・レイヤー用のファイルとディレクトリはすべて、ViewController
というデフォルト名のプロジェクトに格納されます。
注意: このドキュメントでは、使用されているビジネス・サービスやそれらのサービスへのバインドに関係なく、アプリケーションでADF Facesプロジェクトを作成する方法についてのみ説明します。ADF FacesをADFモデル・レイヤー、ADFコントローラおよびADFビジネス・コンポーネントとともに使用する方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。ADFモデル・レイヤー、EJBおよびJPAとADF Facesを組み合せた使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』を参照してください。 |
「Java EE Webアプリケーションの作成」ダイアログで、名前、ディレクトリの場所、および選択したパッケージ接頭辞を設定して、「次へ」をクリックします。
「プロジェクトの名前付け」ページで、Webプロジェクトの名前と場所を必要に応じて変更できます。「プロジェクト・テクノロジ」タブで「ADF Faces」をダブルクリックしてこのテクノロジを選択済ペインに移動します。これによって、必要なライブラリとメタデータ・ファイルがWebプロジェクトに追加されます。「次へ」をクリックします。
Java設定の構成ページで、ビュー・レイヤーのパッケージ名、Javaソース・パスおよび出力ディレクトリを必要に応じて変更します。「次へ」をクリックします。
「プロジェクトの名前付け」ページで、Javaプロジェクトの名前と場所を必要に応じて変更できます。Java EEに必要なライブラリとメタデータ・ファイルが、デフォルトでデータ・モデル・プロジェクトにすでに追加されています。「次へ」をクリックします。
Java設定の構成ページで、モデル・レイヤーのパッケージ名、Javaソース・パスおよび出力ディレクトリを必要に応じて変更します。「次へ」をクリックします。
必要に応じてEJB設定を構成します。このページのヘルプを表示するには、「ヘルプ」をクリックするか、[F1]キーを押します。「終了」をクリックします。
Java EE Webアプリケーション・テンプレートを使用してアプリケーション・ワークスペースを作成すると、アプリケーションのビジネス・サービスに関連するすべてのソース・ファイルを含むModel
という名前のプロジェクトがJDeveloperによって作成されます。EJBプロジェクトに必要なライブラリがJDeveloperで自動的に追加されます。たとえば、デフォルトのEJB設定のままの場合、JDeveloperでEJB 3.0ライブラリが追加されます。
ADF Facesビュー・レイヤー用のすべてのソース・ファイルを含むViewController
という名前のプロジェクトもJDeveloperによって作成されます。アプリケーションに必要なJSFおよびADF構成ファイルは、JDeveloperで自動的に作成されます。また、次のライブラリがJDeveloperでビュー・プロジェクトに追加されます。
JSF 1.2
JSTL 1.2
JSPランタイム
プロジェクトにJSFページを作成すると、ADF Facesおよびその他のランタイム・ライブラリが追加されます。
プロジェクトの作成後、名前を変更できます。図2-1に、新規Java EE Webアプリケーションのワークスペースを示します。
アプリケーションの作成時に選択したオプションに基づいて、JDeveloperで構成ファイルに構成パラメータも設定されます。web.xml
ファイルには、JSFアプリケーションの実行に必要な構成が含まれます(ADF Facesに固有の設定は、ADF Facesコンポーネントを使用してJSFページを作成したときに追加されます)。例2-1に、Java EEアプリケーションの新規作成時にJDeveloperによって生成されるweb.xml
ファイルを示します。
例2-1 生成されたweb.xmlファイル
<?xml version = '1.0' encoding = 'UTF-8'?><web-app 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_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <description>Empty web.xml file for Web Application</description> <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機能に必要な構成は、このガイドの別の章で説明されています。たとえば、変更永続性フレームワークを使用するために必要な構成は、第34章「JSFページでのユーザー・カスタマイズの許可」で説明されています。ADF Facesアプリケーションの構成の包括的な情報は、付録A「ADF Facesの構成」を参照してください。
アプリケーション・ワークスペース作成後の次のステップは、通常、UIのフローを設計することです。標準JSFアプリケーションの場合と同様に、ADF Facesアプリケーションでは、ページ・フローの定義にナビゲーション・ケースとルールが使用されます。これらの定義は、faces-config.xml
ファイルに格納されます。JDeveloperには、アイコンを使用してページ・フローを宣言的に定義できるダイアグラマがあります。
図2-2に、特定の顧客のデータを表示するDisplayCustomer
ページと、ユーザーが顧客情報を編集できるEditCustomer
ページの2つのページを含む簡単なページ・フロー用に作成されたナビゲーション・ダイアグラムを示します。ページの表示からページの編集へ進むナビゲーション・ルールと、ページの編集からページの表示へ戻るナビゲーション・ルールが1つずつあります。
注意: ADFモデル・データ・バインディングおよびADFコントローラを使用する場合、標準JSFナビゲーション・ルールではなく、タスク・フローを使用します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「ADFタスク・フローのスタート・ガイド」を参照してください。 |
ベスト・プラクティス: ADF ControllerはJSFデフォルト・コントローラの拡張です。技術的にはアプリケーションでJSFコントローラとADF Controllerを使用できますが、いずれか一方のみを使用するようにしてください。 |
JSFアプリケーションでのナビゲーション機能の詳細は、http://www.oracle.com/technetwork/java/index.html
のJava EE 5チュートリアルを参照してください。
ナビゲーション・ダイアグラマを使用して、JSPまたはJSPXページを使用するページ・フローを宣言的に作成します。ダイアグラマを使用すると、アプリケーションでナビゲーションが機能するために必要なXMLメタデータが、JDeveloperによってfaces-config.xml
ファイルに作成されます。
注意: このダイアグラマでは、JSPおよびJSPXファイルとして作成されるページのみサポートされます。XHTMLページのナビゲーションを作成する必要がある場合は、XMLを手動コーディングする必要があります。 |
ページ・フローを作成する手順:
アプリケーション・ナビゲータで、アプリケーションのfaces-config.xml
ファイルをダブルクリックします。これは、デフォルトではWeb Content/WEB-INFノードにあります。
エディタ・ウィンドウで、「ダイアグラム」タブをクリックし、ナビゲーション・ダイアグラマを開きます。
コンポーネント・パレットが表示されない場合は、メイン・メニューから「表示」→「コンポーネント・パレット」を選択します。デフォルトでは、コンポーネント・パレットはJDeveloperの右上部に表示されます。
コンポーネント・パレットでドロップダウン・メニューを使用して「JSFダイアグラム・オブジェクト」を選択します。
コンポーネントが、「コンポーネント」と「注釈」の2つのアコーディオン・パネルに含まれています。図2-3に、JSFナビゲーション・コンポーネントを表示しているコンポーネント・パレットを示します。
使用するコンポーネントを選択し、ダイアグラムにドラッグします。
新たに追加されたコンポーネントを使用してJDeveloperでダイアグラムが再描画されます。
ヒント: 「概要」タブをクリックし、ナビゲーション・ルールとナビゲーション・ケースの作成を概要エディタで行うこともできます。概要エディタを使用したナビゲーション作成の詳細は、[F1]キーで参照できます。また、ソース・エディタでページを直接編集することで、要素を |
アプリケーションのナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用の詳細は、第18章「ナビゲーション・コンポーネントの使用」を参照してください。
ページ・フローの作成にダイアグラマを使用すると、JDeveloperで関連するXMLエントリがfaces-config.xml
ファイルに作成されます。例2-2に、図2-2に示すナビゲーション・ルール用に生成されたXMLを示します。
例2-2 faces-config.xmlのナビゲーション・ルール
<navigation-rule> <from-view-id>/DisplayCustomer.jspx</from-view-id> <navigation-case> <from-outcome>edit</from-outcome> <to-view-id>/EditCustomer.jspx</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>
計画段階で作成したページ・フローからページ・アイコンをダブルクリックすると、実際のJSPファイルを作成できます。ADF Facesアプリケーション用のJSPを作成する場合は、*.jsp
ファイルではなく、XMLベースのJSPドキュメント(拡張子*.jspx
を使用)の作成を選択できます。
ベスト・プラクティス: XMLベースのドキュメントの使用には、次の利点があります。
|
アプリケーションでJSPではなくFaceletsを使用する場合は、かわりにXHTMLファイルを作成できます。Faceletは、JSF中心の宣言的XMLビュー定義テクノロジであり、JSPエンジンの使用の代替方法を提供します。
ベスト・プラクティス: Faceletの使用には、次の利点があります。
|
ADF Facesには、ページ全体のレイアウトを定義する際に使用可能なコンポーネントが多数用意されています。JDeveloperには、これらのコンポーネントを使用した事前定義済のクイック・スタート・レイアウトが含まれており、すばやく簡単に正しくレイアウトを構築できます。1列、2列または3列のレイアウトから選択でき、列の動作を指定できます。たとえば、1つの列の幅はロックし、他の列は拡大してブラウザの使用可能な領域を埋めることができます。図2-4に、2番目の列が2つのペインに分割されている2列レイアウトで使用可能なクイック・スタート・レイアウトを示します。レイアウト・コンポーネントの詳細は、第8章「Webページ上のコンテンツの編成」を参照してください。
レイアウト・コンポーネントの追加とともに、選択したクイック・レイアウトにテーマを適用することも選択できます。これらのテーマは、クイック・スタート・レイアウトで使用されるコンポーネントの一部に色のスタイルを追加します。色および色の追加場所を確認するには、付録E「クイック・スタート・レイアウト・テーマ」を参照してください。テーマの詳細は、20.3.4項「コンポーネントへのテーマの適用方法」を参照してください。
同じレイアウトをアプリケーションの多くのページで使用する場合には、ADF Facesでは事前定義済ページ・テンプレートを作成および使用できます。テンプレートを作成する場合、テンプレートの開発者はテンプレートを使用するページのレイアウトを決定する(図2-4に示すようにクイック・レイアウト・デザインから選択するか手動で構築します)だけではなく、すべてのページに表示される静的コンテンツを含めたり、各ページで有効な値に置き換えられるプレースホルダ属性を作成できます。たとえば、ADF FacesにはOracle Three-Column-Layoutテンプレートが含まれています。このテンプレートには、図2-5に示すように、ブランド、ヘッダー、著作権情報などの特定のコンテンツ用の領域が含まれ、静的ロゴおよびビジー・アイコンも表示されます。
テンプレートにレイアウトなどの変更を加えるたびに、テンプレートを使用するページも自動的に更新されます。テンプレートの作成と使用の詳細は、19.3項「ページ・テンプレートの使用」を参照してください。
JSFページを作成する際、ページに関連するバッキングBeanを作成することも選択できます。バッキングBeanを使用すると、ページ上のコンポーネントにプログラムからアクセスできます。バッキングBeanとJSF JSPページの使用の詳細は、2.4.3項「自動コンポーネント・バインディングに関する必知事項」を参照してください。
ベスト・プラクティス: プログラムからのアクセスや処理が必要なコンポーネントを含むページについてのみバッキングBeanを作成します。リスナーなど、コンポーネント属性のEL式を使用してアクセスする追加機能を提供することのみ必要な場合は、かわりにマネージドBeanを使用します。 |
ページをモバイル機器で表示可能にすることを選択できます。ページ・ファイルを作成した後は、そのファイルにUIコンポーネントを追加したり、そのページのソースを操作することができます。
JSF JSPページの作成には、「JSFページの作成」ダイアログを使用します。
JSF JSPページを作成する手順:
アプリケーション・ナビゲータで、ページを保存するディレクトリを右クリックし、「新規」を選択します。「新規ギャラリ」で「Web層」ノードを展開し、「JSF」→「JSFページ」を選択して、「OK」をクリックします。
または
ナビゲーション・ダイアグラムから、まだ作成されていないページのページ・アイコンをダブルクリックします。
「JSFページの作成」ダイアログに従って操作を進めます。ヘルプを参照するには、ダイアログで「ヘルプ」をクリックします。バッキングBeanと関連するバインディングの自動作成に使用できる「ページの実装」オプションの詳細は、2.4.3項「自動コンポーネント・バインディングに関する必知事項」を参照してください。
「JSFページの作成」ダイアログを使用してJSFページを作成すると、JDeveloperによって物理ファイルが作成され、必要なコードがファイル内に追加されます(コンポーネント・ライブラリをインポートし、ページを表示するためのコード)。作成されるコードは、.jspx
ドキュメントを作成するよう選択したかどうかによって異なります。例2-3に、JDeveloperで最初に作成されたときの.jspx
ページを示します。
例2-3 JDeveloperで作成された宣言ページ・ソース
<?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:h="http://java.sun.com/jsf/html" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <jsp:directive.page contentType="text/html;charset=UTF-8"/> <f:view> <af:document id="d1"> <af:form id="f1"></af:form> </af:document> </f:view> </jsp:root>
クイック・レイアウトの1つを使用することを選択した場合、JDeveloperにより、レイアウトの表示に必要なコンポーネントも追加されます。例2-4に、2列のレイアウトを選択した場合に生成されるコードを示します(このレイアウトでは、最初の列はロックされ、2番目の列は使用可能なブラウザ領域全体に拡大され、テーマの適用を選択することもできます)。
図2-4 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:h="http://java.sun.com/jsf/html" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <jsp:directive.page contentType="text/html;charset=UTF-8"/> <f:view> <af:document id="d1"> <af:form id="f1"> <af:panelStretchLayout startWidth="100px" id="psl1"> <f:facet name="start"/> <f:facet name="center"> <!-- id="af_twocol_left_sidebar_stretched" --> <af:decorativeBox theme="dark" id="db2"> <f:facet name="center"> <af:decorativeBox theme="medium" id="db1"> <f:facet name="center"/> </af:decorativeBox> </f:facet> </af:decorativeBox> </f:facet> </af:panelStretchLayout> </af:form> </af:document> </f:view> </jsp:root>
ダイアログの「ページの実装」セクションを使用してバッキングBeanを自動作成するよう選択した場合は、そのページ用のバッキングBeanも作成および登録され、既存のコンポーネントがそのBeanにバインドされます。例2-5に、ページのバッキングBean用に作成されたコードを示します。
例2-5 JDeveloperで作成された宣言バッキング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ランタイム
Oracle JEWT
ADF DVT Facesデータバインディング・ランタイム
また、例2-6
に示すように、JDeveloperによってエントリがweb.xmlファイルに追加されます。
例2-6 JSF JSPページの作成後のweb.xmlファイルのコード
<?xml version = '1.0' encoding = 'UTF-8'?> <web-app 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_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>oracle.adf.view.rich.versionString.HIDDEN</param-name> <param-value>false</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> </filter-mapping> <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.adfinternal.view.faces.bi.renderkit.graph.GraphServlet </servlet-class> </servlet> <servlet> <servlet-name>BIGAUGESERVLET</servlet-name> <servlet-class> oracle.adfinternal.view.faces.bi.renderkit.gauge.GaugeServlet </servlet-class> </servlet> <servlet> <servlet-name>MapProxyServlet</servlet-name> <servlet-class> oracle.adfinternal.view.faces.bi.renderkit.geoMap.servlet.MapProxyServlet </servlet-class> </servlet> <servlet> <servlet-name>GatewayServlet</servlet-name> <servlet-class> oracle.adfinternal.view.faces.bi.renderkit.graph.FlashBridgeServlet </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> <servlet-mapping> <servlet-name>GatewayServlet</servlet-name> <url-pattern>/flashbridge/*</url-pattern> </servlet-mapping> </web-app>
JSF JSPページを作成すると、例2-7
のようなADF Facesのデフォルト・レンダー・キット(HTMLクライアントでのコンポーネントの表示に使用)を定義するエントリがJDeveloperによってfaces-config.xmlファイルに作成されます。
例2-7 生成されたfaces-config.xmlファイル
<?xml version="1.0" encoding="UTF-8"?> <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"> <application> <default-render-kit-id>oracle.adf.rich</default-render-kit-id> </application> </faces-config>
例2-8
のようなtrinidad-config.xmlファイルのエントリによって、アプリケーションのユーザー・インタフェース(UI)コンポーネントで使用されるデフォルト・スキンが定義されます。
例2-8 生成されたtrinidad-config.xmlファイル
<?xml version="1.0" encoding="UTF-8"?> <trinidad-config xmlns="http://myfaces.apache.org/trinidad/config"> <skin-family>skyros</skin-family> <skin-version>v1</skin-version> </trinidad-config>
ページがJDeveloperに初めて表示される場合、ビジュアル・エディタ(「設計」タブをクリックしてアクセス)に表示され、WYSIWYG環境でページを見ることができます。「ソース」タブをクリックして、ページのソースをソース・エディタに表示することもできます。JDeveloperの左下部にある構造ウィンドウには、ページが階層形式で表示されます。
バッキングBeanは、JSFページのUIコンポーネントのロジックとプロパティを含むマネージドBeanです(マネージドBeanの詳細は、2.6項「マネージドBeanの作成と使用」を参照してください)。JSF JSPページを作成する際、「JSFページの作成」ダイアログの「ページの実装」オプションの選択肢の1つを選択してUIコンポーネントを自動的に公開するよう選択すると、JDeveloperでページのバッキングBeanが自動的に作成(または、選択したマネージドBeanが使用)されます。ページに追加するコンポーネントごとに、JDeveloperでそのコンポーネントのBeanプロパティが挿入され、binding
属性を使用してコンポーネント・インスタンスとそのプロパティがバインドされて、Beanでコンポーネント・インスタンスを受け入れたり、返すことができます。
自動コンポーネント・バインディングを使用すると、具体的にはJDeveloperで次の処理が行われます。
JSPまたはJSPXファイルと同じ名前を使用してJavaBeanを作成し、view.backing
パッケージに含めます(JDeveloperでバッキングBeanを作成するよう選択した場合)。
バッキングBeanに対するfaces-config.xml
ファイルに、マネージドBeanが作成されます。デフォルトでは、マネージドBeanの名前はbacking_<page_name>
で、Beanはrequest
スコープを使用します(スコープの詳細は、4.6項「オブジェクト・スコープ・ライフサイクル」を参照してください)。
注意: JDeveloperでは、マネージドBeanのプロパティ・エントリはfaces-config.xml ファイルに作成されません。特定のプロパティ値でBeanをインスタンス化する場合、この構成をfaces-config.xml ファイルに手動で行う必要があります。詳細は、A.3.1項「faces-config.xmlでのADF Facesの構成方法」を参照してください。 |
新たに作成または選択されたBeanの場合、JSPにあるコンポーネント・タグごとにプロパティとアクセッサ・メソッドが追加されます。JDeveloperでバインディング属性の値としてEL式を使用し、コンポーネント・タグとそのプロパティがバインドされます。
ページから削除されたコンポーネントのプロパティとメソッドが削除されます。
JSPページが作成され、コンポーネントが追加された後、ビジュアル・エディタでコンポーネントをダブルクリックして、それらを使用するコンポーネントにメソッド・バインディング式を宣言的に追加できます(これによりエディタが起動し、属性をバインドするマネージドBeanとメソッドを選択できます)。JSPに自動コンポーネント・バインディングが使用されている場合、コンポーネントをダブルクリックすると、コンポーネントがバインドされる可能性のあるスケルトン・メソッドが、ページのバッキングBeanに自動的に作成されます。たとえば、コマンド・ボタン・コンポーネントを追加し、ビジュアル・エディタでこれをダブルクリックすると、「バインドActionプロパティ」ダイアログにページのバッキングBeanと新しいスケルトン・アクション・メソッドが、図2-6に示すように表示されます。
これらのメソッドから選択するか、新しいメソッド名を入力すると、JDeveloperでページのバッキングBeanに新規スケルトン・メソッドが自動的に作成されます。その後、メソッドにロジックを追加する必要があります。
注意: JSPに自動コンポーネント・バインディングが使用されていない場合、バインディングを作成するには、既存のマネージドBeanを選択するか、新規のバッキングBeanを作成する必要があります。 |
たとえば、myfile.jspx
というファイル名でJSPを作成したとします。JDeveloperによるデフォルトのバッキングBeanの自動作成を選択した場合は、JDeveloperによって、view.backing.MyFile.java
というバッキングBeanが作成され、ViewController
プロジェクトの¥src
ディレクトリに配置されます。このバッキングBeanはfaces-config.xml
ファイルでマネージドBeanとして構成され、デフォルトのマネージドBean名はbacking_myfile
となります。
例2-9に、自動コンポーネント・バインディングを使用し、form
、inputText
およびcommandButton
コンポーネントを含むJSPのコードを示します。
例2-9 自動コンポーネント・バインディングを使用する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.inputText1}" id="inputText1"/> <af:commandButton text="commandButton 1" binding="#{backing_MyFile.cb1}" id="cb1"/> </af:form> </af:document> </f:view>
例2-10に、対応するバッキングBeanのコードを示します。
例2-10 自動コンポーネント・バインディングを使用するバッキング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.RichCommandButton; public class MyFile { private RichForm f1; private RichDocument d1; private RichInputText inputText1; private RichCommandButton cb1; 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 inputText1) { this.inputText1 = inputText1; } public RichInputText getInputText1() { return inputText1; } public void setCb1(RichCommandButton cb1) { this.commandButton1 = commandButton1; } public RichCommandButton getCb1() { return cb1; } public String cb1_action() { // Add event code here... return null; } }
例2-11に、ページのバッキングBeanをマネージドBeanとして登録するようfaces-config.xml
ファイルに追加されたコードを示します。
例2-11 バッキング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>
また、JSPのバッキングBeanであるJavaファイルを編集する際、メソッド・バインディング・ツールバーがソース・エディタに表示され、選択したページのコンポーネントに適切なメソッドを迅速かつ容易にバインドできます。イベントを選択すると、JDeveloperで図2-7に示すようなイベントのスケルトン・メソッドが作成されます。
ページの作成後に、自動コンポーネント・バインディングをオンまたはオフにでき、バッキングBeanを別のJavaクラスに変更することもできます。ビジュアル・エディタにJSPを開き、「JDeveloper」メニューから「設計」→「ページ・プロパティ」を選択します。ここで、「自動バインド」オプションを選択または選択解除したり、マネージドBeanクラスを変更したりできます。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。
注意: 自動バインディングを無効にした場合、ページでバインドされている既存のコンポーネントのバインド属性は変わりません。自動バインドを有効にした場合、バインドされているすべての既存のコンポーネントと新たに挿入するコンポーネントが、選択したマネージドBeanにバインドされます。自動バインドが有効で、マネージドBeanの選択を変えた場合、既存のすべてのバインディングと新規バインディングが新しいBeanに切り替わります。 |
JSPのバッキングBeanには、ページを右クリックして「移動先」を選択し、JSPに関連付けられているBeanのリストからBeanを選択することで、ページ・エディタからいつでもアクセスできます。
XHTMLファイルを作成するには、「Faceletページの作成」ダイアログを使用します。
XHTMLページを作成する手順:
アプリケーション・ナビゲータで、ページを保存するディレクトリを右クリックし、「新規」を選択します。「新規ギャラリ」で「Web層」ノードを展開し、「Facelets」→「Faceletページ」を選択して、「OK」をクリックします。
ヒント: Faceletsがリストされているテクノロジでない場合は、「新規ギャラリ」の「すべてのテクノロジ」タブをクリックします。 |
「Faceletページの作成」ダイアログを完了します。ヘルプを参照するには、ダイアログで「ヘルプ」をクリックします。
「Faceletページの作成」ダイアログを使用してXHTMLページを作成すると、JDeveloperによって物理ファイルが作成され、コンポーネント・ライブラリのインポートとページの表示に必要なコードが追加されます。例2-3に、JDeveloperで最初に作成されたときの.xthml
ページを示します。
例2-12 JDeveloperで作成された宣言ページ・ソース
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EE" "http://www.w3.org/TR/xhtml1/DTD/xhtall-transitional.dtd"> <f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> <af:document> <af:form/> </af:document> </f:view>
また、次のライブラリがJDeveloperでビュー・プロジェクトに追加されます。
Faceletsランタイム
ADF Facesランタイム11
ADF Commonランタイム
ADF DVT Facesランタイム
Oracle JEWT
ADF DVT Facesデータバインディング・ランタイム
また、例2-13
に示すように、JDeveloperによってエントリがweb.xmlファイルに追加されます。
例2-13 JSF XHTMLページの作成後のweb.xmlファイルのコード
<?xml version = '1.0' encoding = 'UTF-8'?> <web-app 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_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>oracle.adf.view.rich.versionString.HIDDEN</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.trinidad.FACELETS_VIEW_MAPPINGS</param-name> <param-value>*.xhtml</param-value> </context-param> <context-param> <param-name>facelets.SKIP_XML_INSTRUCTIONS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.trinidad.ALTERNATE_VIEW_HANDLER</param-name> <param-value> org.apache.myfaces.trinidadinternal.facelets.TrinidadFaceletViewHandler </param-value> </context-param> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>facelets.SKIP_COMMENTS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>facelets.DECORATORS</param-name> <param-value> oracle.adfinternal.view.faces.facelets.rich.AdfTagDecorator </param-value> </context-param> <context-param> <param-name>facelets.RESOURCE_RESOLVER</param-name> <param-value> oracle.adfinternal.view.faces.facelets.rich.AdfFaceletsResourceResolver </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> </filter-mapping> <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.adfinternal.view.faces.bi.renderkit.graph.GraphServlet </servlet-class> </servlet> <servlet> <servlet-name>BIGAUGESERVLET</servlet-name> <servlet-class> oracle.adfinternal.view.faces.bi.renderkit.gauge.GaugeServlet </servlet-class> </servlet> <servlet> <servlet-name>MapProxyServlet</servlet-name> <servlet-class> oracle.adfinternal.view.faces.bi.renderkit.geoMap.servlet.MapProxyServlet </servlet-class> </servlet> <servlet> <servlet-name>GatewayServlet</servlet-name> <servlet-class> oracle.adfinternal.view.faces.bi.renderkit.graph.FlashBridgeServlet </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> <servlet-mapping> <servlet-name>GatewayServlet</servlet-name> <url-pattern>/flashbridge/*</url-pattern> </servlet-mapping> </web-app>
例2-14
に示すように、ビュー・ハンドラのfaces-config.xmlファイルにもエントリが作成されます。
例2-14 XHTMLページで生成されたfaces-config.xmlファイル
<?xml version="1.0" encoding="UTF-8"?> <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"> <application> <default-render-kit-id>oracle.adf.rich</default-render-kit-id> </application> </faces-config>
例2-15
のようなtrinidad-config.xmlファイルのエントリによって、アプリケーションのユーザー・インタフェース(UI)コンポーネントで使用されるデフォルト・スキンが定義されます。
例2-15 生成されたtrinidad-config.xmlファイル
<?xml version="1.0" encoding="UTF-8"?> <trinidad-config xmlns="http://myfaces.apache.org/trinidad/config"> <skin-family>skyros</skin-family> <skin-version>v1</skin-version> </trinidad-config>
ページがJDeveloperに初めて表示される場合、ビジュアル・エディタ(「設計」タブをクリックしてアクセス)に表示され、WYSIWYG環境でページを見ることができます。「ソース」タブをクリックして、ページのソースをソース・エディタに表示することもできます。JDeveloperの左下部にある構造ウィンドウには、ページが階層形式で表示されます。
ページの作成後、コンポーネント・パレットを使用して、コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要なページ・コードが宣言的に自動追加され、各コンポーネント属性に既定の値が設定されます。
注意: ADF FacesコンポーネントとMyFaces Trinidadコンポーネント(tr: タグ)または他のAJAX対応ライブラリ・コンポーネントは同じページで使用できません。Trinidad HTMLタグ(trh: )はADF Facesコンポーネントと同じページで使用できますが、ブラウザ・レイアウトに問題が生じる場合があります。常にADF Facesコンポーネントのみを使用してレイアウトを実現するように試みてください。
ADF Facesコンポーネントを使用して作成したページと他のコンポーネントを使用して作成したページはアプリケーションに混在できることに注意してください。 |
ADF Facesコンポーネントをページに追加する手順:
アプリケーション・ナビゲータで、JSFページをダブル・クリックして、それをエディタに開きます。
コンポーネント・パレットが表示されない場合は、メニューから「表示」→「コンポーネント・パレット」を選択します。デフォルトでは、コンポーネント・パレットはJDeveloperの右上部に表示されます。
コンポーネント・パレットでドロップダウン・メニューを使用して「ADF Faces」を選択します。
コンポーネントが、「共通コンポーネント」、「レイアウト」および「操作」の3つのアコーディオン・パネルに含まれています。図2-8に、ADF Facesの共通コンポーネントを表示しているコンポーネント・パレットを示します。
使用するコンポーネントを選択し、ページにドラッグします。
新たに追加されたコンポーネントを使用して、JDeveloperでビジュアル・エディタのページが再描画されます。ビジュアル・エディタでは、ページのコンポーネントを直接選択し、ポップアップ・メニューを使用してコンポーネントを追加できます。図2-9に、ビジュアル・エディタのページを示します。
ヒント: コンポーネントをパレットから構造ウィンドウに、またはソース・エディタのコードに直接ドラッグ・アンド・ドロップできます。ソース・エディタでページを直接編集することで、いつでもコンポーネントを追加できます。ソース・エディタにページを表示するには、ウィンドウの下部にある「ソース」をクリックします。 |
コンポーネントをコンポーネント・パレットからJSFページにドラッグ・アンド・ドロップすると、対応するコードがJSFページに自動的に追加されます。このコードには、コンポーネントのレンダリングに必要なタグと一部のコンポーネント属性の値が含まれます。例2-16に、入力テキスト・コンポーネントとボタン・コンポーネントをパレットからドロップした場合のコードを示します。
例2-16 JDeveloperでJSFページに宣言的に追加されるタグ
<af:inputText label="Label 1" id="it1"/> <af:commandButton text="commandButton 1" id="cb"/>
注意: 自動コンポーネント・バインディングを使用するよう選択した場合、ページのバッキングBeanの対応するプロパティに値がバインドされたbinding 属性もJDeveloperによって追加されます。詳細は、2.4.3項「自動コンポーネント・バインディングに関する必知事項」を参照してください。 |
必須である子コンポーネントを含むコンポーネント(表、リストなど)をドロップすると、JDeveloperでウィザードが起動され、親と各子コンポーネントを定義できます。図2-10に、表コンポーネントと表の子である列コンポーネントの作成に使用する「表」ウィザードを示します。
例2-17に、ウィザードを使用して3つの列を持つ表を作成した場合に作成されるコードを示します。各列はデータの表示にoutputText
を使用します。
例2-17 表コンポーネントの宣言コード
<af:table var="row" 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の右下部に表示)を使用して、各コンポーネントの属性値を設定できます。
ヒント: プロパティ・インスペクタが表示されない場合は、メイン・メニューから「表示」→「プロパティ・インスペクタ」を選択します。 |
図2-11に、inputText
コンポーネントの属性を表示しているプロパティ・インスペクタを示します。
プロパティ・インスペクタには、同様のプロパティをグループにしたセクションがあります。たとえば、プロパティ・インスペクタでは、inputText
によく使用される属性は「共通」セクションにまとめられ、コンポーネントの動作に影響するプロパティは「動作」セクションにまとめられています。図2-12に、inputText
コンポーネントのプロパティ・インスペクタの「動作」セクションを示します。
コンポーネント属性の設定手順:
ビジュアル・エディタまたは「構造」ウィンドウ、あるいはソース・エディタでのタグの直接選択で、コンポーネントを選択します。
プロパティ・インスペクタで、設定する属性が含まれるセクションを開きます。
ヒント: 一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。インスペクタの最上部の検索フィールドに属性名を入力して、属性を検索できます。 |
フィールドに値を直接入力するか、フィールドにドロップダウン・リストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるドロップダウンを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、2.5項「EL式の作成」を参照してください。このポップアップには、図2-13のように、プロパティの説明も表示されます。
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の作成と使用の詳細は、2.6項「マネージドBeanの作成と使用」を参照してください。EL式の詳細は、http://www.oracle.com/technetwork/java/index.html
のJava EE 5チュートリアルを参照してください。
JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。ビルダーにはプロパティ・インスペクタからアクセスできます。
式ビルダーの使用手順:
プロパティ・インスペクタで変更する属性を特定し、右端のドロップダウン・メニューを使用して「式ビルダー」を選択します。
次の機能を使用して式を作成します。
「変数」ツリーを使用して、式に含める項目を選択します。ツリーには階層形式のバインディング・オブジェクトが含まれます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーの絞り込みには、ドロップダウン・フィルタを使用するか、検索フィールドに検索条件を入力します。ADF Facesで公開されているELでアクセス可能なオブジェクトは、図2-14に示すように、「JSFマネージドBean」ノードの「adfFacesContext」ノードにあります。
ヒント: これらのオブジェクトの詳細は、ADF Faces Javadocを参照してください。 |
ツリーで項目を選択すると、その項目がEL式内の「式」ボックスに移動されます。「式」ボックスに式を直接入力することもできます。
演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。
図2-15に、explorer
マネージドBeanのlabel
プロパティにコンポーネントのラベルの値をバインドする式の作成に使用される「式ビルダー」ダイアログを示します。
必要なEL式はJDeveloperで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内でEL式にアクセスしたり、EL式を設定または起動する必要がある場合もあります。
例2-18に、EL式への参照を取得し、適合するオブジェクトを返す(または作成する)方法を示します。
例2-18 マネージドBeanからの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); }
例2-19に、メソッド式を解決する方法を示します。
例2-19 マネージドBeanからのメソッド式の解決
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); }
例2-20に、マネージドBeanで新たにオブジェクトを設定する方法を示します。
例2-20 マネージド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">>http://www.oracle.com/technetwork/java/index.html
のJava EE 5チュートリアルを参照してください。
ベスト・プラクティス: マネージドBeanを使用して、現在のユーザーなどのブックキーピング情報のみを格納します。すべてのアプリケーション・データおよび処理データは、アプリケーションのビジネス・レイヤーのロジックによって処理される必要があります。 |
標準JSFアプリケーションでは、マネージドBeanはfaces-config.xml
構成ファイルに登録されます。
注意: ADFモデル・データ・バインディングおよびADFコントローラを使用する場合は、faces-config.xml ファイルではなく、ADFタスク・フローにマネージドBeanを登録する必要があります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。 |
faces-config.xml
ファイルに概要エディタを使用して、マネージドBeanの作成とJSFアプリケーションへの登録を同時に行えます。
マネージドBeanの作成および登録手順:
アプリケーション・ナビゲータで、faces-config.xml
ファイルを開きます。
エディタ・ウィンドウで、「概要」タブをクリックします。
概要エディタで、「マネージドBean」タブをクリックします。
図2-16に、File Explorerアプリケーションを含むADF Facesのデモで使用されるfaces-config.xml
ファイルの場合のエディタを示します。
「追加」アイコンをクリックして「マネージドBean」表に行を追加します。
「マネージドBeanの作成」ダイアログで値を入力します。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。JDeveloperでクラス・ファイルを作成する場合は、「クラスが存在しない場合は生成」オプションを選択します。
注意: マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合は、次のことを考慮してください。
様々なオブジェクト・スコープの詳細は、4.6項「オブジェクト・スコープ・ライフサイクル」を参照してください。 |
オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「Managed Bean」表でBeanを選択した状態で「新規」アイコンをクリックし、「管理プロパティ」表に行を追加します。プロパティ・インスペクタで、プロパティ名を入力します(他のフィールドはオプションです)。
注意: このエディタを使用して管理プロパティを宣言できますが、対応するコードはJavaクラスに生成されません。適切なタイプのプライベート・メンバー・フィールドを作成し、コード・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を選択して、これらのBeanプロパティに対応するget およびset メソッドを生成することにより、コードを追加する必要があります。 |
マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。例2-21に、viewパッケージに格納されたMyBean
クラスに追加されるコードを示します。
ここでページに必要なロジックを追加する必要があります。このロジックは、マネージドBeanのmanaged-bean-name
を参照するEL式を使用して参照できます。たとえば、my_bean
マネージドBeanのmyInfo
プロパティにアクセスする場合、EL式は次のようになります。
#{my_bean.myInfo}
JDeveloperで、faces-config.xml
ファイルへのmanaged-bean
要素の追加も行われます。例2-22は、MyBean
クラスに対して作成されたmanaged-bean
要素を示しています。
マネージドBeanの問題を回避するには、(コンポーネントのbinding
属性を通じて) Beanでコンポーネント・バインディングを使用する必要がある場合に、request
スコープにBeanを格納する必要があります(アプリケーションでFusionテクノロジ・スタックを使用する場合は、backingBean
スコープに格納する必要があります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の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
インスタンスを取得するために使用できるシリアライズ可能参照オブジェクトを作成します。例2-23に、マネージドBeanがUIComponentReference
APIを使用して検索フィールドの値を取得および設定する方法を示します。
例2-23 UIComponentReference APIを使用するセッション・スコープ・マネージドBean
... 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を参照してください。
ADF Faces Javadocは、JDeveloperから直接表示できます。
クラスのJavadocを表示する手順:
メイン・メニューから、「ナビゲート」→「Javadocに移動」を選択します。
「Javadocに移動」ダイアログで、表示するクラス名を入力します。名前が正確にわからない場合、名前を入力し始めると、JDeveloperによって名前が合致するクラスのリストが表示されます。ADF Facesコンポーネントは、oracle.adf.view.rich
パッケージにあります。
ヒント: Javaクラス・ファイルでは、名前または関数にカーソルを置いて[Ctrl]+[D]を押すことで、クラス名参照またはJavaScript関数コールのJavadocに直接移動できます。 |