この章では、ADF Facesを使用するためにユーザー・インタフェース・プロジェクトを設定するプロセスについて説明します。また、ユーザー・インタフェースにADF Facesコンポーネントを利用するWebページの作成およびレイアウトに関する基本情報も示します。
この章の内容は次のとおりです。
Oracle ADF Facesは、JavaServer Faces(JSF)に100%準拠したコンポーネント・ライブラリで、JSFアプリケーション開発用に一連の広範な拡張UIコンポーネントを提供します。JSF JSR 127仕様に基づいて、ADF FacesコンポーネントはJSFをサポートするIDEで使用できます。すなわち、ADF FacesはSun社のJSF Reference Implementation 1.1_01(以上)およびApache MyFaces 1.0.8(以上)と連携して機能します。
ADF Facesによってアプリケーションの一貫したルック・アンド・フィールが確保されるため、ルック・アンド・フィールの整合性よりもユーザー・インタフェースの操作性に集中できるようになります。コンポーネント・ライブラリは、多言語と翻訳の実装、およびアクセシビリティ機能をサポートします。また、ADF Facesは、HTML、モバイルおよびTelnetユーザーに対して複数のレンダー・キットをサポートします。つまり、Webページの表示に使用されるデバイスに関係なく、同一のコンポーネントを持つWebページを構築できます。
ADF Facesコンポーネントの部分ページ・レンダリング機能を使用すると、完全なページ・リフレッシュを必要とせずに表示を更新する対話型Webページを作成できます。オラクル社では、将来的に、Ajaxテクノロジ(JavaScript、XMLおよびDocument Object Model(DOM))をさらに高度な形で使用することにより、デスクトップ・スタイルのアプリケーションに近い操作性を備えたリッチなインターネット・アプリケーションを実現するレンダー・キットを提供する予定です。
ADF Facesには、JSF開発者が現在最も必要とする、次のような多くのフレームワークおよびコンポーネント機能があります。
部分ページ・レンダリング
クライアント側の変換および検証
ページ間での値の引渡しをより簡単にするプロセス・スコープ
クライアント側の状態保存の効率を向上させるハイブリッド状態保存方法
すべての入力コンポーネントに組み込まれているラベルおよびメッセージ表示のサポート
コンポーネントに組み込まれているアクセシビリティ・サポート
カスタム・スキンのサポート
モバイル・アプリケーションのサポート
ADF Faces UIコンポーネントには、列ソート機能と行選択機能がある高度な表、データを階層的に表示するためのツリー・コンポーネント、カラー・ピッカーと日付ピッカー、その他多くのコンポーネント(メニュー、コマンド・ボタン、シャトル選択、進捗メーター)があります。
初期設定のまま使用できるADF Facesコンポーネント(ファイルをアップロードするための入力ファイル・コンポーネントや、2次ウィンドウにナビゲートして選択した値が表示される元のページに戻るためのダイアログ・サポートが組み込まれている選択入力コンポーネントなど)により、ユーザーの操作は簡略化されます。
ADF Facesの詳細は、次のリソースを参照してください。
ADF Faces Coreタグ:
ADF Faces HTMLタグ:
ADF Faces Javadocs:
ADF Facesの開発者ガイド:
UIにADF Facesコンポーネントを使用し、ページ・ナビゲーションにJSFテクノロジを使用するJSF JSPページを作成する場合は、ADFモデルのバインディング機能をページのコンポーネントに使用することでOracle Application Development Framework(Oracle ADF)を活用できます。データ・コントロールおよびADFモデルの詳細は、1.3項「Oracle ADFおよびJavaServer Facesによる宣言的な開発」を参照してください。
表11-1 に、ADF Faces用に現在サポートされているプラットフォームを示します。
表11-1 ADF Faces用にサポートされているプラットフォーム
| ユーザー・エージェント | Windows | Solaris | Mac OS X | Red Hat Linux | Windows Mobile | Palm OS |
|---|---|---|---|---|---|---|
|
Internet Explorer |
6.0 * |
2003+ |
||||
|
Mozilla |
1.7.x |
1.7.x |
||||
|
Firefox |
1.0.x |
1.0.x |
||||
|
Safari |
1.3, 2.0 ** |
|||||
|
WebPro (Mobile) |
3.0 |
* アクセシビリティおよびBiDiは、Windows上のIEでのみサポートされます。
** Safari 1.3パッチ312.2およびSafari 2.0パッチ412.5で提供されるAppleの不具合の修正が必須です。
|
ヒント: UNIXサーバー・ボックスでは、ボタン・イメージが想定どおりにレンダーされない場合があります。JDK1.4以上を使用する場合は、UNIXボックスで-Djava.awt.headless=trueをコマンドライン・オプションとして使用することを強くお薦めします。 |
この章では次の内容について説明します。
JDeveloperでアプリケーション・テンプレートを使用してワークスペースを作成する方法
JSFページの追加およびUIコンポーネントの挿入時にビュー・プロジェクトに作成されるファイル
パネル・コンポーネントとレイアウト・コンポーネントを使用してページ・レイアウトを作成する方法
バッキングBeanについて作業しているときのJDeveloperの動作
JDeveloperには、すでに指定されているテクノロジを適切に組み合せてワークスペースおよびプロジェクト構造を迅速に作成できるようにするアプリケーション・テンプレートが用意されています。SRDemoアプリケーションでは、「Webアプリケーション[JSF、ADF BC]」アプリケーション・テンプレートを使用しており、このテンプレートは、データ・モデル用のプロジェクトと、コントローラ・コンポーネントおよびビュー(ユーザー・インタフェース)・コンポーネント用のプロジェクトをそれぞれ1つずつワークスペースに作成します。
JDeveloperでアプリケーション・ワークスペースを新規作成し、アプリケーション・テンプレートを選択する手順:
アプリケーション・ナビゲータで「アプリケーション」ノードを右クリックし、「新規アプリケーション」を選択します。
「アプリケーションの作成」ダイアログで、「Webアプリケーション[JSF、ADF BC]」アプリケーション・テンプレートをリストから選択します。
アプリケーション・ワークスペースを作成するために、JDeveloperのアプリケーション・テンプレートを必ずしも使用する必要はありません。これらは単に便宜上提供されているにすぎません。
場合によっては、既存のWARファイルがあり、そのファイルをJDeveloperにインポートすることがあります。
JDeveloperでWARファイルを新規プロジェクトにインポートする手順:
アプリケーション・ナビゲータで該当のアプリケーション・ワークスペースを右クリックし、「新規プロジェクト」を選択します。
「新規ギャラリ」の「カテゴリ」ツリーで、Generalを開き、Projectsを選択します。
「項目」リストで、「WARファイルからのプロジェクト」をダブルクリックします。
ウィザードの指示に従って、プロジェクトの作成を完了します。
デフォルトでは、データ・モデル用のプロジェクトにはModel、ユーザー・インタフェースおよびコントローラ用のプロジェクトにはViewControllerと名前が付けられます。プロジェクトの名前は、プロジェクトの作成後に「ファイル」→「名前の変更」を使用して変更できます。あるいは、「ツール」→「テンプレートの管理」を使用してJDeveloperで使用されるデフォルトの名前を変更できます。
|
注意: この章で使用される図およびプロジェクト名は、JDeveloperのデフォルトの名前です。ただし、SRDemoアプリケーションでは、JSFビュー・コンポーネントおよびコントローラ・コンポーネントにはUserInterface、ADF Business Componentsを含むプロジェクトにはDataModelをプロジェクト名として使用しています。また、SRDemoアプリケーションには、アプリケーション・ナビゲータにBuildAndDeployなどの追加プロジェクトがあります。これを手動で作成して、アプリケーション・コンポーネントを論理フォルダに組み入れます。 |
図11-1に、ワークスペース作成後のアプリケーション・ナビゲータでのViewControllerプロジェクトを示します。
図11-2に、ファイル・システムでの<JDEV_HOME>/jdev/myworkフォルダに作成された実際のフォルダを示します。
たとえば、Application1という名前のワークスペースを作成した場合、ViewControllerフォルダとそのサブフォルダはファイル・システム内の<JDEV_HOME>/jdev/mywork/Application1に置かれます。
「Webアプリケーション[JSF、ADF BC]」テンプレートを使用してワークスペースを作成すると、次の処理が行われます。
JSFテクノロジを使用するViewControllerプロジェクトが作成されます。プロジェクト・プロパティには、次のものがあります。
JSPタグ・ライブラリ: JSF Core、JSF HTML。表11-2を参照してください。
ライブラリ: JSF、Commons Beanutils、Commons Digester、Commons Logging、Commons Collections、JSTL。
テクノロジ・スコープ: JSF、JSPおよびサーブレット、Java、HTML、XML。
ViewControllerプロジェクトで作業する際、新規ギャラリはフィルタ処理され、Web Tierカテゴリには標準Webテクノロジ(JSFなど)が表示されます。
JDeveloperでは、Servlet 2.4およびJSP 2.0をサポートするJSTL 1.1およびJ2EE 1.4のWebコンテナがデフォルトで使用されます。
デフォルト設定を使用した初期web.xmlファイルがViewControllerプロジェクトの/WEB-INFに作成されます。JDeveloperによってweb.xmlに追加されるものの詳細は、11.2.1.1項「初期web.xmlファイル」を参照してください。
空のfaces-config.xmlファイルがViewControllerプロジェクトの/WEB-INFに作成されます。faces-config.xmlの詳細は、11.2.1.2項「初期faces-config.xmlファイル」を参照してください。
アプリケーション・ナビゲータでfaces-config.xmlをダブルクリックしてファイルを開く場合、JDeveloperではファイル・システム内のViewControllerフォルダにモデル・フォルダが作成され、モデル・フォルダにファイルfaces-config.oxd_facesが追加されます。faces-config.oxd_facesファイルの詳細は、11.3.2項「JSFページの作成時に発生する処理」を参照してください。
jsf-impl.jarがViewControllerプロジェクトの/WEB-INF/libに追加されます。
ADF Business Componentsテクノロジを使用するModelプロジェクトが作成されます。Modelプロジェクトでの再使用可能なエンティティ・オブジェクトのレイヤー作成の詳細は、2.5項「表のビジネス・ドメイン・オブジェクトのレイヤーの作成」を参照してください。アプリケーション・モジュールとビュー・オブジェクトの作成の詳細は、2.6項「ユースケースを処理するビジネス・サービスの作成」を参照してください。
JSFアプリケーションの構成の部分も、J2EEアプリケーション・デプロイメント・ディスクリプタweb.xmlの内容によって決定されます。web.xmlファイルは、サーバーで認識する必要があるアプリケーションに関するあらゆることを定義します(ただし、アプリケーションのデプロイ時にJDeveloperまたはシステム管理者によって割り当てられるルート・コンテキスト・パスは除きます)。通常のランタイム設定には、初期化パラメータ、カスタム・タグ・ライブラリの場所およびセキュリティ設定が含まれます。
例11-1に、JDeveloperによって最初に作成される初期web.xmlファイルを示します。
例11-1 JDeveloperによって作成される初期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/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<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>
JSFサーブレットおよびJSFサーブレット・マッピングの構成設定は、JSFプロジェクトの初回作成時に、初期web.xmlファイルに自動的に追加されます。
JSFサーブレット: JSFサーブレットはjavax.faces.webapp.FacesServletで、JSFを利用してユーザー・インタフェースを構築するWebアプリケーションのライフサイクルを処理するリクエストを管理します。この構成設定により、JSFサーブレットはシンボリック名にマップされます。
JSFサーブレット・マッピング: サーブレット・マッピングにより、URLパターンはJSFサーブレットのシンボリック名にマップされます。パス接頭辞または拡張子接尾辞のいずれかのパターンを使用できます。
JDeveloperでは、パス接頭辞/faces/*がデフォルトで使用されます。たとえば、Webページがindex.jspまたはindex.jspxである場合、つまり、URL http://localhost:8080/SRDemoADFBC/faces/index.jspまたはhttp://localhost:8080/SRDemoADFBC/faces/index.jspxが発行された場合、URLによってJSFサーブレットがアクティブになり、これによって、faces接頭辞を除いてファイル/SRDemoADFBC/index.jspまたは/SRDemoADFBC/index.jspxをロードします。
JDeveloperでweb.xmlを編集するには、アプリケーション・ナビゲータでweb.xmlを右クリックし、ポップアップ・メニューから「プロパティ」を選択し、Webアプリケーション・デプロイメント・ディスクリプタ・エディタを開きます。構成要素名に精通している場合は、XMLエディタを使用してweb.xmlを変更することもできます。
JSFを使用する際にweb.xmlで使用できる構成要素の詳細は、A.7項「web.xml」を参照してください。
|
注意: ADFデータ・コントロールを使用してデータ・バインドされたWebページを構築すると、ADFバインディング・フィルタおよびアプリケーション・バインディング・コンテナ用のサーブレット・コンテキスト・パラメータがweb.xmlに追加されます。詳細は、12.4項「ADFバインディング・フィルタの構成」を参照してください。 |
JSF構成ファイルには、JSFアプリケーションのリソース(カスタム・バリデータ、マネージドBeanなど)を登録し、ページ間のナビゲーション・ルールをすべて定義します。アプリケーションは任意の名前のJSF構成ファイルを保持できますが、通常そのファイル名はfaces-config.xmlです。例11-2に、JSFテクノロジを使用するプロジェクトの作成時に、JDeveloperによって最初に作成される初期faces-config.xmlファイルを示します。
小規模なアプリケーションには、通常faces-config.xmlファイルが1つあります。複数の構成ファイルの使用方法は、11.2.3項「複数のJSF構成ファイルについての考慮事項」を参照してください。
例11-2 JDeveloperによって作成される初期faces-config.xmlファイル
<?xml version="1.0" encoding="windows-1252"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config xmlns="http://java.sun.com/JSF/Configuration"> </faces-config>
JDeveloperでは、次のエディタのいずれかを使用してfaces-config.xmlを編集できます。
JSF構成エディタ: ビジュアル編集環境が提供されるため、JSF構成エディタを使用することをお薦めします。
XMLソース・エディタ: JSF構成要素に精通している場合は、ソース・エディタを使用してファイルを直接編集します。
アプリケーション・ナビゲータで、faces-config.xmlをダブルクリックしてファイルを開きます。
デフォルトでは、faces-config.xmlは、エディタ・ウィンドウの下部のアクティブ「ダイアグラム」タブによって示されるようにダイアグラム・モードで開かれます。JSFナビゲーション・ルールを作成または変更する場合は、JSF構成エディタのダイアグラム・モードを使用することをお薦めします。
JDeveloperでは、ページ・フローを視覚的に作成および管理できるようにするダイアグラム・ファイルがfaces-config.xmlに関連付けられます。JSFナビゲーション・ルールの作成の詳細は、第16章「ページ・ナビゲーションの追加」を参照してください。
ナビゲーション・ルールではなく構成要素を作成または変更する場合は、JSF構成エディタの概要モードを使用してください。エディタ・ウィンドウの下部で、「概要」を選択します。
概要とダイアグラムのどちらのモードでも、faces-config.xmlファイルは更新されます。
|
ヒント: JSFでは、単一のfaces-config.xmlファイルに複数の<application>要素を含めることが可能です。JSF構成エディタでは、ファイルの1番目の<application>インスタンスしか編集できません。その他の<application>要素については、XMLエディタを使用してファイルを直接編集する必要があります。 |
faces-config.xmlで使用できる構成要素の詳細は、A.9項「faces-config.xml」を参照してください。
|
注意: ADFデータ・コントロールを使用してデータ・バインドされたWebページを構築すると、12.2.3項「データ・コントロール・パレットの使用時に行われる処理」で説明されているように、ADFフェーズ・リスナーがfaces-config.xmlに追加されます。 |
ViewControllerプロジェクトには、WebページとWebアプリケーションのその他のリソースから成るWebコンテンツが含まれます。デフォルトでは、選択したJDeveloperのWebアプリケーション・テンプレートにより、プロジェクト名にcontrollerという語が付加され、Webページそのもの(ビュー)の他に、アプリケーションのフローまたはページ・ナビゲーション(コントローラ)を定義する特定のファイルがWebアプリケーションに含まれていることを示します。
|
注意: ページ・ナビゲーションとページ表示を区別する概念はしばしばモデル2と呼ばれ、ページ・ナビゲーションをページそのものの内部で完全管理する旧スタイル(モデル1)のアプリケーションと区別されます。モデル2スタイルのアプリケーションでは、テクノロジによって、実行時にページ・ナビゲーション・イベントを処理するページ・コントローラと呼ばれる特化されたサーブレットが導入されます。 |
JDeveloperでWebページを作成するために使用するテクノロジにより、ViewControllerプロジェクトのコンポーネントおよびアプリケーションで使用するページ・コントローラのタイプが決定されます。SRDemoアプリケーションでは、JSFをJSPと組み合せて使用してWebページを構築しています。
JSFは、動的Webコンテンツを表示するためのコンポーネントベースのフレームワークです。また、ページ・ナビゲーションを管理するための独自のページ・コントローラを備えています。
JSPは、JSFユーザー・インタフェースにプレゼンテーション・レイヤー・テクノロジを提供します。JSFコンポーネントは、JSPページでは特殊なJSPカスタム・タグによって表されます。
JDeveloperのツールを使用すると、JSFコンポーネントとModelプロジェクトのJavaオブジェクトをバインドして、データ・バインドされたUIコンポーネントを簡単に作成できます。先に述べたように、ViewControllerプロジェクトには、ユーザー・インタフェース用のWebページが含まれます。WebページのUIコンポーネントをデータ・モデルに宣言してバインドするには、ViewControllerプロジェクトがModelプロジェクトのデータ・コントロールにアクセスできる必要があります。ViewControllerプロジェクトがデータ・コントロールにアクセスできるようにするには、Modelプロジェクトへの依存性を指定する必要があります。初めてデータ・コントロール・パレットから項目をドラッグしてJSFページにドロップする際、JDeveloperでは依存性が構成されます。Modelプロジェクトへの依存性を手動で設定する場合は、次の手順に従います。
JSFアプリケーションは複数のJSF構成ファイルを保持できます。たとえば、アプリケーションの領域ごとに別個のJSF構成ファイルが必要な場合、あるいはカスタム・コンポーネントまたはカスタム・レンダラを含むライブラリをパッケージすることにした場合には、領域またはライブラリごとに異なるJSF構成ファイルを作成できます。
別のJSF構成ファイルを作成するには、テキスト・エディタを使用するか、JDeveloperに用意されているJSFページ・フローと構成ウィザードを使用します。
JSFページ・フローと構成ウィザードを起動する手順:
アプリケーション・ナビゲータで、ViewControllerを右クリックし、「新規」を選択します。
新規ギャラリ・ウィンドウで、Web Tierを開きます。JSFを選択した後、「JSFページ・フローと構成(faces-config.xml)」をダブルクリックします。
ライブラリJARに配信されるカスタム・コンポーネントまたはその他のJSFクラス用にJSF構成ファイルを作成する場合は、次のようにします。
必要に応じて、ファイルにfaces-config.xmlと名前を付けます。
新規ファイルを/META-INFに格納します。
このファイルをカスタム・コンポーネントまたはカスタム・クラスの配布に使用するJARに含めます。
この方法は、カスタム・コンポーネントおよびカスタム・レンダラを含むライブラリをパッケージしているアプリケーションに適しています。
アプリケーションの領域ごとにJSF構成ファイルを作成する場合は、次のようにします。
faces-config.xml以外の名前をファイルに付けます。
そのファイルを/WEB-INFに格納します。
JSFが新しいJSF構成ファイルをアプリケーションの構成の一部として読み取るには、そのファイルへのパスを、コンテキスト・パラメータjavax.faces.CONFIG_FILESを使用してweb.xmlに指定します。このパラメータ値は、複数のファイルがある場合は、新規構成ファイル名のカンマ区切りリストです。
JSFページ・フローと構成ウィザードを使用する場合は、「参照をWeb.xmlに追加」チェック・ボックスを選択して、JDeveloperが新しいJSF構成ファイルをweb.xmlに登録できるようにします。例11-3に、そのチェック・ボックスを選択した場合に、どのように複数のJSF構成ファイルがweb.xmlに設定されるかを示します。
この方法は、アプリケーションの領域ごとに別個の構成ファイルが必要な大規模なアプリケーションに適しています。
例11-3 web.xmlファイルでの複数のJSF構成ファイル用の構成
<context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config1.xml,/WEB-INF/faces-config2.xml</param-value> </context-param>
JSF構成ファイルは、名前がfaces-config.xmlであろうとなかろうと、http://java.sun.com/dtd/web-facesconfig_1_x.dtdにあるSun社のDTDに準拠する必要があります。ウィザードを使用してJSF構成ファイルを作成する場合は、自動的に準拠します。
アプリケーションで複数のJSF構成ファイルを使用する場合、JSFは実行時にアプリケーションの構成設定を次の順に検出してロードします。
アプリケーションのJARファイルでMETA-INF/faces-config.xmlというファイルを検索し、それぞれを構成リソースとして(検出順序とは逆の順序で)ロードします。
アプリケーションのweb.xmlファイルでjavax.faces.CONFIG_FILESコンテキスト・パラメータ・セットを検索します。次に、名前付きファイルをそれぞれ構成リソースとしてロードします。
WEB-INFディレクトリでfaces-config.xmlというファイルを検索し、構成リソースとしてロードします。
その後で、JSFはApplicationクラスをインスタンス化し、各種構成ファイルで検出される設定を移入します。
JSFが様々なプレゼンテーション・レイヤー・テクノロジをサポートする一方で、JDeveloperはJSF Webページの作成にJSPをプレゼンテーション・テクノロジとして使用します。JSFをJSPとともに使用すると、JSFページをJSPページ(.jsp)またはJSPドキュメント(.jspx)にできます。JSPドキュメントは整形式XML文書であり、XML標準にはDocument Type Definition(DTD)の検証など、様々な利点があります。したがって、ADF Facesコンポーネントを使用してWebページを構築する際は、JSPドキュメントを使用することをお薦めします。特に明記されていないかぎり、このマニュアルでは、JSFページという用語はJSF JSPページとJSF JSPドキュメントの両方を指します。
JDeveloperでViewControllerプロジェクト内にJSFページを作成するには、次の2つの方法があります。
新規ギャラリのJSFカテゴリからJSF JSPの作成ウィザードを起動します。
または
JSF Pageをコンポーネント・パレットからfaces-config.xmlファイルにドラッグします(このファイルがJSF構成エディタのダイアグラム・モードで開かれている場合)。
11.3.1項「JSFページの追加方法」では、後者の方法を使用します。また、この項ではJSFナビゲーション・モデラーを紹介します。このモデラーを使用すると、ダイアグラム形式でのアプリケーション・ページの設計、ページ間のナビゲーション・フローの定義、ページの作成ができます。
アプリケーション・ページ・フローの設計および構築には、JSFナビゲーション・ダイアグラムを使用することをお薦めします。JSFナビゲーション・ダイアグラムは、アプリケーションのページを視覚的に表示するため、WebページをJSP/HTMLビジュアル・エディタで編集する際に各ページにドリルダウンする場合には特に便利な方法でもあります。
JSFナビゲーション・ダイアグラムを使用して、JSFページをViewControllerプロジェクトに追加する手順:
アプリケーション・ナビゲータでViewController、Web Content、WEB-INFの順にフォルダを開き、faces-config.xmlをダブルクリックするか、ViewControllerのポップアップ・メニューから「JSFナビゲーションを開く」を選択して、faces-config.xmlファイルを開きます。
デフォルトでは、ファイルはJSFナビゲーション・ダイアグラムである「ダイアグラム」タブで開かれます。ViewControllerプロジェクトの開始直後は、ナビゲーション・ダイアグラムは空の製図面になります。faces-config.xmlを開いたときに空白の製図面が表示されない場合は、エディタの下部で「ダイアグラム」を選択します。
コンポーネント・パレットのドロップダウン・リストからJSF Navigation Diagramを選択した後、JSF Pageを選択します。

ページを表示する場所で、ダイアグラムをクリックします。ページ名のラベルが付いたページ・アイコンがダイアグラムに表示されます。このページ・アイコンには、イエローの警告が重なっています。これは、実際のページがまだ作成されていないことを意味する、ページを表すアイコンにすぎません。
ページを新規作成するには、ページ・アイコンをダブルクリックしてJSF JSPの作成ウィザードを使用します。
初めてJDeveloperでページを作成する場合は、ウィザードの全ステップを必ず完了するようにしてください。
JSF JSPの作成ウィザードのステップ1では、JSPファイルのタイプに「JSPドキュメント(*.jspx)」を選択します。
ファイル名を入力し、デフォルトのディレクトリ名で確定するか、新しい場所を選択します。デフォルトでは、ファイルはファイル・システムの/ViewController/public_htmlに保存されます。
ウィザードのステップ2では、コンポーネント・バインディングを自動的に使用しないため、デフォルトの選択のままにします。
ウィザードのステップ3では、次のライブラリが「選択済のライブラリ」リストに追加されていることを確認します。
ADF Faces Components
ADF Faces HTML
JSF Core
JSF HTML
残りのページでデフォルトの選択を確定し、「終了」をクリックします。
JSP/HTMLビジュアル・エディタで新しいJSFページが開きます。ここで、コンポーネント・パレットのADF Facesコンポーネントや、データ・コントロール・パレットからドロップされたデータ・バインドされたコンポーネントを使用して、ページのレイアウトを開始できます。
JSFナビゲーション・ダイアグラムに(上部の「faces-config.xml」エディタ・タブをクリックして)切り替えると、ページ・アイコンに重なっていたイエローの警告が表示されなくなります。
|
ヒント: 新規ギャラリからウィザードを使用してJSFページを新規作成すると、アプリケーション・ページ・フローの設計時に、JSFページをアプリケーション・ナビゲータからJSFナビゲーション・ダイアグラムにドラッグできます。 |
図11-3に、ウィザードのステップを完了してJSFページを追加した後のアプリケーション・ナビゲータでのViewControllerプロジェクトを示します。
図11-4に、ファイル・システムでの<JDEV_HOME>/jdev/myworkフォルダに作成された実際のフォルダを示します。
JSFナビゲーション・ダイアグラムを介してViewControllerプロジェクトに初めてJSFページを作成すると、次の処理が行われます。
adf-faces-impl.jarが/WEB-INF/libに追加されます。
次のライブラリがViewControllerプロジェクト・プロパティに追加されます。
JSPタグ・ライブラリ: ADF Faces Components、ADF Faces HTML。表11-2を参照してください。
ライブラリ: JSP Runtime、ADF Faces Runtime、ADF Common Runtime。
ファイル・システム(<JDEV_HOME>/jdev/mywork/Application1/ViewController/model/public_html/WEB-INFなど)にのみfaces-config.oxd_facesファイルが作成されます。JSFナビゲーション・ダイアグラムでページ・フローを設計および構築する際、このファイルはすべてのダイアグラムの詳細(レイアウト、注釈など)を保持するファイルとなります。JDeveloperでは、常にこのファイルを関連付けられたXMLファイルfaces-config.xmlとともに保持します。faces-config.oxd_facesファイルは、アプリケーション・ナビゲータまたはシステム・ナビゲータには表示されません。
JSFナビゲーション・ダイアグラムからJSF JSPの作成ウィザードを起動してJSFページを作成しても、新規ギャラリから起動して作成しても、デフォルトでは、JSF JSP 2.0ファイルである初期ページが作成され、JSFタグ・ライブラリが初期ページに自動的にインポートされます。ウィザードのステップ3でADF Facesタグ・ライブラリの追加を選択すると、ADF Facesタグ・ライブラリも初期ページにインポートされます。例11-4に、JSF JSPドキュメントの初期ページを示します。
例11-4 JDeveloperによって作成される初期JSF JSPドキュメント
<?xml version='1.0' encoding='windows-1252'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:af="http://xmlns.oracle.com/adf/faces"
xmlns:afh="http://xmlns.oracle.com/adf/faces/html"
<jsp:output omit-xml-declaration="true" doctype-root-element="HTML"
doctype-system="http://www.w3.org/TR/html4/loose.dtd"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
<jsp:directive.page contentType="text/html;charset=windows-1252"/>
<f:view>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1252"/>
<title>untitled1</title>
</head>
<body>
<h:form></h:form>
</body>
</html>
</f:view>
</jsp:root>
JSFナビゲーション・ダイアグラムでは、ページ・アイコンのラベルはスラッシュ(/)で始まるページ名です。先頭のスラッシュは、ページをダイアグラムから実行できるようにするために必要です。スラッシュを削除すると、自動的に元の状態に戻されます。
JSFナビゲーション・ダイアグラムからページの名前変更および削除を実行する際に、次のことに注意してください。
ページの名前変更: JSFナビゲーション・ダイアグラムでJSFページの名前を変更すると、元の名前のページをダイアグラムから削除し、新しい名前の新しいページを追加することになります。ページ・アイコンは、ページがまだ存在しないことを示すイエローの警告が重なったアイコンに変化します。基礎となるページを作成しておいた場合、そのページはアプリケーション・ナビゲータで元の名前のままで残ります。
同様に、アプリケーション・ナビゲータ内にJSFページがあり、そのページ・アイコンがダイアグラムに表示されている場合、この時点でアプリケーション・ナビゲータ内のそのページの名前を変更すると、元のファイルを削除して新規ファイルを作成することになります。ただし、ダイアグラムでは元の名前を保持し、ページが存在しないことを示すイエローの警告が重なったページ・アイコンが表示されます。
ページの削除: JSFナビゲーション・ダイアグラムでページ・アイコンを削除すると、関連付けられたWebページはダイアグラムに表示されなくなります。実際のファイルが作成されている場合、これまでどおりそのファイルは、アプリケーション・ナビゲータのViewControllerプロジェクトのWeb Contentフォルダから使用できます。
JSFナビゲーション・ダイアグラムおよびナビゲーション・ルールの作成の詳細は、第16章「ページ・ナビゲーションの追加」を参照してください。
ADF FacesはJDK 1.4(以上)と互換性がありますが、Sun社のJSF Reference Implementation 1.0のみをサポートするサーバー上では稼働できません。実装は、JSF 1.1_01(以上)またはApache MyFaces 1.0.8(以上)である必要があります。
ADF Facesの配信可能なものは次のとおりです。
adf-faces-api.jar: ADF FacesのパブリックAPIはすべてoracle.adf.view.facesパッケージの中にあります。
adf-faces-impl.jar: ADF FacesのプライベートAPIはすべてoracle.adfinternal.view.facesパッケージの中にあります。
ADF Facesには、JSFページで使用できるタグ・ライブラリが2つあります。
ADF Faces Coreライブラリ
ADF Faces HTMLライブラリ
表11-2に、ADF FacesのURIおよびデフォルトの接頭辞と、JDeveloperで使用されるJSFタグ・ライブラリを示します。
表11-2 ADF FacesとJSFタグ・ライブラリ
| ライブラリ | URI | 接頭辞 |
|---|---|---|
|
ADF Faces Core |
|
|
|
ADF Faces HTML |
|
|
|
JSF Core |
|
|
|
JSF HTML |
|
|
JDeveloperはADF FacesキャッシュとADF Faces Industrialタグ・ライブラリも提供します。これらは、それぞれ接頭辞afcとafiを使用します。ADF Facesキャッシュの詳細は、第23章「キャッシングによるアプリケーション・パフォーマンスの最適化」を参照してください。ADF Faces Industrialの詳細は、JDeveloperのオンライン・ヘルプのトピック「ADFモバイル・アプリケーションの開発」を参照してください。
すべてのJSFアプリケーションはServlet仕様バージョン2.3(以上)およびJSP仕様バージョン1.2(以上)に準拠する必要があります。デプロイするJ2EE Webコンテナには、JavaServer Pages Standard Tag Library(JSTL)に必要なJARファイル、すなわちjstl.jarおよびstandard.jarを用意する必要があります。使用するJSTLバージョンは、J2EE Webコンテナによって異なります。
JSTL 1.0: Servlet 2.3およびJSP 1.2をサポートするJ2EE 1.3 Webコンテナが必要です。
JSTL 1.1: Servlet 2.4およびJSP 2.0をサポートするJ2EE 1.4 Webコンテナが必要です。
ADF FacesおよびJSFのデプロイ要件の詳細は、第34章「ADFアプリケーションのデプロイ」を参照してください。
SRDemoのほとんどのページでは、ADF FacesのpanelPageコンポーネントを使用してページ全体をレイアウトしています。panelPageコンポーネントを使用すると、アプリケーション内のすべてのWebページで一貫したルック・アンド・フィールを確保しながら、ブランド・イメージ、ナビゲーション・メニューとナビゲーション・ボタン、ページレベルまたはアプリケーションレベルのテキスト用の特殊な領域をページ上に定義できます。図11-5に、panelPageコンポーネントを使用して作成されたページの例を示します。
ウィザードを使用してJSFページを新規作成すると、JSP/HTMLビジュアル・エディタに空白ページが自動的にオープンされます。ページを編集するために、使い慣れたJDeveloperのページ設計ツールを組み合せて使用できます。
構造ウィンドウ
JSP/HTMLビジュアル・エディタ
XMLソース・エディタ
プロパティ・インスペクタ
コンポーネント・パレット
設計ツールのいずれかでページを変更すると、その他のツールではその変更が自動的に反映されます。
同じJSFページ内で標準JSFコンポーネントとADF Facesコンポーネントの両方を使用できます。たとえば、JDeveloperによって作成された初期JSFページにpanelPageコンポーネントを挿入して使用するには、次の手順に従います。
初期JSFページをまだ開いていない場合は、アプリケーション・ナビゲータでダブルクリックしてビジュアル・エディタで開きます。
コンポーネント・パレットで、ドロップダウン・リストからADF Faces Coreを選択します。
PanelPageをパレットからビジュアル・エディタのページにドラッグ・アンド・ドロップします。

ビジュアル・エディタのページにコンポーネントをドラッグすると、構造ウィンドウではh:formコンポーネントがボックスで囲まれて強調表示され、h:formコンポーネントがターゲット・コンポーネントであることを示します。ターゲット・コンポーネントとは、ソース・コンポーネントがドロップされるときに挿入先となるコンポーネントです。
構造ウィンドウで、新規挿入されたaf:panelPageまたはPanelPage facetsのいずれかを右クリックし、「の前に挿入」メニュー、「の中に挿入」メニュー、「の後ろに挿入」メニューのいずれかを選択して、目的のUIコンポーネントを追加します。

入力フォームまたは検索フォーム、表、その他のページ・ボディ・コンテンツをpanelPageコンポーネントの内部に作成します。panelPageとそのファセットの詳細は、11.4.4項「PanelPageコンポーネントの使用方法」を参照してください。
|
ヒント: 構造ウィンドウのポップアップ・メニューを使用してコンポーネントを追加すると、必ず正しいターゲットの場所にコンポーネントが挿入されます。コンポーネント・パレットから構造ウィンドウにコンポーネントをドラッグすることもできます。構造ウィンドウにコンポーネントをドラッグすると、ターゲットの場所はボックスで囲まれるか、矢先が埋め込まれた実線で強調表示され、ソース・コンポーネントがドロップされるときにそのターゲットの場所が挿入先となることを示します。構造ウィンドウを使用したコンポーネントの挿入の詳細は、11.4.3.1項「構造ウィンドウでの編集」を参照してください。 |
挿入されたコンポーネントの属性を編集するには、構造ウィンドウでコンポーネントをダブルクリックしてプロパティ・エディタを開くか、コンポーネントを選択してプロパティ・インスペクタを使用します。
コンポーネントを挿入してページ・レイアウトを構築する場合に、データ・コントロール・パレットを使用してデータ・バインドされたUIコンポーネントを挿入することもできます。データ・コントロール・パレットからアイテムをドラッグして、ページ上の目的の場所にドロップするだけです。データ・コントロール・パレットの使用方法は、第12章「ページでのデータの表示」を参照してください。
図11-6に、ページに初めてADF Facesコンポーネントを追加した後のアプリケーション・ナビゲータでのViewControllerプロジェクトを示します。
JSFページに初めてADF Facesコンポーネントを追加すると、次の処理が自動的に行われます。
ADF Faces CoreおよびADF Facs HTMLのタグ・ライブラリ(まだ挿入されていない場合)がページにインポートされます。例11-4を参照してください。
htmlタグ、headタグ、bodyタグがそれぞれafh:html、afh:head、afh:bodyで置換されます。例11-5を参照してください。
ADF FacesフィルタおよびADF Facesマッピングの構成設定がweb.xmlに追加されます。11.4.2.1項「web.xmlファイルの追加情報」を参照してください。
デフォルトのADF Facesレンダー・キットの構成設定がfaces-config.xmlに追加されます。11.4.2.2項「faces-config.xmlファイルの追加情報」を参照してください。
初期adf-faces-config.xmlがViewControllerプロジェクトの/WEB-INFに作成されます。11.4.2.3項「初期adf-faces-config.xmlファイル」を参照してください。
/ViewController/public_html/WEB-INF/temp/adfフォルダがファイル・システムに作成されます。このフォルダには、JDeveloperでADF Facesコンポーネントに使用されるイメージおよびスタールが格納されます。このフォルダは、ワークスペースを閉じて開きなおすまでアプリケーション・ナビゲータには表示されません。
|
ヒント: WEB-INF/libフォルダとWEB-INF/temp/adfフォルダは、実行時にのみJDeveloperによって使用されます。アプリケーション・ナビゲータのクラッタを減らすために、ViewControllerプロジェクトからこれらのフォルダを除外できます。ViewControllerをダブルクリックして「プロジェクト・プロパティ」ダイアログを開きます。「プロジェクト・コンテンツ」の下の「Webアプリケーション」を選択した後、「除外」タブを使用して除外するフォルダを追加します。 |
例11-5 ADF Facesコンポーネント初回追加後のJSF JSPドキュメント
<?xml version='1.0' encoding='windows-1252'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:afh="http://xmlns.oracle.com/adf/faces/html"
xmlns:af="http://xmlns.oracle.com/adf/faces">
<jsp:output omit-xml-declaration="true" doctype-root-element="HTML"
doctype-system="http://www.w3.org/TR/html4/loose.dtd"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
<jsp:directive.page contentType="text/html;charset=windows-1252"/>
<f:view>
<afh:html>
<afh:head title="untitled1">
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1252"/>
</afh:head>
<afh:body>
<h:form>
<af:panelPage title="Title 1">
<f:facet name="menu1"/>
<f:facet name="menuGlobal"/>
<f:facet name="branding"/>
<f:facet name="brandingApp"/>
<f:facet name="appCopyright"/>
<f:facet name="appPrivacy"/>
<f:facet name="appAbout"/>
</af:panelPage>
</h:form>
</afh:body>
</afh:html>
</f:view>
</jsp:root>
JSFページに初めてADF Facesコンポーネントを挿入すると、次のADF Facesの構成設定がweb.xmlに自動的に挿入されます。
ADF Facesフィルタ: oracle.adf.view.faces.webapp.AdfFacesFilterをインストールします。このフィルタは、AdfFacesContextオブジェクトを設定することによって必ずADF Facesが適切に初期化されるようにするサーブレット・フィルタです。AdfFacesFilterは、ファイルのアップロード処理にも必要です。この構成設定により、AdfFacesFilterはシンボリック名にマップされます。
ADF Facesフィルタ・マッピング: JSFサーブレットのシンボリック名をADF Facesフィルタにマップします。
ADF Facesリソース・サーブレット: oracle.adf.view.faces.webapp.ResourceServletをインストールします。このサーブレットは、ResourceLoaderに委譲することによって、Webアプリケーション・リソース(イメージ、スタイル・シート、JavaScriptライブラリなど)を提供します。この構成設定により、ResourceServletはシンボリック名にマップされます。
ADF Facesリソース・マッピング: URLパターンをADF Facesリソース・サーブレットのシンボリック名にマップします。
例11-6に、初めてADF Facesコンポーネントを追加した後のweb.xmlファイルを示します。
例11-6 web.xmlファイルにおけるADF Facesの構成
<?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/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<description>Empty web.xml file for Web Application</description>
<!-- Installs the ADF Faces filter -- >
<filter>
<filter-name>adfFaces</filter-name>
<filter-class>oracle.adf.view.faces.webapp.AdfFacesFilter</filter-class>
</filter>
<!-- Adds the mapping to ADF Faces filter -- >
<filter-mapping>
<filter-name>adfFaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</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>
<!-- Installs the ADF Faces ResourceServlet -- >
<servlet>
<servlet-name>resources</servlet-name>
<servlet-class>oracle.adf.view.faces.webapp.ResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<!-- Maps URL pattern to the ResourceServlet's symbolic name -->
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/adf/*</url-pattern>
</servlet-mapping>
...
</web-app>
ADF Facesを使用する際にweb.xmlで使用できる構成要素の詳細は、A.7.1項「web.xmlファイルでサポートされるタスク」を参照してください。
|
ヒント: アプリケーションで複数のフィルタを使用する場合、実行する順番でweb.xmlに記載されている必要があります。実行時には、ファイル内に記載された順番でフィルタがコールされます。 |
すでに述べたように、JSFテクノロジを使用するプロジェクトを新規作成すると、空のfaces-config.xmlファイルが1つ自動的に作成されます。JSFページに初めてADF Facesコンポーネントを挿入すると、例11-7に示すように、ADFコンポーネント用のデフォルトのレンダー・キットがfaces-config.xmlに自動的に挿入されます。
例11-7 faces-config.xmlファイルにおけるADF Facesコンポーネントの構成
<?xml version="1.0" encoding="windows-1252"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
...
<!-- Default render kit for ADF components -->
<application>
<default-render-kit-id>oracle.adf.core</default-render-kit-id>
</application>
...
</faces-config>
ADF Facesコンポーネントを使用してJSFアプリケーションを作成する場合、ADF Faces固有の機能(スキン・ファミリ、ページ・アクセシビリティ・サポートのレベルなど)をadf-faces-config.xmlファイルで構成します。adf-faces-config.xmlファイルは、JSF式言語(EL)または静的値を使用して要素プロパティを定義できる単純なXML構造を持っています。
JDeveloperでJSFページに初めてADF Facesコンポーネントを挿入すると、初期adf-faces-config.xmlファイルがViewControllerプロジェクトの/WEB-INFディレクトリに自動的に作成されます。例11-8に、初期adf-faces-config.xmlファイルを示します。
例11-8 JDeveloperによって作成される初期adf-faces-config.xmlファイル
<?xml version="1.0" encoding="windows-1252"?> <adf-faces-config xmlns="http://xmlns.oracle.com/adf/view/faces/config"> <skin-family>oracle</skin-family> </adf-faces-config>
デフォルトでは、Oracleスキン・ファミリがJSFアプリケーションに使用されます。このデフォルトをminimalに変更するか、カスタム・スキンを使用することができます。SRDemoアプリケーションでは、srdemoスキンを使用しています。カスタム・スキンを使用する場合は、adf-faces-skins.xml構成ファイルを作成し、カスタム・スキンを使用するようにadf-faces-config.xmlを変更する必要があります。詳細は、22.3.1項「スキンの使用方法」を参照してください。
JDeveloperでadf-faces-config.xmlファイルを編集するには、次の手順に従います。
adf-faces-config.xmlファイルを編集する手順:
アプリケーション・ナビゲータで、adf-faces-config.xmlをダブルクリックしてファイルをXMLエディタで開きます。
要素名に精通している場合は、それらをエディタに入力します。精通していない場合は、構造ウィンドウを使用すると要素名を簡単に挿入できます。
構造ウィンドウを使用するには、次の手順に従います。
要素を右クリックして「の前に挿入」または「の後ろに挿入」のいずれかのメニューを選択し、挿入する要素をクリックします。
構造ウィンドウで新規挿入した要素をダブルクリックしてプロパティ・エディタで開きます。
値を入力するか、ドロップダウン・リスト(使用できる場合)から選択します。
ほとんどの場合、JSF EL式(#{view.locale.language=='en' ? 'minimal' : 'oracle'}など)または静的値(<debug-output>true</debug-output>など)のいずれかを入力できます。EL式は、リクエストごとに動的に再評価され、適切なオブジェクト(Booleanオブジェクトなど)を戻す必要があります。
|
注意: すべての要素は、ルート要素<adf-faces-config>内に任意の順序で定義できます。また、要素の複数のインスタンスを含めることもできます。adf-faces-config.xmlで使用できる構成要素の詳細は、A.10項「adf-faces-config.xml」を参照してください。 |
通常、次の情報をadf-faces-config.xmlで構成します。
ページ・アクセシビリティ・サポートのレベル(11.6項「ADF Facesのベスト・プラクティス」を参照)
スキン・ファミリ(22.3項「スキンの使用によるルック・アンド・フィールの変更」を参照)
拡張デバッグ出力(A.10.1.3項「拡張デバッグ出力の構成」を参照)
Oracle Help for the Web(OHW)のURL(A.10.1.11項「ヘルプ・サイトURLの構成」を参照)
また、ファイル・アップロード用のカスタム・ファイル・アップロード・プロセッサを登録できます。詳細は、19.6.5項「カスタムのアップロード・ファイル・プロセッサの構成」を参照してください。
adf-faces-config.xmlファイルで要素を構成すると、プログラムを使用して、またはJSF EL式を使用してプロパティ値を取得できます。詳細は、付録A「adf-faces-config.xmlからの構成プロパティ値の取得」を参照してください。
JSF Webページを開発する際は、次の事柄を考慮してください。
JSFページではJSTLタグおよびHTMLタグを使用しないでください。JSTLタグは、J2EE 1.5より前ではJSFとはまったく連携して機能しません。また、JSFタグ内部のHTMLタグはf:verbatimの使用が必要なことを意味する場合があります。
たとえば、JSFタグの周囲ではc:forEachはまったく使用できません。ボディに対して反復処理を実行するJSF以外のタグ内部でJSFタグをネストすると、ページの初回処理時に、ネストされたタグはコレクションのアイテムごとに1回起動され、起動のたびに新しいコンポーネントが作成されます。後続のリクエストでは、アイテム数が異なるため、反復ごとに新しいコンポーネントIDが必要となる問題を解決する適切な方法がありません。JSPページのスコープ変数は、JSFでは参照できません。前のレンダリング・フェーズでのJSFリクエストのスコープ変数は、現在のポストバック・リクエストでは使用できません。
その他のJSF以外のタグは、JSFタグと併用できますが、細心の注意を払う必要があります。たとえば、c:ifとc:chooseを使用する場合は、ネストされたJSFタグのid属性を設定する必要があります。JSFタグ内でJSF以外のタグをネストする場合は、JSF以外のタグをf:verbatim内にラップする必要があります。JSFコンテンツを含むJSPページを動的に組み込む場合は、f:subviewを使用し、かつ組み込まれるJSF以外のコンテンツもすべてf:verbatim内にラップする必要があります。
SRDemoユーザー・インタフェースでは、ADFモデルから取得されない文字列リソース(ページ・タイトル、フィールド・ラベルなど)はすべて、ViewControllerプロジェクトのリソース・プロパティ・ファイルに追加されます。リソース・プロパティ・ファイルを使用してUI文字列を保持する場合、f:loadBundleタグを使用してプロパティ・ファイルをJSFページにロードします。リソース・バンドルとf:loadBundleタグの詳細は、22.4項「アプリケーションの国際化」を参照してください。
ADF Facesコンポーネントの使用時に、ADF Facesのaf:formタグを使用するための要件はありません。JSF標準のh:formは、すべてのADF Facesコンポーネントで使用できます。af:formを使用する場合は、af:formコンポーネントがJSFのNamingContainer APIを実装しないことに注意してください。つまり、生成されたHTMLのコンポーネントIDには、フォームのIDが接頭辞として含まれていません。複数のフォームがあるページの場合、フォーム間でIDの値を再利用できないことを暗に示しています。たとえば、次のコードは、inputTextのコンポーネントID foo:barを生成します。
<h:form id="foo"> <af:inputText id="bar"/> </h:form>
しかし、次のコードは、inputTextのコンポーネントID bar2を生成します。
<af:form id="foo2"> <af:inputText id="bar2"/> </af:form>
af:formを使用する利点は次のとおりです。
コンテンツ内のname属性とid属性に(前述のとおり)接頭辞が付かないため、JavaScriptの作成がより簡単になります。
フォームIDが不明な場合など、より簡潔なHTMLになります。
フィールドで一部のCSS機能を使用できます。
フォーム送信用のデフォルト・コマンドを設定できます。af:formのdefaultCommand属性を、[Enter]キーが押されたときにデフォルトの送信ボタンとして使用されるコマンド・ボタンのIDに設定します。フォームのデフォルト・コマンド・ボタンを定義することによって、ユーザーが[Enter]キーを押すと、ActionEventが作成されフォームが送信されます。フォームのデフォルト・コマンド・ボタンが定義されていないと、[Enter]を押してもフォームは送信されず、ページが再表示されるだけです。
afh:bodyタグを使用すると、ページでの部分ページ・レンダリング(PPR)が可能になります。ページでafh:bodyタグが使用できない場合にPPRのサポートが必要なときは、afh:bodyタグのかわりにaf:panelPartialRootタグを使用します。PPRの詳細は、19.4項「部分ページ・レンダリングの有効化」を参照してください。
af:documentタグは、HTMLページの標準ルート要素、すなわちhtml、headおよびbodyを生成するため、afh:html、afh:headおよびafh:bodyのかわりにaf:documentを使用できます。
ADF Facesコンポーネントの使用方法に関するヒントは、11.6項「ADF Facesのベスト・プラクティス」を参照してください。
構造ウィンドウでは、要素の挿入、コピー、移動の際に、ターゲット要素に関連して、ページについて表示される構造で挿入ポイントを選択します。JDeveloperには、ターゲット要素の前、後あるいは内部に含まれる挿入ポイントの場所を示す視覚的な合図があります。
要素を挿入ポイントにドラッグする場合は、次のいずれかを実行します。

要素をターゲット要素の前に挿入するには、ターゲット要素の上方にドラッグし、上向きの矢先が埋め込まれた横線が表示されたらマウス・ボタンを離します。

要素をターゲット要素の後に挿入するには、ターゲット要素の下方にドラッグし、下向きの矢先が埋め込まれた横線が表示されたらマウス・ボタンを離します。
要素をターゲット要素の内部に挿入または含めるには、ターゲット要素の上にドラッグし、ターゲット要素がボックスで囲まれたらマウス・ボタンを離します。挿入する要素をターゲット要素に含めることができない場合、その要素はターゲット要素の後に挿入されます。

|
ヒント: ドラッグ・カーソルが丸に斜線のマークに変化した場合は、許可されない挿入ポイントを示します。 |
SRDemoのほとんどのページでは、af:messagesを使用してエラー・メッセージを表示しています。データ・コントロール・パレットを使用してデータ・バインドされたページを作成すると、ADF Facesによってaf:messagesタグがページ上部に自動的に挿入されます。実行時にエラーがあると、ADF Facesによってメッセージがカラーでオフセットされたメッセージ・ボックスに自動的に表示されます。エラー・メッセージの詳細は、20.7項「エラー・メッセージの表示」を参照してください。
メッセージ・ボックスでのエラーのレポートに加えて、致命的エラー(スタック・トレースなど)を書式設定された形式で表示するために汎用のJSFエラー処理ページを使用できます。汎用のエラー処理ページを使用する場合、<error-page>要素をweb.xmlで使用してエラー・ページの例外タイプを指定するか(例11-9を参照)、JSPページ・ディレクティブを使用してエラー・ページを指定します(例11-10を参照)。
例11-9 web.xmlファイルでのerror-pageおよびexception-typeの構成
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/faces/infrastructure/SRError.jspx</location> </error-page>
例11-10 JSPディレクティブを使用したJSFページでのerrorPageの指定
<jsp:root ...>
<jsp:output ...>
<jsp:directive.page contentType="text/html;charset=windows-1252"
errorPage="faces/SRError.jspx"/>
<f:view></f:view>
</jsp:root>
汎用のJSF JSPエラー・ページを作成および使用する場合は、次の事柄を考慮してください。
Sun社のJSFリファレンス実装における現在の制限のため、JDeveloperでJSF JSPの作成ウィザードを使用してJSF JSPエラー・ページを作成する場合、<f:view></f:view>を<f:subview></f:subview>で置換する必要があります。
web.xmlで、次の設定をADF Facesフィルタ・マッピングに追加する必要があります。
<dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher>
エラー・ページを使用するJSFページでは、次のコードに示すように、<jsp:directive errorPage=""/>のerrorpageのURIに接頭辞faces/を含める必要があります。
<jsp:directive.page contentType="text/html;charset=windows-1252"
errorPage="faces/SRError.jspx"/>
SRDemoのページでは、panelPageを主要なADF Facesレイアウト・コンポーネントとして使用しています。このコンポーネントを使用すると、図11-5に示すように、ナビゲーション・メニュー、ブランド・イメージ、ページ・ボディ・コンテンツ用の特殊な領域があるページ全体をレイアウトできます。
panelPageコンポーネントでは、ファセット(JSFのf:facetタグ)を使用して子コンポーネントをページ上の特定の事前に定義された場所にレンダリングします。ファセットは、1つの子コンポーネントに対するプレースホルダとみなします。各ファセットには名前と用途があり、子コンポーネントがレンダリングされる場所を親コンポーネントを基準に決定します。子コンポーネントは、多くの場合、他の子コンポーネントのコンテナ・コンポーネントです。
panelPageコンポーネントでは、ユーザーがアプリケーション内の関連ページに素早く移動できるようにする階層的なナビゲーション・メニューを作成するためにmenu1、menu2およびmenu3ファセットを使用します。メニュー・ファセットでは、次のいずれかを実行できます。
メニュー・コンポーネント(menuTabs、menuBarなど)とその子メニュー・アイテムを手動で挿入します。個々の子コンポーネントを手動で挿入することによって、JSFページでは大量のコードが必要となり、作成およびメンテナンスに多くの時間を要します。
たとえば、サブタブを持つメニュー・タブを2つ作成するには、次のようなコードが必要になります。
<f:facet name="menu1">
<af:menuTabs>
<af:commandMenuItem text="Benefits" selected="true"
action="go.benefits"/>
<af:commandMenuItem text="Employee Data" action="go.emps"/>
</af:menuTabs>
</f:facet>
<f:facet name="menu2">
<af:menuBar>
<af:commandMenuItem text="Insurance" selected="true"
action="go.insurance"/>
<af:commandMenuItem text="Paid Time Off" selected="false"
action="go.pto"/>
</af:menuBar>
</f:facet>
メニュー・コンポーネントをMenuModelオブジェクトにバインドし、メニュー・コンポーネントごとにnodeStampファセットを使用して、メニュー・アイテムを排除します(各メニュー・コンポーネント内に複数のメニュー・アイテム・コンポーネントを保持する必要がなくなります)。MenuModelオブジェクトにバインドしてnodeStampファセットを使用することによって、JSFページで使用するコードが少なくなり、同じメニュー・コードを使用して(階層内での位置に関係なく)ほとんどのページをレンダリングできます。たとえば、前述の2つのメニュー・タブと同じものを作成するには、次のようにします。
<f:facet name="menu1">
<af:menuTabs var="menutab" value="#{menuModel.model}">
<f:facet name="nodeStamp">
<af:commandMenuItem text="#{menutab.label}"
action="#{menutab.getOutcome}"/>
</f:facet>
</af:menuList>
</f:facet>
<f:facet name="menu2">
<af:menuBar startDepth="1" var="menusubtab" value="#{menuModel.model}">
<f:facet name="nodeStamp">
<af:commandMenuItem text="#{menusubtab.label}"
action="#{menusubtab.getOutcome}"/>
</f:facet>
</af:menuList>
</f:facet>
SRDemoのページでは、メニュー・コンポーネントは、マネージドBeanによって構成されるメニュー・モデル・オブジェクトにバインドされています。マネージドBeanを使用したメニュー構造の作成方法は、19.2項「動的なナビゲーション・メニューの使用」を参照してください。
階層的なメニューのレイアウトに加えて、panelPageコンポーネントでは、図11-7および図11-8に示すように、ページレベルおよびアプリケーションレベルのテキスト、イメージ、アクション・ボタンを特殊な領域でレイアウトするために、その他のファセットを使用できます。
ファセットまたはpanelPage自体に子コンポーネントを挿入する方法は、11.4.1項「JSFページにUIコンポーネントを追加する方法」を参照してください。
図11-7に、ブランド・イメージ、グローバル・ボタン、メニュー・タブ、メニュー・バー、メニュー・リストおよびアプリケーションレベルのテキストをレイアウトするためのpanelPageのファセット(番号1〜12)を示します。
表11-3に、(図11-7で番号が付けられた)panelPageのファセットと、その内部で使用できる推奨される子コンポーネントを示します。JDeveloperの構造ウィンドウでファセットを右クリックすると、使用できる推奨コンポーネントがあれば「の中に挿入」ポップアップ・メニューに表示されます。
表11-3 ブランド・イメージ、ナビゲーション・メニューおよびアプリケーションレベルのテキスト用のPanelPageのファセット
| 番号 | ファセット | 説明 |
|---|---|---|
|
1 |
|
企業のロゴまたは組織のブランド用。 |
|
2 |
|
アプリケーションのロゴまたは製品のブランド用。 |
|
3 |
|
通常、 |
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
検索領域用。 |
|
10 |
|
アプリケーションの詳細へのリンク用。 |
|
11 |
|
著作権のテキスト用。outputTextを使用します。テキストは、 |
|
12 |
|
アプリケーションのプライバシ・ポリシーの記述へのリンク用。 |
図11-8に、ページレベルのアクションおよびテキストをレイアウトするためのpanelPageのファセット(番号1〜7)を示します。
表11-4に、(図11-8で番号が付けられた)panelPageのファセットと、その内部で使用できる推奨される子コンポーネントを示します。
表11-4 ページレベルのアクションおよび情報テキスト用のPanelPageのファセット
| 番号 | ファセット | 説明 |
|---|---|---|
|
1 |
|
ページ・コンテンツに対して機能するページレベルのアクション用。通常、 |
|
2 |
|
コンテキスト・スイッチャを使用すると、コンテキストに基づいてページのコンテンツを変更できます。たとえば、部門の会社資産を表示している際に、コンテキスト・スイッチャを使用して別の部門の資産に切り替えることができます。すべてのページが選択したコンテキストに変ります。通常、 |
|
3 |
|
当面のタスクを補助するページレベルの情報用。通常、 |
|
4 |
|
「Xに戻る」リンク用。 |
|
5 |
|
当面のタスクに関するページレベルのステータス情報用。重要な注釈を示すためにも使用できます。重要な注釈とは、ページ・コンテンツ内で使用されるアイコン、要素または用語を定義するために使用される説明文です。通常、 |
|
6 |
|
その他の追加情報用。通常、 |
|
7 |
|
ユーザーのログイン情報および接続情報の表示用。通常、 |
|
ヒント: panelPageと同様、pageコンポーネントを使用すると、特殊なコンテンツ領域があるページ全体をレイアウトできます。panelPageとは異なり、pageのvalueをメニュー・モデル・オブジェクトにバインドして、ページの階層的なメニューを作成できます。個々のメニュー・コンポーネントをメニュー・モデル・オブジェクトにバインドする必要はありません。 |
panelPageのファセットを設定したら、panelPageコンポーネントの内部にフォーム、表およびその他のページ・ボディ・コンテンツを作成します。ADF Facesのパネル・コンポーネント(など)を使用すると、ページ上のコンテンツを簡単に編成できます。表11-5に従って、用途に適したコンポーネントを決定してください。
各コンポーネントに設定できるコンポーネントの属性の詳細は、JDeveloperのオンライン・ヘルプを参照してください。各コンポーネントが表すもののイメージは、次のURLでADF Faces Coreタグのドキュメントを参照してください。
表11-5 レイアウトおよびパネルのADF Facesコンポーネント
| 用途 | 使用するコンポーネント |
|---|---|
|
フォーム入力コンポーネントを1列以上に整列させる。ラベルは右寄せ、フィールドは左寄せ。 |
|
|
コンポーネントを水平に整列させる。必要に応じて水平または垂直の位置合せを指定する。 |
|
|
コンポーネントを横1列または縦1列に続けて整列させる。必要に応じて折り返す。 |
|
|
1列以上の箇条書きリストを作成する。 |
|
|
ラベル、ヒントおよびメッセージを使用して、1つ以上のコンポーネントをレイアウトする。 |
複数の 入力コンポーネントをレイアウトする場合は、入力コンポーネントの |
|
カラーでオフセットされたコンテナの中にコンポーネントを配置する。 |
通常、 |
|
ファセットを使用して事前に定義された場所にコンポーネントを配置する。 |
|
|
一連のボタンをレイアウトする。 |
|
|
追加のページレベルまたはセクションレベルのヒントをユーザーに表示する。 |
|
|
ヘッダーを使用してページ・セクションおよびサブセクションを作成する。 |
|
|
長いページのセクションにクイック・リンクを追加する。 |
|
|
コンポーネント・グループの表示(公開)/非表示(非公開)を切り替えることができるようにする。 |
|
|
同時にコンテンツ・グループを選択および表示できるようにする。 |
ShowOneコンポーネントには、 |
|
|
JSFでは、バッキングBeanは、主にイベントおよびページ・フローの処理のUIロジックを提供するために使用されるJavaBeansです。通常、バッキングBeanはJSFページごとに1つあります。バッキングBeanには、ページで使用されるUIコンポーネントに対するロジックとプロパティが含まれます。たとえば、一部のユーザー・アクティビティの結果としてUIコンポーネントをプログラムで変更する、またはADF宣言アクション・メソッドの前または後でコードを実行するには、必要なコードをページのバッキングBeanに指定して、Bean内の対応するプロパティまたはメソッドにコンポーネントをバインドします。
UIコンポーネント操作または条件付きページ・フロー・ロジックを何も実行しない場合は、ページに対してバッキングBeanを使用する必要もありません。この項の残りの部分では、ページに対してバッキングBeanを使用する必要がある場合の、その使用方法を説明します。
アプリケーションの起動時にバッキングBeanを使用できるようにするには、名前とスコープを指定してマネージドBeanとしてfaces-config.xmlに登録します。実行時に、JSF EL値またはメソッド・バインディング式によってマネージドBeanがページで参照されるたびに、JSF実装ではBeanを自動的にインスタンス化して宣言されたデフォルト値を移入し、faces-config.xmlに定義されているマネージドBeanのスコープ内に配置します。
JSF構成エディタの概要モードを使用すると、バッキングBeanを宣言して作成および構成できます。ファイル名がSRDemopage.jspxのJSFページがあるとします。ここで、このページのバッキングBeanを作成します。
マネージドBeanとしてバッキングBeanを作成および構成する手順:
アプリケーション・ナビゲータで、faces-config.xmlをダブルクリックしてJSF構成エディタのデフォルト・モードで開きます。
エディタの下部で、「概要」タブを選択し、概要モードに切り替えます(必要な場合)。
左側の要素リストで、「Managed Bean」を選択します。
「新規」をクリックして、「マネージドBeanの作成」ダイアログを開きます。
このダイアログで、マネージドBeanについて次の情報を指定します。
名前: マネージドBeanの一意の識別子(backing_SRDemopageなど)を入力します。この識別子は、Beanの完全修飾クラス名ではなく、EL式を使用してプリケーション内でBeanを参照する方法を決定します。
クラス: 完全修飾クラス名(oracle.srdemo.view.backing.SRDemopageなど)を入力します。これは、ページで使用されるUIコンポーネントのデータを保持するプロパティとともに、対応するアクセッサ・メソッドとその他のメソッド(ナビゲーション、検証など)を格納するJavaBeanです。既存のクラスでも、新規のクラスでもかまいません。
有効範囲: Beanが格納されるスコープを決定します。スコープの有効値は次のとおりです。
application: BeanはWebアプリケーションの継続時間の間使用できます。LDAPディレクトリなどのグローバルBeanに適しています。
リクエスト: Beanはインスタンス化された時点からクライアントにレスポンスが返信されるまで使用できます。通常、現在ページの有効期間です。ページのバッキングBeanでは、通常このスコープを使用します。
セッション: Beanはクライアントのセッション中、クライアントで使用できます。
なし: Beanは参照されるたびにインスタンス化されます。
「クラスが存在しない場合は生成」チェック・ボックスを選択すると、Javaクラスが自動的に作成されます。すでにJavaクラスが作成されている場合は、このチェック・ボックスを選択しないでください。
|
注意: この時点では、JSFページとバッキングBean間に厳密な関係を定義していません。faces-config.xmlでバッキングBeanを構成しただけです。これで、ページでJSF EL式を使用して参照できます。ページとバッキングBean間に厳密な関係を定義するには、11.5.3項「JSFページでのバッキングBeanの使用方法」を参照してください。 |
「クラスが存在しない場合は生成」チェック・ボックスを選択すると、「クラス」の値として設定された完全修飾クラス名を使用して、Javaクラスが新規作成されます。新しいファイルは、図11-9に示すように、アプリケーション・ナビゲータのViewControllerプロジェクトのApplication Sourcesノード内に表示されます。
バッキングBeanクラスを編集するには、アプリケーション・ナビゲータでファイル(SRDemopage.javaなど)をダブルクリックしてソース・エディタで開きます。新しいクラスの場合は、例11-11のようなコードが表示されます。
例11-11 JDeveloperによって作成される空のJavaクラス
package oracle.srdemo.view.backing;
public class SRDemopage {
public SRDemopage() {
}
}
faces-config.xmlには、例11-12に示すように、<managed-bean>要素を使用してバッキングBeanの構成が追加されます。
例11-12 faces-config.xmlファイルでのマネージドBeanの登録
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
...
<!-- Page backing beans typically use request scope-->
<managed-bean>
<managed-bean-name>backing_SRDemopage</managed-bean-name>
<managed-bean-class>oracle.srdemo.view.backing.SRDemopage</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
...
</faces-config>
|
注意: バッキングBeanが実行時にADFモデルのバインディング・レイヤーにアクセスするには、バッキングBeanがADFバインディング・コンテナをインジェクトできる必要があります。これを実現する方法は、11.5.7項「ADFデータ・コントロールおよびバッキングBeanの使用方法」を参照してください。 |
関連のプロパティおよびメソッドを指定してバッキングBeanを定義したら、JSF EL式(#{someBean.someProperty}、#{someBean.someMethod}など)を使用して、UIコンポーネントの属性をBeanの適切なプロパティまたはメソッドにバインドします。たとえば、次のコードは、値バインディング式とメソッド・バインディング式を示しています。
<af:inputText value="#{someBean.someProperty}"/>
..
<af:inputText disabled="#{someBean.anotherProperty}"/>
..
<af:commandButton action=#{someBean.someMethod}"/>
..
<af:inpuText valueChangeListener="#{someBean.anotherMethod}"/>
このような式が実行時に検出されると、faces-config.xmlで構成されたBeanのスコープにまだ存在しない場合は、JSFはBeanをインスタンス化します。
値バインディングおよびメソッド・バインディングに加えて、binding属性を使用してUIコンポーネントのインスタンスをBeanのプロパティにバインドすることもできます。
<af:commandButton binding="#{backing_SRDemopage.commandButton1}"
UIコンポーネントのbinding属性でBeanのプロパティを参照すると、Beanによりコンポーネントに直接アクセスできます。そのため、必要に応じてBeanのロジックでコンポーネントの他の属性をプログラム的に操作できます。たとえば、バッキングBeanのなんらかのUIロジックに基づいて、表示テキストの色を変更したり、ボタンまたはフィールドを無効にしたり、あるいはコンポーネントをレンダリングしないようにできます。
繰り返すと、コンポーネントのvalue属性またはその他の属性値をBeanのプロパティにバインドするか、コンポーネント・インスタンスをBeanのプロパティにバインドすることができます。どちらを選択するかは、コンポーネントに対して必要なコントロールの数によって決まります。コンポーネントの属性をバインドすると、Beanの関連プロパティはその属性の値を保持するため、コンポーネントのライフサイクルのモデル値の更新フェーズ中にその値を更新できます。コンポーネント・インスタンスをBeanのプロパティにバインドすると、プロパティはコンポーネント・インスタンス全体の値を保持します。つまり、コンポーネントのその他の属性値を動的に変更できます。
JDeveloperには、JSFページ上のUIコンポーネント・インスタンスをバッキングBeanのプロパティに自動的にバインドできるようにする機能があります。ページの自動バインド機能を有効にすると、ページに挿入するUIコンポーネントについて、プロパティ・コードがページのバッキングBeanに自動的に追加され、コンポーネントのbinding属性がバッキングBeanの対応するプロパティにバインドされます。バッキングBeanでページにあるUIコンポーネントの属性をプログラム変更する必要がない場合、自動コンポーネント・バインド機能を使用する必要はありません。
JSFページの自動バインド機能を有効にすると、特殊なコメント行がページの最後の方に挿入されます。
...
</f:view>
<!--oracle-jdev-comment:auto-binding-backing-bean-name:backing_SRDemopage-->
</jsp:root>
faces-config.xmlでは、同様のコメント行がページのバッキングBeanの構成の最後に挿入されます。
<managed-bean>
<managed-bean-name>backing_SRDemopage</managed-bean-name>
<managed-bean-class>oracle.srdemo.view.backing.SRDemopage</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<!--oracle-jdev-comment:managed-bean-jsp-link:1SRDemopage.jspx-->
</managed-bean>
ページの自動バインド機能を有効にすると、UIコンポーネントをページに追加するたびに次の処理が行われます。
コンポーネントのプロパティとプロパティ・アクセッサ・メソッドがバッキングBeanに追加されます。たとえば、次のコードは、inputTextコンポーネントとcommandButtonコンポーネントについて追加されたコードを示しています。
private CoreInputText inputText1;
private CoreCommandButton commandButton1;
public void setInputText1(CoreInputText inputText1) {
this.inputText1 = inputText1;
}
public CoreInputText getInputText1() {
return inputText1;
}
public void setCommandButton1(CoreCommandButton commandButton1) {
this.commandButton1 = commandButton1;
}
public CoreCommandButton getCommandButton1() {
return commandButton1;
}
次のコードに示すように、EL式をbinding属性の値として使用して、コンポーネントが対応するBeanのプロパティにバインドされます。
<af:inputText binding="#{backing_SRDemopage.inputText1}"
<af:commandButton binding="#{backing_SRDemopage.commandButton1}"
ページの自動バインド機能を無効にすると、特殊なコメントはJSFページおよびfaces-config.xmlから削除されます。ページ上のbinding EL式と、関連するバッキングBeanのコードは削除されません。
|
ヒント: 自動バインドを有効にしてUIコンポーネントをページから削除すると、対応するプロパティおよびアクセッサ・メソッドはページのバッキングBeanから自動的に削除されます。 |
マネージドBeanとは、JSFのfaces-config.xmlファイルに登録されているアプリケーションJavaBeansです。バッキングBeanとは、JSFページ上の一部または全部のUIコンポーネントに対するロジックおよびプロパティを格納するマネージドBeanです。たとえば、検証とイベント処理のロジックをバッキングBeanに挿入すると、UIコンポーネントがbinding属性を介してバッキングBeanのプロパティにバインドされている場合、コードはページ上のUIコンポーネントにプログラムでアクセスできます。
すべてのバッキングBeanはマネージドBeanであるため、このマニュアルでは、バッキングBeanという用語を、マネージドBeanという用語と同義で使用します。ただし、バッキングBeanではないマネージドBean(ページ上のUIコンポーネントに対するプロパティとプロパティのgetterメソッドおよびsetterメソッドを保持しないJavaBean)を使用できますが、そのBeanはfaces-config.xmlで構成され、どの単一ページにも限定されないコードを持ちます。SRDemoアプリケーションでバッキングBeanではないマネージドBeanが使用される場合の例として、次のBeanがあります。
コンテナ・セキュリティからの認証されたユーザーの情報にアクセスするBean
ナビゲーション・メニュー・システム(メニュー・タブ、メニュー・バーなど)を作成するBean
EL式によるバンドル内の文字列リソースを公開するBean
マネージドBeanのプロパティは、Beanがインスタンス化されるときに値を移入するBeanのプロパティです。Beanが作成されると、宣言された各プロパティに対してsetメソッドが実行されます。マネージドBeanのプロパティを設定値で初期化するには、<managed-property>要素をfaces-config.xmlで使用します。マネージドBeanの管理プロパティを構成する際に、例11-13に示すように、プロパティ名、クラス・タイプ、デフォルト値を宣言します。
例11-13 faces-config.xmlファイルにおけるマネージドBeanのプロパティの初期化コード
<managed-bean>
<managed-bean-name>tax</managed-bean-name>
<managed-bean-class>com.jsf.databeans.TaxRateBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
<property-name>rate</property-name>
<property-class>java.lang.Float</property-class>
<value>5</value>
</managed-property>
</managed-bean>
例11-13のrateプロパティは、EL式#{tax.rate}を使用してBeanがインスタンス化されると、値5(Floatに変換)で初期化されます。
マネージドBeanとマネージドBeanのプロパティは、BeanまたはプロパティのタイプがListまたはMapであるか、java.util.Mapまたはjava.util.Listを実装することを指定すると、リストまたはマップとして初期化できます。リストまたはマップ内の値のデフォルト・タイプは、java.lang.Stringです。
例11-14に、リストであるマネージドBeanの例を示します。
例11-14 faces-config.xmlファイルにおけるマネージドBeanのリスト
<managed-bean>
<managed-bean-name>options</managed-bean-name>
<managed-bean-class>java.util.ArrayList</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<list-entries>
<value>Text Only</value>
<value>Text + HTML</value>
<value>HTML Only</value>
</list-entries>
</managed-bean>
アプリケーションがEL式#{options.text}を検出すると、Listオブジェクトが作成され、宣言されたlist-entriesのvalueの値で初期化されます。managed-property要素は宣言されませんが、かわりにlist-entriesがmanaged-bean要素の子要素となります。
|
ヒント: マネージドBeanは、同じスコープまたはより長い存続期間のスコープを持つBean内の管理プロパティのみを参照できます。たとえば、sessionスコープのBeanは、requestスコープのBeanの管理プロパティを参照できません。 |
JSFページでデータ・コントロール・パレットから項目をドロップしてデータ・バインドされたUIコンポーネントを作成する際、JDeveloperによって様々な処理が自動的に行われます。これについては、12.2.3項「データ・コントロール・パレットの使用時に行われる処理」で説明されています。データ・バインドされたUIコンポーネントは、#{bindings.ProductName.inputValue}などのADFデータ・バインディングEL式を使用して、ページのバインディング・コンテナの関連付けられたバインディング・オブジェクトを参照します。このbindingsは現在ページのADFバインディング・コンテナへの参照です。
ADFデータ・バインディングを使用するページのバッキングBeanでは、バインディング・コンテナのバインディング・オブジェクトを参照する場合もあります。ADFバインディング・コンテナを参照するため、JSF値バインディングを#{bindings} EL式へ解決し、その結果をoracle.binding.BindingContainerインタフェースにキャストできます。または、便宜上、同じ#{bindings} EL式を参照するbindingsという名前の管理プロパティをfaces-config.xml内のページのマネージドBean構成に追加して、バッキングBeanが実行時にADFバインディング・コンテナとともにプログラムで動作するようにできます。例11-15に、SRMainページに対するbacking_SRMainマネージドBeanのbindings管理プロパティを示します。
例11-15 faces-config.xmlファイルにおけるbindings管理プロパティ
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
...
<managed-bean>
<managed-bean-name>backing_SRMain</managed-bean-name>
<managed-bean-class>oracle.srdemo.view.backing.SRMain</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>bindings</property-name>
<value>#{bindings}</value>
</managed-property>
</managed-bean>
...
</faces-config>
バッキングBeanでは、バインディング・コンテナに対するgetterメソッドとsetterメソッドを追加します。例11-16に、bindingsに関連するコードを格納するSRMain.javaの一部を示します。
例11-16 バッキングBeanにおけるbindingsのgetterメソッドとsetterメソッド
...
import oracle.binding.BindingContainer;
private BindingContainer bindings;
public BindingContainer getBindings() {
return this.bindings;
}
public void setBindings(BindingContainer bindings) {
this.bindings = bindings;
}
...
実行時に、アプリケーションがADFバインディング・コンテナを参照するADFデータ・バインディングのEL式(#{bindings.bindingObject.propertyName}など)を検出すると、JSFによりその式が評価され、バインディング・オブジェクトから値が取得されます。
ADFデータ・バインディングのEL式およびADFバインディングのプロパティの詳細は、12.6項「ADFデータ・バインディングEL式の作成」を参照してください。
ADF ModelおよびADF Business ComponentsとともにJSFバッキングBeanを使用する方法の概要は、第1章「Oracle ADFアプリケーションの概要」を参照してください。
ADF Facesを使用して開発する際は、次のベスト・プラクティスを考慮してください。
JSPドキュメント(.jspx)とJSPページ(.jsp)はいずれも使用できますが、ADF FacesコンポーネントをJSFページで使用する際は、JSPドキュメント(.jspx)を使用することをお薦めします。これは、JSPドキュメントが整形式XML文書であるためです。XML標準には、Document Type Definition(DTD)に対する検証、ドキュメント作成やレポート監査の解析など、様々な利点があります。
web.xmlでjavax.faces.STATE_SAVING_METHODの値をclientに設定して、トークンベースのクライアント側の状態保存をサーバー側の状態保存のかわりに使用します(これは、JSF 1.2で提供されるデフォルトのサーバー側の動作と合致します)。
サーバー側の状態保存によってパフォーマンスはいくらか向上しますが、クライアント側の状態保存の方がフェイルオーバーおよび「戻る」ボタンと、複数ウィンドウの同時表示について適切にサポートするため、お薦めします。トークンベースのクライアント側の状態保存により、CPUおよびI/Oの消費量は低減されるため、サーバーのパフォーマンスは向上します。
ただし、Industrial Telnet Serverでは、現在のところクライアント側の状態保存はサポートされないため、ADF Telnetアプリケーションではjavax.faces.STATE_SAVING_METHODをserverに設定する必要があります。
デプロイ済アプリケーションのパフォーマンスを向上させるには、デバッグ機能を削除または無効にします。
web.xmlで、oracle.adf.view.faces.CHECK_FILE_MODIFICATIONを無効にします。デフォルトでは、このパラメータはfalseです。trueに設定すると、ADF FacesはJSPの変更日は自動的にチェックし、変更されている場合は保存された状態を破棄します。JDeveloperの埋込みOC4Jにおけるテストおよびデバッグの場合、ADF Facesは埋込みOC4Jを自動的に検出し、ファイル変更チェックが有効に設定された状態で稼働するため、このパラメータをtrueに明示的に設定する必要はありません。ただし、アプリケーションのデプロイ時には、パラメータをfalseに設定する必要があります。
web.xmlで、oracle.adf.view.faces.DEBUG_JAVASCRIPTを無効にします。このパラメータのデフォルト値はfalseです。つまり、デフォルトでは、ADF FacesはJavaScriptを曖昧化し、コメントおよび空白を削除してクライアントにダウンロードするJavaScriptのサイズを縮小します。アプリケーション開発時に、JavaScriptをより簡単にデバッグできるようにパラメータをtrueに設定(曖昧化を無効に)できますが、アプリケーションのデプロイ時には、パラメータをfalseに設定する必要があります。
adf-faces-config.xmlで、<debug-output>をfalseに設定します。<debug-output>がtrueの場合、自動的にインデントした別のコメントを追加し、不正なマークアップの問題、アンバランスな要素および一般的なHTMLエラーを検出することによって、ADF Facesはデバッグ出力を拡張します。拡張されたデバッグ出力は、デプロイ済アプリケーションでは不要です。
ADF Facesの入力コンポーネントでは、autoSubmit属性による自動フォーム送信をサポートします。autoSubmit属性がtrueに設定され、対応するアクション(値の変更など)が実行されると、入力コンポーネントは、自身を含むフォームを部分ページ送信によって自動的に送信します。したがって、ページ全体を再描画する必要なしにページの一部を更新できます。これは、部分ページ・レンダリングとして知られています。部分ページ・レンダリングの使用方法は、19.4項「部分ページ・レンダリングの有効化」を参照してください。
ADF Facesは、自動送信の実行時にクライアント側およびサーバー側の検証を実行します。しかし、ADF Facesの入力コンポーネントのautoSubmit属性とimmediate属性の両方をtrueに設定すると、クライアント側の検証は実行されません。
ADF Facesの入力コンポーネントをpanelLabelAndMessageコンポーネントの内部にレイアウトする場合は、入力コンポーネントのsimple属性をtrueに設定する必要があります。アクセシビリティのために、panelLabelAndMessageのfor属性の値として最初の入力コンポーネントを設定します。適切な位置合せのために、複数のpanelLabelAndMessageコンポーネントをpanelFormに配置します。
ADF Facesは、simpleの入力コンポーネントのラベルおよびメッセージの属性を無視しますが、コンポーネントによって生成されるエラー・メッセージを正しく表示するには、このバージョンのADF Facesではsimpleのコンポーネントにlabel属性を設定する必要があります。
styleClass属性とstyleUsage属性の両方がコンポーネントに設定されている場合、styleClassはstyleUsageに優先します。
ADF Facesには、3つのレベルのページ・アクセシビリティ・サポートが用意されています。このサポートは、<accessibility-mode>要素を使用してadf-faces-config.xmlで構成されます。<accessibility-mode>に許容される値は、次のとおりです。
default: デフォルトでは、身体障害者ユーザーが利用できるHTMLコードを生成します。
screenReader: スクリーン・リーダーを使用するために最適化されるHTMLコードを生成します。screenReaderモードは、身体障害者ユーザーを支援しますが、健常者ユーザー用の出力が悪化することがあります。たとえば、screenReaderモードでは、アクセス・キーは使用できません。
inaccessible: 健常者ユーザーに影響を及ぼさないコードをすべて削除します。この最適化により、生成されるHTMLのサイズは縮小されます。しかし、身体障害者ユーザーはアプリケーションを利用できなくなります。
ADF Facesコンポーネントによって自動的に生成されるイメージには、スクリーン・リーダーまたは非視覚的なブラウザで読み取ることができる記述が組み込まれています。ユーザー指定のアイコンおよびイメージから生成されたイメージの場合、shortDesc属性またはsearchDesc属性を必ず設定してください。これらの属性は、HTMLのalt属性に変換されます。特定のADF Facesコンポーネント(menuTabs、menuButtonsなど)によって作成されたイメージの場合は、commandMenuItemにtext属性またはicon属性を必ず設定してください。これは、ADF Facesではこれらの属性値を使用して、メニュー名とその状態を記述するテキストを生成するためです。
tableおよびoutputTextコンポーネントの場合と同様に、summary属性とdescription属性をそれぞれ非視覚的なメディアにレンダリングするユーザー・エージョンに対して設定します。フレームを使用する場合は、frameBorderLayoutのalternateContentファセットを使用して、フレームがない代替ページへのリンクを指定します。各フレーム内に、shortDesc属性とlongDescURL属性を設定します。
入力コンポーネント、コマンド・コンポーネント、移動コンポーネント(inputText、commandButton、goLinkなど)に対してアクセス・キーを指定します。
通常、コンポーネントのaccessKey属性を使用してキーボードの文字を設定します。コマンド・コンポーネントと移動コンポーネントの場合、属性によって指定される文字は、コンポーネント・インスタンスのtext属性の中に存在する必要があります。存在しない場合、コンポーネントにアクセス・キーがあることを示す視覚的な印は表示されません。
入力コンポーネントではlabelAndAccessKey、コマンド・コンポーネントと移動コンポーネントではtextAndAccessKeyを使用することもできます。これらの属性を使用すると、label値またはtext値と、アクセス・キーを同時にコンポーネントに対して設定できます。使用する従来のアンパサンド表記は、JSPドキュメント(.jspx)では&です。たとえば、次のコードを見てみます。
<af:commandButton textAndAccessKey="&Home"/>
... この場合、ボタン・テキストはHome、アクセス・キーはH(アンパサンド文字のすぐ後の文字)です。
goButtonコンポーネントとgoLinkコンポーネントでアクセス・キーを使用すると、ブラウザによってはすぐにアクティブ化されます。ページ上の複数の移動コンポーネントに同じアクセス・キーが割り当てられている場合、ブラウザによっては、同じキーでアクセスされるコンポーネント間で循環するかわりに、最初のコンポーネントがアクティブになることがあります。
空白をアクセス・キーとして使用する場合は、[Alt]+[Space]または[Alt]+スペースバーがアクセス・キーであることをユーザーに伝える方法を用意する必要があります。これは、コンポーネントのラベルまたはテキスト・ラベルで空白を視覚的に表現するのに適した方法がないためです。たとえば、shortDesc属性を使用してコンポーネントのツールチップになんらかのテキストを指定できます。
アクセシビリティ・モードがscreenReaderモードに設定されていると、アクセス・キーは表示されません。
web.xmlでoracle.adf.view.faces.USE_APPLICATION_VIEW_CACHEの値をtrueに設定して、アプリケーション・ビュー・キャッシュを有効にします。
アプリケーション・ビュー・キャッシュが有効化されると、ユーザーによって最初にページが表示されたときに、ADF Facesにより初期のページ状態がアプリケーション・レベルでキャッシュされます。その後、すべてのユーザーがページのキャッシュされた状態を入れ替わり再利用できるため、アプリケーションのパフォーマンスは著しく向上します。
アプリケーション・ビュー・キャッシュはデプロイ済アプリケーションのパフォーマンスを向上させることができますが、開発時に使用することは難しく、考慮する必要があるコーディングの問題がいくつか存在します。アプリケーション・ビュー・キャッシュの使用方法は、ADF Facesの開発者ガイドの「Configuring ADF Faces」の「Configuring ADF Faces for Performance」を参照してください。
ADF Facesのデプロイメントのベスト・プラクティスは、第34章「ADFアプリケーションのデプロイ」を参照してください。
ADF Facesキャッシュ・タグ・ライブラリを使用してコンテンツをキャッシュすることによって、スループットを増やし、レスポンス時間を短縮します。キャッシングにより、Webページの全部または一部がそれ以降のレスポンスで使用するためにメモリーに格納されます。クライアント・リクエストへのレスポンス時間は、それ以降のリクエストに対して、コンテンツを作成するコードを実行せずに、キャッシュされたコンテンツを再利用することで、著しく短縮されます。詳細は、第23章「キャッシングによるアプリケーション・パフォーマンスの最適化」を参照してください。