この章では、JDeveloperを使用してADF Facesアプリケーションを宣言的に作成する方法について説明します。
この章の内容は次のとおりです。
JDeveloper 11gを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アプリケーションのデプロイ」の章を参照してください。
開発サイクル全体を通じて継続されるタスクとしては、次のものがあります。
マネージドBeanの作成
EL式の作成および使用
ADF Facesソース・コードおよびJavadocの表示
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を選択すると、JDeveloperによって、ADF Facesアプリケーションに必要なすべてのソースおよび構成ファイルを含むプロジェクトが作成されます。また、次のライブラリがJDeveloperでプロジェクトに追加されます。
JSF 2.1
JSTL 1.2
JSPランタイム
プロジェクトの作成後、名前を変更できます。図3-1に、新規ADF Facesアプリケーションのワークスペースを示します。
アプリケーションの作成時に選択したオプションに基づいて、JDeveloperで構成ファイルに構成パラメータも設定されます。web.xml
ファイルには、JSFアプリケーションの実行に必要な構成が含まれます(ADF Facesに固有の設定は、ADF Facesコンポーネントを使用してJSFページを作成したときに追加されます)。例3-1に、ADF Facesアプリケーションの新規作成時にJDeveloperによって生成されるweb.xml
ファイルを示します。
例3-1 生成された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機能に必要な構成は、このガイドの別の章で説明されています。たとえば、変更永続性フレームワークを使用するために必要な構成は、第34章「JSFページでのユーザー・カスタマイズの許可」で説明されています。ADF Facesアプリケーションの構成の包括的な情報は、付録A「ADF Facesの構成」を参照してください。
アプリケーション・ワークスペース作成後の次のステップは、通常、UIのフローを設計することです。標準JSFアプリケーションの場合と同様に、ADF Facesアプリケーションでは、ページ・フローの定義にナビゲーション・ケースとルールが使用されます。これらの定義は、faces-config.xml
ファイルに格納されます。JDeveloperには、アイコンを使用してページ・フローを宣言的に定義できるダイアグラマがあります。
図3-2に、特定の顧客のデータを表示するDisplayCustomer
ページと、ユーザーが顧客情報を編集できるEditCustomer
ページの2つのページを含む簡単なページ・フロー用に作成されたナビゲーション・ダイアグラムを示します。ページの表示からページの編集へ進むナビゲーション・ルールと、ページの編集からページの表示へ戻るナビゲーション・ルールが1つずつあります。
注意: ADFモデル・データ・バインディングおよびADFコントローラを使用する場合は、ADFタスク・フローを使用してナビゲーション・ルールを定義します。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「ADFタスク・フローの概要」の章を参照してください。 |
ベスト・プラクティス: ADF ControllerはJSFデフォルト・コントローラの拡張です。技術的にはアプリケーションでJSFコントローラとADF Controllerを使用できますが、いずれか一方のみを使用するようにしてください。 |
JSF 2.0の登場により、2つのページ間の単純なナビゲーションにはナビゲーション・ケースを作成する必要がなくなりました。すべての使用可能なルールを確認した後で一致するナビゲーション・ケースが見つからない場合、ナビゲーション・ハンドラはアクションの結果がビューIDに対応するかどうかを確認します。アクションの結果に一致するビューが見つかった場合は、一致するビューへの暗黙的なナビゲーションが行われます。JSFアプリケーションでのナビゲーション機能の詳細は、(http://download.oracle.com/javaee/index.html
)の「Java EE 6 tutorial」を参照してください。
FaceletまたはJSPXページを使用し、ナビゲーション・ダイアグラマを使用して、ページ・フローを宣言的に作成します。ダイアグラマを使用すると、アプリケーションでナビゲーションが機能するために必要なXMLメタデータが、JDeveloperによってfaces-config.xml
ファイルに作成されます。
始める前に:
ページ・フローに関する知識が役立つ場合があります。詳細は、3.3項「ページ・フローの定義」を参照してください。
ページ・フローを作成する手順:
「アプリケーション」ウィンドウで、アプリケーションのfaces-config.xml
ファイルをダブルクリックします。これは、デフォルトではプロジェクトのWeb Content/WEB-INFノードにあります。
エディタ・ウィンドウで、「ダイアグラム」タブをクリックし、ナビゲーション・ダイアグラマを開きます。
「コンポーネント」ウィンドウが表示されていない場合は、メイン・メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」ウィンドウはJDeveloperの右上部に表示されます。
「コンポーネント」ウィンドウで、ドロップダウン・メニューを使用して「ADFタスク・フロー」を選択します。
コンポーネントは、「ソース要素」、「コンポーネント」および「ダイアグラムの注釈」の3つのアコーディオン・パネルに含まれています。図3-3に、JSFナビゲーション・コンポーネントが表示されている「コンポーネント」ウィンドウを示します。
使用するコンポーネントを選択し、ダイアグラムにドラッグします。
新たに追加されたコンポーネントを使用してJDeveloperでダイアグラムが再描画されます。
ヒント 「概要」タブをクリックし、ナビゲーション・ルールとナビゲーション・ケースの作成を概要エディタで行うこともできます。エディタのヘルプを参照するには、「ヘルプ」をクリックするか、[F1]を押します。また、ソース・エディタでページを直接編集することで、要素を |
アプリケーションのナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用の詳細は、第20章「ナビゲーション・コンポーネントの使用」を参照してください。
ページ・フローの作成にダイアグラマを使用すると、JDeveloperで関連するXMLエントリがfaces-config.xml
ファイルに作成されます。例3-2に、図3-2に示すナビゲーション・ルール用に生成されたXMLを示します。
例3-2 faces-config.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の使用には、次の利点があります。
|
ADF Facesには、ページ全体のレイアウトを定義する際に使用可能なコンポーネントが多数用意されています。JDeveloperには、これらのコンポーネントを使用した事前定義済のクイック・スタート・レイアウトが含まれており、すばやく簡単に正しくレイアウトを構築できます。1列、2列または3列のレイアウトから選択でき、列の動作を指定できます。たとえば、1つの列の幅はロックし、他の列は拡大してブラウザの使用可能な領域を埋めることができます。図3-4に、2番目の列が2つのペインに分割されている2列レイアウトで使用可能なクイック・スタート・レイアウトを示します。レイアウト・コンポーネントの詳細は、第9章「Webページ上のコンテンツの編成」を参照してください。
ベスト・プラクティス: すべてのブラウザで正しく動作するレイアウトの作成には時間がかかる場合があります。事前定義されたクイック・レイアウトを使用して、潜在的な問題を回避します。 |
レイアウト・コンポーネントの追加とともに、選択したクイック・レイアウトにテーマを適用することも選択できます。これらのテーマは、クイック・スタート・レイアウトで使用されるコンポーネントの一部に色のスタイルを追加します。色およびその追加場所を確認するには、付録D「クイック・スタート・レイアウトのテーマ」を参照してください。テーマの詳細は、第31章「スタイルおよびスキンを使用した外観のカスタマイズ」を参照してください。
同じレイアウトをアプリケーションの多くのページで使用する場合には、ADF Facesでは事前定義済ページ・テンプレートを作成および使用できます。テンプレートを作成する場合、テンプレートの開発者はテンプレートを使用するページのレイアウトを決定するだけではなく、すべてのページに表示される静的コンテンツを含めたり、各ページで有効な値に置き換えられるプレースホルダ属性を作成できます。
たとえば、ADF FacesにはOracle Three-Column-Layoutテンプレートが含まれています。このテンプレートには、図3-5に示すように、ブランド、ヘッダー、著作権情報などの特定のコンテンツ用の領域が含まれ、静的ロゴおよびビジー・アイコンも表示されます。
テンプレートにレイアウトなどの変更を加えるたびに、テンプレートを使用するページも自動的に更新されます。テンプレートの作成と使用の詳細は、10.3項「ページ・テンプレートの使用」を参照してください。
ベスト・プラクティス: テンプレートを使用して、一貫性を実現し、将来的にアプリケーションの複数のページを簡単に更新できるようにします。 |
JSFページを作成する際、ページに関連するバッキングBeanを作成することも選択できます。バッキングBeanを使用すると、ページ上のコンポーネントにプログラムからアクセスできます。JSFページでのバッキングBeanの詳細は、3.4.4項「自動コンポーネント・バインディングに関する必知事項」を参照してください。
ベスト・プラクティス: プログラムからのアクセスや処理が必要なコンポーネントを含むページについてのみバッキングBeanを作成します。リスナーなど、コンポーネント属性のEL式を使用してアクセスする追加機能を提供することのみ必要な場合は、かわりにマネージドBeanを使用します。 |
ページ・ファイルを作成した後は、そのファイルにUIコンポーネントを追加したり、そのページのソースを操作することができます。
「JSFページの作成」ダイアログを使用して、JSFページ(FaceletまたはJSP)を作成します。
始める前に:
ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、3.4項「ビュー・ページの作成」を参照してください。
JSFページを作成するには:
「アプリケーション」ウィンドウで、ページを保存するノード(ディレクトリ)を右クリックし、「新規」→「ページ」を選択します。
または
ナビゲーション・ダイアグラムから、まだ作成されていないページのページ・アイコンをダブルクリックします。
「JSFページの作成」ダイアログに従って操作を進めます。ヘルプを参照するには、ダイアログで「ヘルプ」をクリックします。バッキングBeanおよび関連するバインディングの自動作成に使用できる「マネージドBean」ページの詳細は、3.4.4項「自動コンポーネント・バインディングに関する必知事項」を参照してください。
注意: Faceletページでは任意の拡張子を使用できますが、Faceletページをカスタマイズ可能にするには.jsf 拡張子を使用する必要があります。詳細は、第34章「JSFページでのユーザー・カスタマイズの許可」を参照してください。 |
「JSFページの作成」ダイアログを使用してJSFページを作成すると、JDeveloperによって物理ファイルが作成され、必要なコードがファイル内に追加されます(コンポーネント・ライブラリをインポートし、ページを表示するためのコード)。作成されるコードは、FaceletまたはJSPページを作成するよう選択したかどうかによって異なります。
例3-3に、JDeveloperで最初に作成されたときのFaceletページを示します。
例3-3 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>
例3-4に、JDeveloperで最初に作成されたときの.jspx
ページを示します。
例3-4 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により、レイアウトの表示に必要なコンポーネントも追加されます。例3-5に、2列のレイアウトを選択した場合に生成されるコードを示します(このレイアウトでは、最初の列はロックされ、2番目の列は使用可能なブラウザ領域全体に拡大され、テーマの適用を選択することもできます)。
図3-5 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にバインドされます。例3-6に、ページのバッキングBean用に作成されたコードを示します。
例3-6 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ランタイム
ADF DVT Facesデータバインディング・ランタイム
ADF DVT FacesデータバインディングMDSランタイム
Oracle JEWT
JDeveloperは、web.xml
ファイルにエントリも追加します。例3-7に、JSFページの作成後に作成されるweb.xml
ファイルを示します。
例3-7 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ページを作成すると、例3-8のようなADF Facesのデフォルト・レンダー・キット(HTMLクライアントでのコンポーネントの表示に使用)を定義するエントリがJDeveloperによってfaces-config.xml
ファイルに作成されます。
例3-8 生成された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>
例3-9のようなtrinidad-config.xml
ファイルのエントリによって、アプリケーションのユーザー・インタフェース(UI)コンポーネントで使用されるデフォルト・スキンが定義されます。
例3-9 生成されたtrinidad-config.xmlファイル
<?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エンジンを使用することを決定できます。そのためには、例3-10に示すコードをweb.xml
ページに挿入します。
例3-10 Faceletsエンジンを使用してJSPページとFaceletページの両方を実行するための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の部分状態保存が使用されます。例3-11に示すエントリを明示的に追加する必要があります。
この非互換性が解決されたら、エントリを削除して部分状態保存を再び有効にする必要があります。部分状態保存サポートの最新情報は、http://www.oracle.com/technetwork/developer-tools/jdev/documentation/index.html
にある最新のリリース・ノートを確認してください。
例3-11 Faceletsエンジンを使用する場合に追加するweb.xmlコード
<context-param> <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> <param-value>false</param-value> </context-param>
注意: サーブレット・エンジンからFaceletsエンジンに切り替える場合は、アプリケーションの特定の部分が予想どおりに機能しないことがあります。たとえば、カスタムJSPタグがある場合、これらのタグをFaceletsエンジンで機能させるには、再実装する必要があります。詳細は、ADF Facesのリリース・ノートを参照してください。 |
バッキングBeanは、JSFページのUIコンポーネントのロジックとプロパティを含むマネージドBeanです(マネージドBeanの詳細は、3.6項「マネージド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
スコープを使用します(スコープの詳細は、5.6項「オブジェクト・スコープ・ライフサイクル」を参照してください)。
注意: JDeveloperでは、マネージドBeanのプロパティ・エントリはfaces-config.xml ファイルに作成されません。特定のプロパティ値でBeanをインスタンス化する場合、この構成をfaces-config.xml ファイルに手動で行う必要があります。詳細は、A.3.1項「faces-config.xmlでのADF Facesの構成方法」を参照してください。 |
新規に作成したBeanまたは選択したBeanでは、JSFページに配置した各コンポーネント・タグに対するプロパティおよびアクセッサ・メソッドが追加されます。JDeveloperでバインディング属性の値としてEL式を使用し、コンポーネント・タグとそのプロパティがバインドされます。
ページから削除されたコンポーネントのプロパティとメソッドが削除されます。
ページが作成され、コンポーネントが追加された後、ビジュアル・エディタでコンポーネントをダブルクリックして、使用するコンポーネントにメソッド・バインディング式を宣言的に追加できます(これにより、属性をバインドするマネージドBeanおよびメソッドを選択できるエディタが起動します)。ページに自動コンポーネント・バインディングが使用されている場合、コンポーネントをダブルクリックすると、コンポーネントがバインドされる可能性のあるスケルトン・メソッドが、ページのバッキングBeanに自動的に作成されます。たとえば、ボタン・コンポーネントを追加し、ビジュアル・エディタでこれをダブルクリックすると、「バインドActionプロパティ」ダイアログにページのバッキングBeanと新しいスケルトン・アクション・メソッドが、図3-6に示すように表示されます。
これらのメソッドから選択するか、新しいメソッド名を入力すると、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
となります。
例3-12に、自動コンポーネント・バインディングを使用し、form
、inputText
およびbutton
コンポーネントを含むJSFページのコードを示します。
例3-12 自動コンポーネント・バインディングを使用する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>
例3-13に、対応するバッキングBeanのコードを示します。
例3-13 自動コンポーネント・バインディングを使用するバッキング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; } }
例3-14に、ページのバッキングBeanをマネージドBeanとして登録するようfaces-config.xml
ファイルに追加されたコードを示します。
例3-14 バッキング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に示すようなイベントのスケルトン・メソッドが作成されます。
ページの作成後に、自動コンポーネント・バインディングをオンまたはオフにでき、バッキングBeanを別のJavaクラスに変更することもできます。ビジュアル・エディタでJSFページを開き、「JDeveloper」メニューから「設計」→「ページ・プロパティ」を選択します。ここで、「自動バインド」オプションを選択または選択解除したり、マネージドBeanクラスを変更したりできます。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。
注意: 自動バインディングを無効にした場合、ページでバインドされている既存のコンポーネントのバインド属性は変わりません。自動バインディングを有効にした場合、バインドされているすべての既存のコンポーネントと新たに挿入するコンポーネントが、選択したバッキングBeanにバインドされます。自動バインディングが有効で、Beanの選択を変えた場合、既存のすべてのバインディングと新規バインディングが新しいBeanに切り替わります。 |
JSFページのバッキングBeanにはページ・エディタからアクセスできます。ページを右クリックして「Beanに移動」を選択し、JSFに関連付けられているBeanのリストからBeanを選択します。
ページの作成後、「コンポーネント」ウィンドウを使用して、コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要なページ・コードが宣言的に自動追加され、各コンポーネント属性に既定の値が設定されます。
注意: ADF FacesコンポーネントをMyFaces Trinidadコンポーネント(tr: タグ)またはその他のAjax対応ライブラリ・コンポーネントと同じページで使用することはできません。Trinidad HTMLタグ(trh: )はADF Facesコンポーネントと同じページで使用できますが、ブラウザ・レイアウトに問題が生じる場合があります。常にADF Facesコンポーネントのみを使用してレイアウトを実現するように試みてください。
ADF Facesコンポーネントを使用して作成したページと他のコンポーネントを使用して作成したページはアプリケーションに混在できることに注意してください。 |
始める前に:
ページの作成について理解しておくと役立ちます。詳細は、3.4項「ビュー・ページの作成」を参照してください。
ADF Facesコンポーネントをページに追加する手順:
「アプリケーション」ウィンドウで、JSFページをダブルクリックして開きます。
「コンポーネント」ウィンドウが表示されていない場合は、メニューから「ウィンドウ」→「コンポーネント」を選択します。デフォルトでは、「コンポーネント」ウィンドウはJDeveloperの右上部に表示されます。
「コンポーネント」ウィンドウで、ドロップダウン・メニューを使用して「ADF Faces」を選択します。
ヒント 「コンポーネント」ウィンドウで「ADF Faces」ページが使用可能でない場合は、ADF Facesタグ・ライブラリをプロジェクトに追加する必要があります。Faceletファイルの場合:
JSPXファイルの場合:
|
コンポーネントは、「一般コントロール」(ボタン、アイコン、メニューなどのコンポーネントを含みます)、「テキストおよび選択」、「データ・ビュー」(表やツリーなどのコンポーネントを含みます)、「メニューおよびツールバー」、「レイアウト」および「操作」の6つのアコーディオン・パネルに含まれます。
図3-8に、ADF Facesの一般コントロールを表示している「コンポーネント」ウィンドウを示します。
使用するコンポーネントを選択し、ページにドラッグします。
新たに追加されたコンポーネントを使用して、JDeveloperでビジュアル・エディタのページが再描画されます。ビジュアル・エディタでは、ページのコンポーネントを直接選択し、ポップアップ・メニューを使用してコンポーネントを追加できます。
ヒント 「コンポーネント」ウィンドウからコンポーネントをドラッグし、構造ウィンドウにドロップしたり、ソース・エディタ内のコードに直接ドロップすることもできます。ソース・エディタでページを直接編集することで、いつでもコンポーネントを追加できます。ソース・エディタにページを表示するには、ウィンドウの下部にある「ソース」をクリックします。 |
コンポーネントを「コンポーネント」ウィンドウからJSFページにドラッグ・アンド・ドロップすると、対応するコードがJSFページに自動的に追加されます。このコードには、コンポーネントのレンダリングに必要なタグと一部のコンポーネント属性の値が含まれます。例3-15に、入力テキスト・コンポーネントとボタン・コンポーネントをパレットからドロップした場合のコードを示します。
例3-15 JDeveloperでJSFページに宣言的に追加されるタグ
<af:inputText label="Label 1" id="it1"/> <af:button text="button 1" id="b1"/>
注意: 自動コンポーネント・バインディングを使用するよう選択した場合、ページのバッキングBeanの対応するプロパティに値がバインドされたbinding 属性もJDeveloperによって追加されます。詳細は、3.4.4項「自動コンポーネント・バインディングに関する必知事項」を参照してください。 |
必須である子コンポーネントを含むコンポーネント(表、リストなど)をドロップすると、JDeveloperでウィザードが起動され、親と各子コンポーネントを定義できます。図3-9に、表コンポーネントと表の子である列コンポーネントの作成に使用する「表」ウィザードを示します。
例3-16に、ウィザードを使用して3つの列を持つ表を作成した場合に作成されるコードを示します。各列はデータの表示にoutputText
を使用します。
例3-16 表コンポーネントの宣言コード
<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
コンポーネントの属性が表示されている「プロパティ」ウィンドウを示します。
「プロパティ」ウィンドウには、類似のプロパティをグループにした各セクションがあります。たとえば、「プロパティ」ウィンドウでは、inputText
によく使用される属性は「共通」セクションにまとめられ、コンポーネントの動作に影響するプロパティは「動作」セクションにまとめられています。図3-11に、inputText
コンポーネントの「プロパティ」ウィンドウにある「動作」セクションを示します。
始める前に:
ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、3.4項「ビュー・ページの作成」を参照してください。
コンポーネント属性の設定手順:
ビジュアル・エディタまたは「構造」ウィンドウ、あるいはソース・エディタでのタグの直接選択で、コンポーネントを選択します。
「プロパティ」ウィンドウで、設定する属性が含まれているセクションを開きます。
ヒント 一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。インスペクタの最上部の検索フィールドに属性名を入力して、属性を検索できます。 |
フィールドに値を直接入力するか、フィールドにドロップダウン・リストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるドロップダウンを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、3.5項「EL式の作成」を参照してください。このポップアップには、図3-12に示すようにプロパティの説明も表示されます。
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の作成と使用の詳細は、3.6項「マネージドBeanの作成と使用」を参照してください。EL式の詳細は、http://www.oracle.com/technetwork/java/index.html
の「Java EE 6 tutorial」を参照してください。
注意: EL式を編集可能コンポーネントのvalue 属性に使用している場合は、そのコンポーネントに対応する設定メソッドが必要です。そうでないと、EL式は読取り専用と評価され、値の更新は許可されません。
たとえば、ページに public void setIt1(RichInputText it1) { this.it1 = it1; } public RichInputText getIt1() { return it1; } |
標準のEL到達可能オブジェクトおよびオペランドとともに、ADF FacesはEL関数タグを提供します。これらは、EL式で使用できる特定の機能を提供するタグです。書式タグを使用して文字列メッセージにパラメータを追加でき、タイム・ゾーン・タグを使用して、タイム・ゾーンを返すことができます。書式タグの詳細は、3.5.2項「EL書式タグの使用方法」を参照してください。タイム・ゾーン・タグの詳細は、11.5.3項「inputDateコンポーネントなしでのタイム・ゾーンの選択に関する必知事項」を参照してください。
JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。「プロパティ」ウィンドウからビルダーにアクセスできます。
始める前に
EL式に関する知識が役立つ場合があります。詳細は、3.5項「EL式の作成」を参照してください。
式ビルダーの使用手順:
「プロパティ」ウィンドウで、変更する属性を見つけて、右端のドロップダウン・メニューを使用して「式ビルダー」を選択します。
次の機能を使用して式を作成します。
「変数」ドロップダウンを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。
ツリーの絞り込みには、ドロップダウン・フィルタを使用するか、検索フィールドに検索条件を入力します。ADF Facesで公開されているELでアクセス可能なオブジェクトは、図3-13に示すように、「JSFマネージドBean」ノードの「adfFacesContext」ノードにあります。
ヒント これらのオブジェクトの詳細は、Oracle ADF Faces Java APIリファレンスを参照してください。 |
ツリーで項目を選択すると、その項目がEL式内の「式」ボックスに移動されます。「式」ボックスに式を直接入力することもできます。
演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。
図3-14に、explorer
マネージドBeanのlabel
プロパティにコンポーネントのラベルの値をバインドする式の作成に使用される「式ビルダー」ダイアログを示します。
ヒント EL式を作成する正しい構文の使用の詳細は、http://download.oracle.com/javaee/index.html">>http://download.oracle.com/javaee/index.html のJava EE6チュートリアルを参照してください。 |
ADF EL書式タグでは、プレースホルダ・パラメータを使用するテキストを作成でき、このテキストを、String
を受け取るコンポーネント属性の値として使用できます。実行時に、プレースホルダはパラメータ値で置換されます。
たとえば、現在のユーザーの名前がマネージドBeanに格納され、メッセージ内でその名前をoutputText
コンポーネントの値として表示するとします。例3-17に示すように、formatString
タグを使用できます。
例3-17 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
タグを使用する場合は、キーと値の両方を設定します。例3-18に、formatNamed2
タグを使用して特定のディスク上のファイル数を表示するメッセージを示します。このメッセージには2つのパラメータが含まれます。
必要なEL式はJDeveloperで作成され、作成されない式は式ビルダーを使用して作成できますが、マネージドBean内でEL式にアクセスしたり、EL式を設定または起動する必要がある場合もあります。
例3-19に、EL式への参照を取得し、適合するオブジェクトを返す(または作成する)方法を示します。
例3-19 マネージド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); }
例3-20に、メソッド式を解決する方法を示します。
例3-20 マネージド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); }
例3-21に、マネージドBeanで新たにオブジェクトを設定する方法を示します。
例3-21 マネージド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 6チュートリアルを参照してください。
ベスト・プラクティス: マネージド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に関する知識が役立つ場合があります。詳細は、3.6項「マネージドBeanの作成と使用」を参照してください。
マネージドBeanの作成および登録手順:
「アプリケーション」ウィンドウで、アプリケーションのfaces-config.xmlをダブルクリックします。
エディタ・ウィンドウで、「概要」タブをクリックします。
概要エディタで、「マネージドBean」ナビゲーション・タブをクリックします。
図3-15に、File Explorerアプリケーションを含むADF Facesのデモ・アプリケーションで使用されるfaces-config.xml
ファイルの場合のエディタを示します。
「追加」アイコンをクリックして「マネージドBean」表に行を追加します。
「マネージドBeanの作成」ダイアログで値を入力します。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。JDeveloperでクラス・ファイルを作成する場合は、「クラスが存在しない場合は生成」オプションを選択します。
注意: マネージドBeanの登録または値の格納に使用するスコープを決める際には、次に留意してください。
様々なオブジェクト・スコープの詳細は、5.6項「オブジェクト・スコープ・ライフサイクル」を参照してください。 |
オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「Managed Bean」表でBeanを選択した状態で「新規」アイコンをクリックし、「管理プロパティ」表に行を追加します。「プロパティ」ウィンドウで、プロパティ名を入力します(他のフィールドはオプションです)。
注意: このエディタを使用して管理プロパティを宣言することはできますが、対応するコードはJavaクラスで生成されません。適切なタイプのプライベート・メンバー・フィールドを作成し、コード・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を選択して、これらのBeanプロパティに対応するget およびset メソッドを生成することにより、コードを追加する必要があります。 |
マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。例3-22に、viewパッケージに格納されたMyBean
クラスに追加されるコードを示します。
ここでページに必要なロジックを追加する必要があります。このロジックは、マネージドBeanのmanaged-bean-name
を参照するEL式を使用して参照できます。たとえば、my_bean
マネージドBeanのmyInfo
プロパティにアクセスする場合、EL式は次のようになります。
#{my_bean.myInfo}
JDeveloperで、faces-config.xml
ファイルへのmanaged-bean
要素の追加も行われます。例3-23は、MyBean
クラスに対して作成された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
インスタンスを取得するために使用できるシリアライズ可能参照オブジェクトを作成します。例3-24に、マネージドBeanがUIComponentReference
APIを使用して検索フィールドの値を取得および設定する方法を示します。
例3-24 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を処理する際に、ADF FacesクラスのJavadocを表示することが必要になる場合があります。JavadocはJDeveloperから表示できます。
ADF Faces Javadocは、JDeveloperから直接表示できます。
クラスのJavadocを表示する手順:
メイン・メニューから、「ナビゲート」→「Javadocに移動」を選択します。
「Javadocに移動」ダイアログで、表示するクラス名を入力します。名前が正確にわからない場合でも、名前を入力し始めると、JDeveloperによって名前が合致するクラスのリストが表示されます。ADF Facesコンポーネントは、oracle.adf.view.rich
パッケージにあります。
ヒント Javaクラス・ファイルでは、名前または関数にカーソルを置いて[Ctrl]+[D]を押すことで、クラス名参照またはJavaScript関数コールのJavadocに直接移動できます。 |