ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド
11g リリース2(11.1.2.4.0)
B66719-05
  目次へ移動
目次

前
 
次
 

3 ADF FacesとJDeveloperの概要

この章では、JDeveloperを使用してADF Facesアプリケーションを宣言的に作成する方法について説明します。

この章では、次の項目について説明します。

3.1 JDeveloperでの宣言的開発について

JDeveloper 11gをADF FacesおよびJSFと組み合せて使用すると、EL式の作成や自動コンポーネント・バインディングなどのようにページやマネージドBeanを宣言的に生成できるケースが多くなります。また、ナビゲーションや構成を制御するメタデータなどのXMLメタデータが宣言的に生成されるケースも多くなります。

大まかにとらえると、ADF Facesのビュー・プロジェクト開発プロセスは次の作業で構成されます。

開発サイクル全体を通じて継続されるタスクとしては、次のものがあります。

JDeveloperには、デバッグやテストの機能も含まれています。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「ADFコンポーネントのテストとデバッグ」を参照してください。

3.2 アプリケーション・ワークスペースの作成

新規アプリケーションを作成する最初のステップは、名前を割り当て、ソース・ファイルを保存するディレクトリを指定することです。ビュー・レイヤーのみ含むアプリケーションを作成するか、ADF Facesプロジェクトを既存のアプリケーションに追加できます。


注意:

このドキュメントでは、使用されているビジネス・サービスやそれらのサービスへのバインドに関係なく、アプリケーションでADF Facesプロジェクトを作成する方法についてのみ説明します。ADF FacesをADFモデル・レイヤー、ADFコントローラおよびADFビジネス・コンポーネントとともに使用する方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。ADF FacesをADFモデル・レイヤー、EJBおよびJPAとともに使用する方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。


3.2.1 ADF Facesアプリケーション・ワークスペースの作成方法

アプリケーション・ワークスペースの作成には、アプリケーションの作成ウィザードを使用します。

アプリケーションを作成する手順:

  1. JDeveloperのメイン・メニューで、「ファイル」→「新規」の順に選択します。

    新規ギャラリが開き、作成するアプリケーション・コンポーネントを選択できます。

  2. 「アプリケーション」→「カスタム・アプリケーション」を選択します。

  3. 「カスタム・アプリケーションの作成」ダイアログで、選択項目の名前、ディレクトリの場所およびパッケージ接頭辞を設定し、「次へ」をクリックします。

  4. 「プロジェクトの名前付け」ページで、必要に応じて、ビュー・プロジェクトの名前と場所を変更できます。「プロジェクトの機能」タブで、「ADF Facesコンポーネント」「選択済」に移動します。ADF Facesに必要なライブラリとメタデータ・ファイルがプロジェクトに追加されます。「次へ」をクリックします。

  5. 「Java設定の構成」ページで、作成するJavaクラスのパッケージ名、Javaソース・パスおよび出力ディレクトリを必要に応じて変更します。「終了」をクリックします。


    ヒント:

    ADF Facesを既存のプロジェクト(JEE Webアプリケーションのビュー・プロジェクトなど)に追加することもできます。これは次のように行います。

    1. プロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。

    2. 「プロジェクト・プロパティ」ダイアログで、「機能」を選択し、「追加」(緑のプラス記号)アイコンをクリックし、ADF Facesを「選択済」ペインに移動します。


3.2.2 アプリケーション・ワークスペースを作成する場合の処理

カスタム・テンプレートを使用してアプリケーション・ワークスペースを作成し、プロジェクトに対してADF Facesを選択すると、JDeveloperによって、ADF Facesアプリケーションに必要なすべてのソースおよび構成ファイルを含むプロジェクトが作成されます。また、次のライブラリがJDeveloperでプロジェクトに追加されます。

  • JSF 2.0

  • JSTL 1.2

  • JSPランタイム

プロジェクトの作成後、名前を変更できます。図3-1に、新規ADF Facesアプリケーションのワークスペースを示します。

図3-1 ADF Facesアプリケーションの新規ワークスペース

JDeveloperのワークスペースにプロジェクトとファイルが含まれます

アプリケーションの作成時に選択したオプションに基づいて、JDeveloperで構成ファイルに構成パラメータも設定されます。web.xmlファイルには、JSFアプリケーションの実行に必要な構成が含まれます(ADF Facesに固有の設定は、ADF Facesコンポーネントを使用してJSFページを作成したときに追加されます)。例3-1に、Java EEアプリケーションの新規作成時にJDeveloperによって生成されるweb.xmlファイルを示します。

例3-1 生成されたweb.xmlファイル

<?xml version = '1.0' encoding = 'windows-1252'?>
<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">
  <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機能に必要な構成は、このガイドの別の章で説明されています。たとえば、永続性の変更フレームワークを使用するために必要な構成については、第32章「JSFページでのユーザー・カスタマイズの許可」で説明しています。ADF Facesアプリケーションの構成の詳細は、付録A「ADF Facesの構成」で説明しています。

3.3 ページ・フローの定義

アプリケーション・ワークスペース作成後の次のステップは、通常、UIのフローを設計することです。標準JSFアプリケーションの場合と同様に、ADF Facesアプリケーションでは、ページ・フローの定義にナビゲーション・ケースとルールが使用されます。これらの定義は、faces-config.xmlファイルに格納されます。JDeveloperには、アイコンを使用してページ・フローを宣言的に定義できるダイアグラマがあります。

図3-2に、特定の顧客のデータを表示するDisplayCustomerページと、ユーザーが顧客情報を編集できるEditCustomerページの2つのページを含む簡単なページ・フロー用に作成されたナビゲーション・ダイアグラムを示します。ページの表示からページの編集へ進むナビゲーション・ルールと、ページの編集からページの表示へ戻るナビゲーション・ルールが1つずつあります。

図3-2 JDeveloperのナビゲーション・ダイアグラム

JDeveloperでのナビゲーションの設定

注意:

Oracle ADF Modelのデータ・バインディングおよびADFコントローラを使用する場合は、ADFタスク・フローを使用してナビゲーション・ルールを定義します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「ADFタスク・フローの概説」を参照してください。



ベスト・プラクティス:

ADF ControllerはJSFデフォルト・コントローラの拡張です。技術的にはアプリケーションでJSFコントローラとADF Controllerを使用できますが、いずれか一方のみを使用するようにしてください。


JSF 2.0の登場により、2つのページ間の単純なナビゲーションにはナビゲーション・ケースを作成する必要がなくなりました。すべての使用可能なルールを確認した後で一致するナビゲーション・ケースが見つからない場合、ナビゲーション・ハンドラはアクションの結果がビューIDに対応するかどうかを確認します。アクションの結果に一致するビューが見つかった場合は、一致するビューへの暗黙的なナビゲーションが行われます。JSFアプリケーションでのナビゲーション機能の詳細は、Sun社のWebサイト(http://download.oracle.com/javaee/index.html)の「Java EE 6 tutorial」を参照してください。

3.3.1 ページ・フローの定義方法

FaceletまたはJSPXページを使用し、ナビゲーション・ダイアグラマを使用して、ページ・フローを宣言的に作成します。ダイアグラマを使用すると、アプリケーションでナビゲーションが機能するために必要なXMLメタデータが、JDeveloperによってfaces-config.xmlファイルに作成されます。

始める前に:

ページ・フローに関する知識が役立つ場合があります。詳細は、3.3項「ページ・フローの定義」を参照してください。

ページ・フローを作成する手順:

  1. アプリケーション・ナビゲータで、アプリケーションのfaces-config.xmlファイルをダブルクリックします。これは、デフォルトではプロジェクトのWeb Content/WEB-INFノードにあります。

  2. エディタ・ウィンドウで、「ダイアグラム」タブをクリックし、ナビゲーション・ダイアグラマを開きます。

  3. コンポーネント・パレットが表示されない場合は、メイン・メニューから「表示」→「コンポーネント・パレット」を選択します。デフォルトでは、コンポーネント・パレットはJDeveloperの右上部に表示されます。

  4. コンポーネント・パレットでドロップダウン・メニューを使用して「JSFダイアグラム・オブジェクト」を選択します。

    コンポーネントが、「コンポーネント」「注釈」の2つのアコーディオン・パネルに含まれています。図3-3に、JSFナビゲーション・コンポーネントを表示しているコンポーネント・パレットを示します。

    図3-3 JDeveloperのコンポーネント・パレット

    ナビゲーション・アイテムを含むコンポーネント・パレット
  5. 使用するコンポーネントを選択し、ダイアグラムにドラッグします。

    新たに追加されたコンポーネントを使用してJDeveloperでダイアグラムが再描画されます。


ヒント:

「概要」タブをクリックし、ナビゲーション・ルールとナビゲーション・ケースの作成を概要エディタで行うこともできます。概要エディタを使用したナビゲーション作成の詳細は、[F1]キーで参照できます。

また、ソース・エディタでページを直接編集することで、要素をfaces-config.xmlファイルに手動で追加できます。ソース・エディタにファイルを表示するには、「ソース」タブをクリックします。


アプリケーションのナビゲーションを定義したら、次はページを作成したり、ナビゲーションを使用するコンポーネントを追加したりできます。ページでのナビゲーション・コンポーネントの使用の詳細は、第20章「ナビゲーション・コンポーネントの使用」を参照してください。

3.3.2 ダイアグラマを使用してページ・フローを作成する場合の処理

ページ・フローの作成にダイアグラマを使用すると、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>

3.4 ビュー・ページの作成

計画段階で作成したページ・フローからページ・アイコンをダブルクリックすると、実際のJSPページ・ファイルを作成できます。FaceletページまたはJSPページの作成を選択できます。Faceletページでは、拡張子*.jsfを使用します。Faceletは、JSF中心の宣言的XMLビュー定義テクノロジであり、JSPエンジンの使用の代替方法を提供します。

ADF FacesアプリケーションのJSPページを作成する場合は、拡張子*.jspxを使用するXMLベースのJSPドキュメントを作成します。XMLベースのドキュメントの使用には、次の利点があります。


ベスト・プラクティス:

Faceletの使用には、次の利点があります。

  • FaceletレイヤーはJSF専用に作成されるため、タグのコンパイルと実行時にオーバーヘッドが削減され、パフォーマンスが向上します。

  • Faceletは、JSF 2.0のプライマリ・ビュー定義テクノロジと考えられます。

  • JSF標準に対する将来のパフォーマンス拡張の一部は、Faceletでのみ使用可能になります。


ADF Facesには、ページ全体のレイアウトを定義する際に使用可能なコンポーネントが多数用意されています。JDeveloperには、これらのコンポーネントを使用した事前定義済のクイック・スタート・レイアウトが含まれており、すばやく簡単に正しくレイアウトを構築できます。1列、2列または3列のレイアウトから選択でき、列の動作を指定できます。たとえば、1つの列の幅はロックし、他の列は拡大してブラウザの使用可能な領域を埋めることができます。図3-4に、2番目の列が2つのペインに分割されている2列レイアウトで使用可能なクイック・スタート・レイアウトを示します。レイアウト・コンポーネントの詳細は、第9章「Webページ上のコンテンツの編成」を参照してください。

図3-4 クイック・レイアウト

多数のクイック・レイアウトから選択できます

ベスト・プラクティス:

すべてのブラウザで正しく動作するレイアウトの作成には時間がかかる場合があります。事前定義されたクイック・レイアウトを使用して、潜在的な問題を回避します。


レイアウト・コンポーネントの追加とともに、選択したクイック・レイアウトにテーマを適用することも選択できます。これらのテーマは、クイック・スタート・レイアウトで使用されるコンポーネントの一部に色のスタイルを追加します。色およびその追加場所を確認するには、付録D「クイック・スタート・レイアウトのテーマ」を参照してください。テーマの詳細は、第28章「スタイルおよびスキンを使用した外観のカスタマイズ」を参照してください。

同じレイアウトをアプリケーションの多くのページで使用する場合には、ADF Facesでは事前定義済ページ・テンプレートを作成および使用できます。テンプレートを作成する場合、テンプレートの開発者はテンプレートを使用するページのレイアウトを決定するだけではなく、すべてのページに表示される静的コンテンツを含めたり、各ページで有効な値に置き換えられるプレースホルダ属性を作成できます。

たとえば、ADF FacesにはOracle Three-Column-Layoutテンプレートが含まれています。このテンプレートには、図3-5に示すように、ブランド、ヘッダー、著作権情報などの特定のコンテンツ用の領域が含まれ、静的ロゴおよびビジー・アイコンも表示されます。

図3-5 Oracle3列レイアウト・テンプレート

Oracle Three Column Layoutテンプレート

テンプレートにレイアウトなどの変更を加えるたびに、テンプレートを使用するページも自動的に更新されます。テンプレートの作成と使用の詳細は、10.4項「ページ・テンプレートの使用」を参照してください。


ベスト・プラクティス:

テンプレートを使用して、一貫性を実現し、将来的にアプリケーションの複数のページを簡単に更新できるようにします。


JSFページを作成する際、ページに関連するバッキングBeanを作成することも選択できます。バッキングBeanを使用すると、ページ上のコンポーネントにプログラムからアクセスできます。JSFページでのバッキングBeanの詳細は、3.4.4項「自動コンポーネント・バインディングについて」を参照してください。


ベスト・プラクティス:

プログラムからのアクセスや処理が必要なコンポーネントを含むページについてのみバッキングBeanを作成します。リスナーなど、コンポーネント属性のEL式を使用してアクセスする追加機能を提供することのみ必要な場合は、かわりにマネージドBeanを使用します。


ページをモバイル機器で表示可能にすることを選択できます。ページ・ファイルを作成した後は、そのファイルにUIコンポーネントを追加したり、そのページのソースを操作することができます。

3.4.1 JSFページの作成方法

「JSFページの作成」ダイアログを使用して、JSFページ(JSPまたはFacelet)を作成します。

始める前に:

ページの作成時には様々なオプションに関する知識が役立つ場合があります。詳細は、3.4項「ビュー・ページの作成」を参照してください。

JSFページを作成する手順:

  1. アプリケーション・ナビゲータで、ページを保存するディレクトリを右クリックし、「新規」を選択します。「新規ギャラリ」で「Web層」ノードを展開し、「JSF/Facelets」「ページ」の順に選択し、「OK」をクリックします。

    または

    ナビゲーション・ダイアグラムから、まだ作成されていないページのページ・アイコンをダブルクリックします。

  2. 「JSFページの作成」ダイアログに従って操作を進めます。ヘルプを参照するには、ダイアログで「ヘルプ」をクリックします。バッキングBeanおよび関連するバインディングの自動作成に使用できる「マネージドBean」タブの詳細は、3.4.4項「自動コンポーネント・バインディングについて」を参照してください。


注意:

Faceletページでは任意の拡張子を使用できますが、Faceletページをカスタマイズ可能にするには.jsf拡張子を使用する必要があります。詳細は、第32章「JSFページでのユーザー・カスタマイズの許可」を参照してください。


3.4.2 JSFページの作成時に発生する処理

「JSFページの作成」ダイアログを使用してJSFページを作成すると、JDeveloperによって物理ファイルが作成され、必要なコードがファイル内に追加されます(コンポーネント・ライブラリをインポートし、ページを表示するためのコード)。作成されるコードは、JSPXまたはFaceletページを作成するよう選択したかどうかによって異なります。

例3-3に、JDeveloperで最初に作成されたときのFaceletページを示します。

例3-3 JDeveloperで作成された宣言的Faceletページ・ソース

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<f:view 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 title="untitled1.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: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 title="untitled1" 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: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 title="untitled2" 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="db1">
                            <f:facet name="center">
                                <af:decorativeBox theme="medium" id="db2">
                                    <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も作成および登録され、既存のコンポーネントがその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に、JSPXページの作成後に作成されるweb.xmlファイルを示します。

例3-7 JSFページの作成後のweb.xmlファイルのコード

<?xml version = '1.0' encoding = 'windows-1252'?>
<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>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>
    <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>
  <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.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>
  <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.0" 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>fusionFx</skin-family>
                  <skin-version>v2</skin-version>
</trinidad-config>

ページがJDeveloperに初めて表示される場合、ビジュアル・エディタ(「設計」タブをクリックしてアクセス)に表示され、WYSIWYG環境でページを見ることができます。「プレビュー」タブをクリックしてブラウザ・ウィンドウでページをプレビューするか、「ソース」タブをクリックしてページのソースをソース・エディタに表示することもできます。JDeveloperの左下部にある構造ウィンドウには、ページが階層形式で表示されます。

3.4.3 Faceletsエンジンを使用するためのアプリケーションの更新について

JSF 2.0 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のリリース・ノートを参照してください。


3.4.4 自動コンポーネント・バインディングについて

バッキングBeanは、JSFページのUIコンポーネントのロジックとプロパティを含むマネージドBeanです(マネージドBeanの詳細は、3.6項「マネージドBeanの作成と使用」を参照してください)。JSFページを作成する際、「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スコープを使用します(スコープの詳細は、5.6項「オブジェクト・スコープ・ライフサイクル」を参照してください)。


    注意:

    JDeveloperでは、マネージドBeanのプロパティ・エントリはfaces-config.xmlファイルに作成されません。特定のプロパティ値でBeanをインスタンス化する場合、この構成をfaces-config.xmlファイルに手動で行う必要があります。詳細は、A.3.1項「faces-config.xmlでのADF Facesの構成方法」を参照してください。


  • 新たに作成または選択されたBeanの場合、JSPにあるコンポーネント・タグごとにプロパティとアクセッサ・メソッドが追加されます。JDeveloperでバインディング属性の値としてEL式を使用し、コンポーネント・タグとそのプロパティがバインドされます。

  • ページから削除されたコンポーネントのプロパティとメソッドが削除されます。

ページが作成され、コンポーネントが追加された後、ビジュアル・エディタでコンポーネントをダブルクリックして、使用するコンポーネントにメソッド・バインディング式を宣言的に追加できます(これにより、属性をバインドするマネージドBeanおよびメソッドを選択できるエディタが起動します)。ページに自動コンポーネント・バインディングが使用されている場合、コンポーネントをダブルクリックすると、コンポーネントがバインドされる可能性のあるスケルトン・メソッドが、ページのバッキングBeanに自動的に作成されます。たとえば、コマンド・ボタン・コンポーネントを追加し、ビジュアル・エディタでこれをダブルクリックすると、「バインドActionプロパティ」ダイアログにページのバッキングBeanと新しいスケルトン・アクション・メソッドが、図3-6に示すように表示されます。

図3-6 「バインドActionプロパティ」ダイアログ

メソッドにバインドするバインド・アクション・プロパティ・ダイアログ

これらのメソッドから選択するか、新しいメソッド名を入力すると、JDeveloperでページのバッキングBeanに新規スケルトン・メソッドが自動的に作成されます。その後、メソッドにロジックを追加する必要があります。


注意:

自動コンポーネント・バインディングがページで使用されていない場合は、既存のマネージドBeanを選択するか、新規バッキングBeanを作成してバインディングを作成する必要があります。


たとえば、myfile.jspxというファイル名でJSFページを作成したとします。JDeveloperによるデフォルトのバッキングBeanの自動作成を選択した場合は、JDeveloperによって、view.backing.MyFile.javaというバッキングBeanが作成され、ViewControllerプロジェクトの¥srcディレクトリに配置されます。このバッキングBeanはfaces-config.xmlファイルでマネージドBeanとして構成され、デフォルトのマネージドBean名はbacking_myfileとなります。

例3-12に、自動コンポーネント・バインディングを使用し、forminputTextおよびcommandButtonコンポーネントを含むJSPのコードを示します。

例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:commandButton text="commandButton 1"
                        binding="#{backing_MyFile.cb1}"
                        id="cb1"/>
    </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.RichCommandButton;
 
public class MyFile {
    private RichForm f1;
    private RichDocument d1;
    private RichInputText it1;
    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 it1) {
        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;
    }
}

例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に示すようなイベントのスケルトン・メソッドが作成されます。

図3-7 ソース・エディタでのスケルトン・メソッドの宣言的作成

JDeveloperソース・エディタ

ページの作成後に、自動コンポーネント・バインディングをオンまたはオフにでき、バッキングBeanを別のJavaクラスに変更することもできます。ビジュアル・エディタにJSPを開き、「JDeveloper」メニューから「設計」→「ページ・プロパティ」を選択します。ここで、「自動バインド」オプションを選択または選択解除したり、マネージドBeanクラスを変更したりできます。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。


注意:

自動バインディングを無効にした場合、ページでバインドされている既存のコンポーネントのバインド属性は変わりません。自動バインディングを有効にした場合、バインドされているすべての既存のコンポーネントと新たに挿入するコンポーネントが、選択したバッキングBeanにバインドされます。自動バインディングが有効で、Beanの選択を変えた場合、既存のすべてのバインディングと新規バインディングが新しいBeanに切り替わります。


JSFページのバッキングBeanにはページ・エディタからアクセスできます。ページを右クリックして「移動先」を選択し、JSPに関連付けられているBeanのリストからBeanを選択します。

3.4.5 ADF FacesコンポーネントのJSFページへの追加方法

ページの作成後、コンポーネント・パレットを使用して、コンポーネントをページにドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要なページ・コードが宣言的に自動追加され、各コンポーネント属性に既定の値が設定されます。


ヒント:

特定のADF Facesコンポーネントの追加および使用の詳細な手順と情報は、第IV部「一般的なADF Facesコンポーネントの使用」を参照してください。



注意:

ADF FacesコンポーネントをMyFaces Trinidadコンポーネント(tr:タグ)またはその他のAjax対応ライブラリ・コンポーネントと同じページで使用することはできません。Trinidad HTMLタグ(trh:)はADF Facesコンポーネントと同じページで使用できますが、ブラウザ・レイアウトに問題が生じる場合があります。常にADF Facesコンポーネントのみを使用してレイアウトを実現するように試みてください。

ADF Facesコンポーネントを使用して作成したページと他のコンポーネントを使用して作成したページはアプリケーションに混在できることに注意してください。


ADF Facesコンポーネントをページに追加する手順:

  1. アプリケーション・ナビゲータで、JSFページをダブル・クリックして、それをエディタに開きます。

  2. コンポーネント・パレットが表示されない場合は、メニューから「表示」→「コンポーネント・パレット」を選択します。デフォルトでは、コンポーネント・パレットはJDeveloperの右上部に表示されます。

  3. コンポーネント・パレットでドロップダウン・メニューを使用して「ADF Faces」を選択します。


    注意:

    Faceletページの作成を選択した場合、ADF Facesコンポーネントのサブセットのみ使用可能になります。かわりに標準JSFコンポーネントを使用する必要があります。これらはドロップダウン・メニューから「JSF」を選択することで使用できます。



    ヒント:

    コンポーネント・パレットで「ADF Faces」ページが使用可能でない場合は、ADF Facesタグ・ライブラリをプロジェクトに追加する必要があります。

    JSPXファイルの場合:

    1. コンポーネント・パレットの内部を右クリックし、タブ・ライブラリの編集を選択します。

    2. 「コンポーネント・パレットのカスタマイズ」ダイアログで、「ADF Facesコンポーネント」「選択済のライブラリ」に移動し、「OK」をクリックします。

    Faceletファイルの場合:

    1. プロジェクト・ノードを右クリックして、「プロジェクト・プロパティ」を選択します。

    2. 「JSPタグ・ライブラリ」を選択して、ADF Facesライブラリをプロジェクトに追加します。詳細なヘルプを参照するには、「ヘルプ」をクリックするか[F1]を押します。


    コンポーネントは、「一般コントロール」(ボタン、アイコン、メニューなどのコンポーネントを含みます)、「テキストおよび選択」「データ・ビュー」(表やツリーなどのコンポーネントを含みます)、「メニューおよびツールバー」「レイアウト」および「操作」の5つのアコーディオン・パネルに含まれます。

    図3-8に、ADF Facesの一般コントロールを表示しているコンポーネント・パレットを示します。

    図3-8 JDeveloperのコンポーネント・パレット

    ADF Facesコンポーネントをパレットからドロップできます
  4. 使用するコンポーネントを選択し、ページにドラッグします。

    新たに追加されたコンポーネントを使用して、JDeveloperでビジュアル・エディタのページが再描画されます。ビジュアル・エディタでは、ページのコンポーネントを直接選択し、ポップアップ・メニューを使用してコンポーネントを追加できます。


ヒント:

コンポーネントをパレットから構造ウィンドウに、またはソース・エディタのコードに直接ドラッグ・アンド・ドロップできます。

ソース・エディタでページを直接編集することで、いつでもコンポーネントを追加できます。ソース・エディタにページを表示するには、ウィンドウの下部にある「ソース」をクリックします。


3.4.6 コンポーネントをページへ追加する場合の処理

コンポーネントをコンポーネント・パレットからJSFページにドラッグ・アンド・ドロップすると、対応するコードがJSFページに自動的に追加されます。このコードには、コンポーネントのレンダリングに必要なタグと一部のコンポーネント属性の値が含まれます。例3-15に、入力テキスト・コンポーネントとボタン・コンポーネントをパレットからドロップした場合のコードを示します。

例3-15 JDeveloperでJSFページに宣言的に追加されるタグ

<af:inputText label="Label 1" id="it1"/>
<af:commandButton text="commandButton 1" id="cb"/>

注意:

自動コンポーネント・バインディングを使用するよう選択した場合、ページのバッキングBeanの対応するプロパティに値がバインドされたbinding属性もJDeveloperによって追加されます。詳細は、3.4.4項「自動コンポーネント・バインディングについて」を参照してください。


必須である子コンポーネントを含むコンポーネント(表、リストなど)をドロップすると、JDeveloperでウィザードが起動され、親と各子コンポーネントを定義できます。図3-9に、表コンポーネントと表の子である列コンポーネントの作成に使用する表ウィザードを示します。

図3-9 JDeveloperの表ウィザード

ADF Facesの表の作成に使用する表ウィザード

例3-16に、ウィザードを使用して3つの列を持つ表を作成した場合に作成されるコードを示します。各列はデータの表示にoutputTextを使用します。

例3-16 表コンポーネントの宣言コード

<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>

3.4.7 コンポーネント属性の設定方法

コンポーネントのページへのドロップ後、プロパティ・インスペクタ(デフォルトではJDeveloperの右下部に表示)を使用して、各コンポーネントの属性値を設定できます。


ヒント:

プロパティ・インスペクタが表示されない場合は、メイン・メニューから「表示」→「プロパティ・インスペクタ」を選択します。


図3-10に、inputTextコンポーネントの属性を表示しているプロパティ・インスペクタを示します。

図3-10 JDeveloperのプロパティ・インスペクタ

プロパティ・インスペクタでプロパティ値を設定できます

プロパティ・インスペクタには、同様のプロパティをグループにしたセクションがあります。たとえば、プロパティ・インスペクタでは、inputTextによく使用される属性は「共通」セクションにまとめられ、コンポーネントの動作に影響するプロパティは「動作」セクションにまとめられています。図3-11に、inputTextコンポーネントのプロパティ・インスペクタの「動作」セクションを示します。

図3-11 プロパティ・インスペクタの「動作」セクション

コンポーネントの動作に影響するプロパティ

コンポーネント属性の設定手順:

  1. ビジュアル・エディタまたは構造ウィンドウ、あるいはソース・エディタでのタグの直接選択で、コンポーネントを選択します。

  2. プロパティ・インスペクタで、設定する属性が含まれるセクションを開きます。


    ヒント:

    一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。インスペクタの最上部の検索フィールドに属性名を入力して、属性を検索できます。


  3. フィールドに値を直接入力するか、フィールドにドロップダウン・リストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるドロップダウンを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、3.5項「EL式の作成」を参照してください。このポップアップには、図3-12に示すようにプロパティの説明も表示されます。

    図3-12 プロパティ・ツールとヘルプ

    プロパティ・ツールとヘルプ

3.4.8 プロパティ・インスペクタを使用する場合の処理

プロパティ・インスペクタを使用して属性値を設定または変更すると、入力された値に合致するよう、属性のページ・ソースがJDeveloperで自動的に変更されます。


ヒント:

ソース・エディタでページを直接編集することで、いつでも属性値を変更できます。ソース・エディタにページを表示するには、ウィンドウの下部にある「ソース」をクリックします。


3.5 EL式の作成

EL式は、属性と実行時に決まるオブジェクト値とのバインドに、ADF Facesアプリケーション全体で使用されます。たとえば、#{UserList.selectedUsers}は選択したユーザーのセットを参照でき、#{user.name}は特定のユーザー名を参照でき、#{user.role == 'manager'}はユーザーがマネージャかどうかを判断します。実行時、汎用式エバリュエータによって、これらの式に対してそれぞれListStringおよび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式は読取り専用と評価され、値の更新は許可されません。

たとえば、ページにinputTextコンポーネント(IDはinputText1)があり、その値が#{myBean.inputValue}に設定されているとします。inputText値を更新するには、myBeanマネージドBeanに次のような取得および設定メソッドが必要です。

    public void setIt1(RichInputText inputText1) {
        this.inputText1 = inputText1;
    }
 
    public RichInputText getInputText1() {
        return inputText1;
    }

標準のEL到達可能オブジェクトおよびオペランドとともに、ADF FacesはEL関数タグを提供します。これらは、EL式で使用できる特定の機能を提供するタグです。書式タグを使用して文字列メッセージにパラメータを追加でき、タイム・ゾーン・タグを使用して、タイム・ゾーンを返すことができます。書式タグの詳細は、3.5.2項「EL書式タグの使用方法」を参照してください。タイム・ゾーン・タグの詳細は、11.5.3項「inputDateコンポーネントなしでのタイム・ゾーンの選択について」を参照してください。

3.5.1 EL式の作成方法

JDeveloperの式ビルダーを使用してEL式を宣言的に作成できます。ビルダーにはプロパティ・インスペクタからアクセスできます。

始める前に

EL式に関する知識が役立つ場合があります。詳細は、3.5項「EL式の作成」を参照してください。

式ビルダーの使用手順:

  1. プロパティ・インスペクタで変更する属性を特定し、右端のドロップダウン・メニューを使用して「式ビルダー」を選択します。

  2. 次の機能を使用して式を作成します。

    • 「変数」ドロップダウンを使用して、式に含める項目を選択します。これらの項目は、階層形式のバインディング・オブジェクトであるツリーに表示されます。ツリーの各アイコンは、式で使用できる各種タイプのバインディング・オブジェクトを表します。

      ツリーの絞り込みには、ドロップダウン・フィルタを使用するか、検索フィールドに検索条件を入力します。ADF Facesで公開されているELでアクセス可能なオブジェクトは、図3-13に示すように、「JSFマネージドBean」ノードの「adfFacesContext」ノードにあります。

      図3-13 式ビルダーでのadfFacesContextオブジェクト

      adfFacesContextプロパティ

      ヒント:

      これらのオブジェクトの詳細は、ADF Faces Javadocを参照してください。


      ツリーで項目を選択すると、その項目がEL式内の「式」ボックスに移動されます。「式」ボックスに式を直接入力することもできます。

    • 演算子ボタンを使用して、式に論理演算子または算術演算子を追加します。

    図3-14に、explorerマネージドBeanのlabelプロパティにコンポーネントのラベルの値をバインドする式の作成に使用される「式ビルダー」ダイアログを示します。

    図3-14 「式ビルダー」ダイアログ

    「式ビルダー」ダイアログ

    ヒント:

    EL式を作成する正しい構文の使用の詳細は、http://download.oracle.com/javaee/index.htmlの「Java EE 6 tutorial」を参照してください。


3.5.2 EL書式タグの使用方法

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つのパラメータが含まれます。

例3-18 formatNamed2タグを使用したメッセージの表示

<af:outputText value="#{af:formatNamed2(
  'The disk named {disk}, contains {fileNumber} files', 'disk', bean.disk, 'fileNumber', bean.fileNumber)}" />

3.5.3 EL式のマネージドBean内での使用方法

必要な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);
  }
}

3.6 マネージドBeanの作成と使用

マネージド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構成ファイルに登録されます。


注意:

Oracle ADF Modelデータ・バインディングおよびADF Controllerを使用する場合は、faces-config.xmlファイルではなく、ADFタスク・フローにマネージドBeanを登録する必要があります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。


3.6.1 JDeveloperでのマネージドBeanの作成方法

faces-config.xmlファイルに概要エディタを使用して、マネージドBeanの作成とJSFアプリケーションへの登録を同時に行えます。

始める前に

マネージドBeanに関する知識が役立つ場合があります。詳細は、3.6項「マネージドBeanの作成と使用」を参照してください。

マネージドBeanの作成および登録手順:

  1. アプリケーション・ナビゲータで、faces-config.xmlファイルを開きます。

  2. エディタ・ウィンドウで、「概要」タブをクリックします。

  3. 概要エディタで、「マネージドBean」タブをクリックします。

    図3-15に、File Explorerアプリケーションを含むADF Facesのデモで使用されるfaces-config.xmlファイルの場合のエディタを示します。

    図3-15 faces-config.xmlファイル内のマネージドBean

    JSF構成エディタでのすべてのマネージドBeanの表示
  4. 「追加」アイコンをクリックして「マネージドBean」表に行を追加します。

  5. 「マネージドBeanの作成」ダイアログで値を入力します。ダイアログの使用の詳細が必要な場合は、「ヘルプ」をクリックします。JDeveloperでクラス・ファイルを作成する場合は、「クラスが存在しない場合は生成」オプションを選択します。


    注意:

    マネージドBeanを登録するスコープまたは値を格納するスコープを決める場合は、次のことを考慮してください。

    • 必ず、できるだけ狭いスコープを使用するようにしてください。

    • マネージドBeanがコンポーネント・インスタンスを受け入れおよび返すことでコンポーネント・バインディングに参加する場合(つまり、ページ上のUIコンポーネントがbinding属性を使用してBean上のコンポーネント・プロパティにバインドする場合)は、マネージドBeanがrequestまたはbackingBeanスコープに格納されている必要があります。これらのスコープの1つに格納できない場合(たとえば、高可用性の理由でsessionスコープに格納する必要がある場合)は、ComponentReference APIを使用する必要があります。詳細は、3.6.3項「コンポーネント・バインディングおよびマネージドBeanについて」を参照してください。

    • sessionScopeスコープは、ユーザー情報やコンテキスト情報などのセッション全体に関係する情報にのみ使用します。あるページから別のページへの値の受渡しには、sessionScopeスコープは使用しないようにします。

    様々なオブジェクト・スコープの詳細は、5.6項「オブジェクト・スコープ・ライフサイクル」を参照してください。


  6. オプションでBeanに管理プロパティを追加できます。Beanがインスタンス化される際、指定した値が管理プロパティに設定されます。「Managed Bean」表でBeanを選択した状態で「新規」アイコンをクリックし、「管理プロパティ」表に行を追加します。プロパティ・インスペクタで、プロパティ名を入力します(他のフィールドはオプションです)。


    注意:

    このエディタを使用して管理プロパティを宣言できますが、対応するコードはJavaクラスに生成されません。適切なタイプのプライベート・メンバー・フィールドを作成し、コード・エディタのポップアップ・メニューの「アクセッサの生成」メニュー項目を選択して、これらのBeanプロパティに対応するgetおよびsetメソッドを生成することにより、コードを追加する必要があります。


3.6.2 JDeveloperを使用してマネージドBeanを作成する場合の処理

マネージドBeanを作成する際、Javaファイルを生成するよう選択すると、指定された名前とデフォルト・コンストラクタを使用してスタブ・クラスが自動的に作成されます。例3-22に、viewパッケージに格納されたMyBeanクラスに追加されるコードを示します。

例3-22 マネージドBean用に生成されたコード

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要素の追加も行われます。例3-23は、MyBeanクラスに対して作成されたmanaged-bean要素を示しています。

例3-23 faces-config.xmlファイルでのマネージド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>

3.6.3 コンポーネント・バインディングおよびマネージド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インスタンスを取得するために使用できるシリアライズ可能参照オブジェクトを作成します。例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を参照してください。

3.7 ADF Faces Javadocの表示

ADF Facesを処理する際に、ADF FacesクラスのJavadocを表示することが必要になる場合があります。JavadocはJDeveloperから表示できます。

3.7.1 ADF Facesのソース・コードおよびJavadocの表示方法

ADF Faces Javadocは、JDeveloperから直接表示できます。

クラスのJavadocを表示する手順:

  1. メイン・メニューから、「ナビゲート」→「Javadocに移動」を選択します。

  2. 「Javadocに移動」ダイアログで、表示するクラス名を入力します。名前が正確にわからない場合、名前を入力し始めると、JDeveloperによって名前が合致するクラスのリストが表示されます。ADF Facesコンポーネントは、oracle.adf.view.richパッケージにあります。


    ヒント:

    Javaクラス・ファイルでは、名前または関数にカーソルを置いて[Ctrl]+[D]を押すことで、クラス名参照またはJavaScript関数コールのJavadocに直接移動できます。