この章では、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.1.2項「Oracle ADFおよびJavaServer Facesによる宣言的な開発」を参照してください。
表4-1に、ADF Faces用に現在サポートされているプラットフォームを示します。
表4-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、EJB、TopLink]」アプリケーション・テンプレートを使用しています。このテンプレートは、データ・モデル用のプロジェクトと、コントローラ・コンポーネントおよびビュー(ユーザー・インタフェース)・コンポーネント用のプロジェクトをそれぞれ1つずつワークスペースに作成します。
JDeveloperでアプリケーション・ワークスペースを新規作成し、アプリケーション・テンプレートを選択するには、次のようにします。
アプリケーション・ナビゲータで「アプリケーション」ノードを右クリックし、「新規アプリケーション」を選択します。
「アプリケーションの作成」ダイアログで、「Webアプリケーション[JSF、EJB、TopLink]」アプリケーション・テンプレートをリストから選択します。
アプリケーション・ワークスペースを作成するために、JDeveloperのアプリケーション・テンプレートを必ずしも使用する必要はありません。これらは単に便宜上提供されているにすぎません。
場合によっては、既存のWARファイルがあり、そのファイルをJDeveloperにインポートすることがあります。
JDeveloperでWARファイルを新規プロジェクトにインポートするには、次のようにします。
アプリケーション・ナビゲータで該当のアプリケーション・ワークスペースを右クリックし、「新規プロジェクト」を選択します。
「新規ギャラリ」の「カテゴリ」ツリーで、Generalを開き、Projectsを選択します。
「項目」リストで、「WARファイルからのプロジェクト」をダブルクリックします。
ウィザードの指示に従って、プロジェクトの作成を完了します。
デフォルトでは、データ・モデル用のプロジェクトにはModel、ユーザー・インタフェースおよびコントローラ用のプロジェクトにはViewControllerと名前が付けられます。プロジェクトの名前は、プロジェクトの作成後に「ファイル」→「名前の変更」を使用して変更できます。あるいは、「ツール」→「テンプレートの管理」を使用してJDeveloperで使用されるデフォルトの名前を変更できます。
注意: この章で使用される図およびプロジェクト名は、JDeveloperのデフォルトの名前です。ただし、SRDemoアプリケーションでは、JSFのビュー・コンポーネントおよびコントローラ・コンポーネントにはUserInterface、Plain Old Java Objectを使用するEJBセッションBeanおよびTopLinkが含まれるプロジェクトにはDataModelをプロジェクト名として使用しています。アプリケーション・ナビゲータのSRDemoアプリケーションには、追加のプロジェクトも含まれます(BuildAndDeployなど)。これらのプロジェクトを手動で作成し、論理フォルダにアプリケーション・コンポーネントを分類できます。 |
図4-1に、ワークスペース作成後のアプリケーション・ナビゲータでのViewControllerプロジェクトを示します。
図4-2に、ファイル・システムでの<JDEV_HOME>/jdev/mywork
フォルダに作成された実際のフォルダを示します。
たとえば、Application1というワークスペースを作成すると、ViewControllerフォルダとそのサブフォルダがファイル・システムの<JDEV_HOME>/jdev/mywork/Application1
に配置されます。
「Webアプリケーション[JSF、EJB、TopLink]」テンプレートを使用してワークスペースを作成すると、次の処理が行われます。
JSFテクノロジを使用するViewControllerプロジェクトが作成されます。プロジェクト・プロパティには、次のものがあります。
JSPタグ・ライブラリ: JSF Core、JSF HTML。表4-2を参照してください。
ライブラリ: JSF、Commons Beanutils、Commons Digester、Commons Logging、Commons Collections、JSTL。
テクノロジ・スコープ: JSF、JSPおよびサーブレット、Java、HTML。
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
に追加されるものの詳細は、4.2.1.1項「初期web.xmlファイル」を参照してください。
空のfaces-config.xml
ファイルがViewControllerプロジェクトの/WEB-INF
に作成されます。faces-config.xml
の詳細は、4.2.1.2項「初期faces-config.xmlファイル」を参照してください。
アプリケーション・ナビゲータでfaces-config.xmlファイルをダブルクリックして開くと、JDeveloperによりファイル・システムのViewControllerフォルダにモデル・フォルダが作成され、そのモデル・フォルダにfaces-config.oxd_faces
ファイルが追加されます。faces-config.oxd_faces
ファイルの詳細は、4.3.2項「JSFページの作成時に発生する処理」を参照してください。
jsf-impl.jar
がViewControllerプロジェクトの/WEB-INF/lib
に追加されます。
TopLinkおよびEJBテクノロジを使用するModelプロジェクトが作成されます。Modelプロジェクトの詳細は、1.2.1.2項「Modelプロジェクトでのビジネス・サービスの作成」を参照してください。
JSFアプリケーションの構成の部分も、J2EEアプリケーション・デプロイメント・ディスクリプタweb.xml
の内容によって決定されます。web.xml
ファイルは、サーバーで認識する必要があるアプリケーションに関するあらゆることを定義します(ただし、アプリケーションのデプロイ時にJDeveloperまたはシステム管理者によって割り当てられるルート・コンテキスト・パスは除きます)。通常のランタイム設定には、初期化パラメータ、カスタム・タグ・ライブラリの場所およびセキュリティ設定が含まれます。
例4-1に、JDeveloperによって最初に作成される初期web.xml
ファイルを示します。
例4-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/*
がデフォルトで使用されます。つまり、URLのhttp://localhost:8080/SRDemo/faces/index.jsp
が発行されると、JSFサーブレットがアクティブになり、faces
接頭辞を除いて/SRDemo/index.jsp
ファイルがロードされます。
JDeveloperでweb.xml
を編集するには、アプリケーション・ナビゲータでweb.xmlを右クリックし、ポップアップ・メニューから「プロパティ」を選択し、Webアプリケーション・デプロイメント・ディスクリプタ・エディタを開きます。構成要素名に精通している場合は、XMLエディタを使用してweb.xml
を変更することもできます。
JSFを使用する際にweb.xml
で使用できる構成要素の詳細は、A.8項「web.xml」を参照してください。
注意: ADFデータ・コントロールを使用してデータ・バインドされたWebページを構築すると、ADFバインディング・フィルタおよびアプリケーション・バインディング・コンテナ用のサーブレット・コンテキスト・パラメータがweb.xml に追加されます。詳細は、5.4項「ADFバインディング・フィルタの構成」を参照してください。 |
JSF構成ファイルには、JSFアプリケーションのリソース(カスタム・バリデータ、マネージドBeanなど)を登録し、ページ間のナビゲーション・ルールをすべて定義します。アプリケーションは任意の名前のJSF構成ファイルを保持できますが、通常そのファイル名はfaces-config.xml
です。例4-2に、JSFテクノロジを使用するプロジェクトの作成時に、JDeveloperによって最初に作成される初期faces-config.xml
ファイルを示します。
小規模なアプリケーションには、通常faces-config.xml
ファイルが1つあります。複数の構成ファイルの使用方法は、4.2.3項「複数のJSF構成ファイルについての考慮事項」を参照してください。
例4-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ナビゲーション・ルールの作成の詳細は、第9章「ページ・ナビゲーションの追加」を参照してください。
ナビゲーション・ルールではなく構成要素を作成または変更する場合は、JSF構成エディタの概要モードを使用してください。エディタ・ウィンドウの下部で、「概要」を選択します。
概要とダイアグラムのどちらのモードでも、faces-config.xml
ファイルは更新されます。
ヒント: JSFでは、単一のfaces-config.xml ファイルに複数の<application> 要素を含めることが可能です。JSF構成エディタでは、ファイルの1番目の<application> インスタンスしか編集できません。その他の<application> 要素については、XMLエディタを使用してファイルを直接編集する必要があります。 |
faces-config.xml
で使用できる構成要素の詳細は、A.10項「faces-config.xml」を参照してください。
注意: ADFデータ・コントロールを使用してデータ・バインドされたWebページを構築すると、5.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プロジェクトに依存性を設定する場合は、次の手順に従います。
JDeveloperでViewControllerプロジェクトについて依存性を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
に登録できるようにします。例4-3に、そのチェック・ボックスを選択した場合に、どのように複数のJSF構成ファイルがweb.xml
に設定されるかを示します。
この方法は、アプリケーションの領域ごとに別個の構成ファイルが必要な大規模なアプリケーションに適しています。
例4-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構成エディタのダイアグラム・モードで開かれている場合)。
4.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ナビゲーション・ダイアグラムにドラッグできます。 |
図4-3に、ウィザードのステップを完了してJSFページを追加した後のアプリケーション・ナビゲータでのViewControllerプロジェクトを示します。
図4-4に、ファイル・システムの<JDEV_HOME>/jdev/mywork
フォルダに作成された実際のフォルダを示します。
JSFナビゲーション・ダイアグラムを介してViewControllerプロジェクトに初めてJSFページを作成すると、次の処理が行われます。
adf-faces-impl.jar
が/WEB-INF/lib
に追加されます。
次のライブラリがViewControllerプロジェクト・プロパティに追加されます。
JSPタグ・ライブラリ: ADF Faces Components、ADF Faces HTML。表4-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タグ・ライブラリもインポートされます。例4-4に、JSF JSPドキュメントの初期ページを示します。
例4-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ナビゲーション・ダイアグラムおよびナビゲーション・ルールの作成の詳細は、第9章「ページ・ナビゲーションの追加」を参照してください。
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ライブラリ
表4-2に、ADF FacesのURIおよびデフォルトの接頭辞と、JDeveloperで使用されるJSFタグ・ライブラリを示します。
表4-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 Cacheの詳細は、第15章「キャッシングによるアプリケーション・パフォーマンスの最適化」を参照してください。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のデプロイ要件の詳細は、第22章「ADFアプリケーションのデプロイ」を参照してください。
SRDemoのほとんどのページでは、ADF FacesのpanelPage
コンポーネントを使用してページ全体をレイアウトしています。panelPage
コンポーネントを使用すると、アプリケーション内のすべてのWebページで一貫したルック・アンド・フィールを確保しながら、ブランド・イメージ、ナビゲーション・メニューとナビゲーション・ボタン、ページレベルまたはアプリケーションレベルのテキスト用の特殊な領域をページ上に定義できます。図4-5に、panelPage
コンポーネントを使用して作成されたページの例を示します。
ウィザードを使用してJSFページを新規作成すると、JSP/HTMLビジュアル・エディタに空白ページが自動的に開きます。ページを編集するために、使い慣れたJDeveloperのページ設計ツールを組み合せて使用できます。
構造ウィンドウ
JSP/HTMLビジュアル・エディタ
XMLソース・エディタ
プロパティ・インスペクタ
コンポーネント・パレット
設計ツールのいずれかでページを変更すると、その他のツールではその変更が自動的に反映されます。
同じJSFページ内で標準JSFコンポーネントとADF Facesコンポーネントの両方を使用できます。たとえば、JDeveloperによって作成された初期JSFページにpanelPage
コンポーネントを挿入して使用するには、次の手順に従います。
JSFページにUIコンポーネントを挿入するには、次のようにします。
初期JSFページをまだ開いていない場合は、アプリケーション・ナビゲータでダブルクリックしてビジュアル・エディタで開きます。
コンポーネント・パレットで、ドロップダウン・リストからADF Faces Coreを選択します。
PanelPageをパレットからビジュアル・エディタのページにドラッグ・アンド・ドロップします。
ビジュアル・エディタのページにコンポーネントをドラッグすると、構造ウィンドウではh:form
コンポーネントがボックスで囲まれて強調表示され、h:form
コンポーネントがターゲット・コンポーネントであることを示します。ターゲット・コンポーネントとは、ソース・コンポーネントがドロップされるときに挿入先となるコンポーネントです。
構造ウィンドウで、新規挿入されたaf:panelPageまたはPanelPage facetsのいずれかを右クリックし、「の前に挿入」メニュー、「の中に挿入」メニュー、「の後ろに挿入」メニューのいずれかを選択して、目的のUIコンポーネントを追加します。
入力フォームまたは検索フォーム、表、その他のページ・ボディ・コンテンツをpanelPage
コンポーネントの内部に作成します。panelPage
とそのファセットの詳細は、4.4.4項「PanelPageコンポーネントの使用方法」を参照してください。
ヒント: 構造ウィンドウのポップアップ・メニューを使用してコンポーネントを追加すると、必ず正しいターゲットの場所にコンポーネントが挿入されます。コンポーネント・パレットから構造ウィンドウにコンポーネントをドラッグすることもできます。構造ウィンドウにコンポーネントをドラッグすると、ターゲットの場所はボックスで囲まれるか、矢先が埋め込まれた実線で強調表示され、ソース・コンポーネントがドロップされるときにそのターゲットの場所が挿入先となることを示します。構造ウィンドウを使用したコンポーネントの挿入の詳細は、4.4.3.1項「構造ウィンドウでの編集」を参照してください。 |
挿入されたコンポーネントの属性を編集するには、構造ウィンドウでコンポーネントをダブルクリックしてプロパティ・エディタを開くか、コンポーネントを選択してプロパティ・インスペクタを使用します。
コンポーネントを挿入してページ・レイアウトを構築する場合に、データ・コントロール・パレットを使用してデータ・バインドされたUIコンポーネントを挿入することもできます。データ・コントロール・パレットからアイテムをドラッグして、ページ上の目的の場所にドロップするだけです。データ・コントロール・パレットの使用方法は、第5章「ページでのデータの表示」を参照してください。
図4-6に、ページに初めてADF Facesコンポーネントを追加した後のアプリケーション・ナビゲータでのViewControllerプロジェクトを示します。
JSFページに初めてADF Facesコンポーネントを追加すると、次の処理が自動的に行われます。
ADF Facs CoreおよびADF Facs HTMLのタグ・ライブラリ(まだ挿入されていない場合)がページにインポートされます。例4-4を参照してください。
html
タグ、head
タグ、body
タグがそれぞれafh:html
、afh:head
、afh:body
で置換されます。例4-5を参照してください。
ADF FacesフィルタおよびADF Facesマッピングの構成設定がweb.xml
に追加されます。4.4.2.1項「web.xmlファイルの追加情報」を参照してください。
デフォルトのADF Facesレンダー・キットの構成設定がfaces-config.xml
に追加されます。4.4.2.2項「faces-config.xmlファイルの追加情報」を参照してください。
初期adf-faces-config.xml
がViewControllerプロジェクトの/WEB-INF
に作成されます。4.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アプリケーション」を選択した後、「除外」タブを使用して除外するフォルダを追加します。 |
例4-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リソース・サーブレットのシンボリック名にマップします。
例4-6に、初めてADF Facesコンポーネントを追加した後のweb.xml
ファイルを示します。
例4-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.8.1項「web.xmlファイルでサポートされるタスク」を参照してください。
ヒント: アプリケーションで複数のフィルタを使用する場合、実行する順番でweb.xml に記載されている必要があります。実行時には、ファイル内に記載された順番でフィルタがコールされます。 |
すでに述べたように、JSFテクノロジを使用するプロジェクトを新規作成すると、空のfaces-config.xml
ファイルが1つ自動的に作成されます。JSFページに初めてADF Facesコンポーネントを挿入すると、例4-7に示すように、ADFコンポーネント用のデフォルトのレンダー・キットがfaces-config.xml
に自動的に挿入されます。
例4-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
ディレクトリに自動的に作成されます。例4-8に、初期adf-faces-config.xml
ファイルを示します。
例4-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
を変更する必要があります。詳細は、14.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.11項「adf-faces-config.xml」を参照してください。 |
通常、次の情報をadf-faces-config.xml
で構成します。
ページ・アクセシビリティ・サポートのレベル(4.6項「ADF Facesのベスト・プラクティス」を参照)
スキン・ファミリ(14.3項「スキンの使用によるルック・アンド・フィールの変更」を参照)
拡張デバッグ出力(A.11.1.3項「拡張デバッグ出力の構成」を参照)
Oracle Help for the Web(OHW)のURL(A.11.1.11項「ヘルプ・サイトURLの構成」を参照)
また、ファイル・アップロード用のカスタム・ファイル・アップロード・プロセッサを登録できます。詳細は、11.6.5項「カスタムのアップロード・ファイル・プロセッサの構成」を参照してください。
adf-faces-config.xml
ファイルで要素を構成すると、プログラム的に、またはJSF EL式を使用してプロパティ値を取得できます。詳細は、A.11.1.12項「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
タグの詳細は、14.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の詳細は、11.4項「部分ページ・レンダリングの有効化」を参照してください。
af:document
タグは、HTMLページの標準ルート要素、すなわちhtml
、head
およびbody
を生成するため、afh:html
、afh:head
およびafh:body
のかわりにaf:document
を使用できます。
ADF Facesコンポーネントの使用方法に関するヒントは、4.6項「ADF Facesのベスト・プラクティス」を参照してください。
構造ウィンドウでは、要素の挿入、コピー、移動の際に、ターゲット要素に関連して、ページについて表示される構造で挿入ポイントを選択します。JDeveloperには、ターゲット要素の前、後あるいは内部に含まれる挿入ポイントの場所を示す視覚的な合図があります。
要素を挿入ポイントにドラッグする場合は、次のいずれかを実行します。
要素をターゲット要素の前に挿入するには、ターゲット要素の上方にドラッグし、上向きの矢先が埋め込まれた横線が表示されたらマウス・ボタンを離します。
要素をターゲット要素の後に挿入するには、ターゲット要素の下方にドラッグし、下向きの矢先が埋め込まれた横線が表示されたらマウス・ボタンを離します。
要素をターゲット要素の内部に挿入または含めるには、ターゲット要素の上にドラッグし、ターゲット要素がボックスで囲まれたらマウス・ボタンを離します。挿入する要素をターゲット要素に含めることができない場合、その要素はターゲット要素の後に挿入されます。
ヒント: ドラッグ・カーソルが丸に斜線のマークに変化した場合は、許可されない挿入ポイントを示します。 |
SRDemoのほとんどのページでは、af:messages
を使用してエラー・メッセージを表示しています。データ・コントロール・パレットを使用してデータ・バインドされたページを作成すると、ADF Facesによってaf:messages
タグがページ上部に自動的に挿入されます。実行時にエラーがあると、ADF Facesによってメッセージがカラーでオフセットされたメッセージ・ボックスに自動的に表示されます。エラー・メッセージの詳細は、12.7項「エラー・メッセージの表示」を参照してください。
メッセージ・ボックスでのエラーのレポートに加えて、致命的エラー(スタック・トレースなど)を書式設定された形式で表示するために汎用のJSFエラー処理ページを使用できます。汎用のエラー処理ページを使用する場合、<error-page>
要素をweb.xml
で使用してエラー・ページの例外タイプを指定するか(例4-9を参照)、JSPページ・ディレクティブを使用してエラー・ページを指定します(例4-10を参照)。
例4-9 web.xmlファイルでのerror-pageおよびexception-typeの構成
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/faces/infrastructure/SRError.jspx</location> </error-page>
例4-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レイアウト・コンポーネントとして使用しています。このコンポーネントを使用すると、図4-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を使用したメニュー構造の作成方法は、11.2項「動的なナビゲーション・メニューの使用」を参照してください。
階層的なメニューのレイアウトに加えて、panelPage
コンポーネントでは、図4-7および図4-8に示すように、ページレベルおよびアプリケーションレベルのテキスト、イメージ、アクション・ボタンを特殊な領域でレイアウトするために、その他のファセットを使用できます。
ファセットまたはpanelPage
自体に子コンポーネントを挿入する方法は、4.4.1項「JSFページにUIコンポーネントを追加する方法」を参照してください。
図4-7に、ブランド・イメージ、グローバル・ボタン、メニュー・タブ、メニュー・バー、メニュー・リストおよびアプリケーションレベルのテキストをレイアウトするためのpanelPage
のファセット(番号1〜12)を示します。
表4-3に、(図4-7で番号が付けられた)panelPage
のファセットと、その内部で使用できる推奨される子コンポーネントを示します。JDeveloperの構造ウィンドウでファセットを右クリックすると、使用できる推奨コンポーネントがあれば「の中に挿入」ポップアップ・メニューに表示されます。
表4-3 ブランド・イメージ、ナビゲーション・メニューおよびアプリケーションレベルのテキスト用のPanelPageのファセット
番号 | ファセット | 説明 |
---|---|---|
1 |
|
企業のロゴまたは組織のブランド用。 |
2 |
|
アプリケーションのロゴまたは製品のブランド用。 |
3 |
|
通常、 |
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
検索領域用。 |
10 |
|
アプリケーションの詳細へのリンク用。 |
11 |
|
著作権のテキスト用。outputTextを使用します。テキストは、 |
12 |
|
アプリケーションのプライバシ・ポリシーの記述へのリンク用。 |
図4-8に、ページレベルのアクションおよびテキストをレイアウトするためのpanelPage
のファセット(番号1〜7)を示します。
表4-4に、(図4-8で番号が付けられた)panelPage
のファセットと、その内部で使用できる推奨される子コンポーネントを示します。
表4-4 ページレベルのアクションおよび情報テキスト用のPanelPageのファセット
番号 | ファセット | 説明 |
---|---|---|
1 |
|
ページ・コンテンツに対して機能するページレベルのアクション用。通常、 |
2 |
|
コンテキスト・スイッチャを使用すると、コンテキストに基づいてページのコンテンツを変更できます。たとえば、部門の会社資産を表示している際に、コンテキスト・スイッチャを使用して別の部門の資産に切り替えることができます。すべてのページが選択したコンテキストに変ります。通常、 |
3 |
|
当面のタスクを補助するページレベルの情報用。通常、 |
4 |
|
「Xに戻る」リンク用。 |
5 |
|
当面のタスクに関するページレベルのステータス情報用。重要な注釈を示すためにも使用できます。重要な注釈とは、ページ・コンテンツ内で使用されるアイコン、要素または用語を定義するために使用される説明文です。通常、 |
6 |
|
その他の追加情報用。通常、 |
7 |
|
ユーザーのログイン情報および接続情報の表示用。通常、 |
ヒント: panelPage と同様、page コンポーネントを使用すると、特殊なコンテンツ領域があるページ全体をレイアウトできます。panelPage とは異なり、page のvalue をメニュー・モデル・オブジェクトにバインドして、ページの階層的なメニューを作成できます。個々のメニュー・コンポーネントをメニュー・モデル・オブジェクトにバインドする必要はありません。 |
panelPage
のファセットを設定したら、panelPage
コンポーネントの内部にフォーム、表およびその他のページ・ボディ・コンテンツを作成します。ADF Facesのパネル・コンポーネント(など)を使用すると、ページ上のコンテンツを簡単に編成できます。表4-5に従って、用途に適したコンポーネントを決定してください。
各コンポーネントに設定できるコンポーネントの属性の詳細は、JDeveloperのオンライン・ヘルプを参照してください。各コンポーネントが表すもののイメージは、次のURLでADF Faces Coreタグのドキュメントを参照してください。
表4-5 レイアウトおよびパネルのADF Facesコンポーネント
用途 | 使用するコンポーネント |
---|---|
フォーム入力コンポーネントを1列以上に整列させる。ラベルは右寄せ、フィールドは左寄せ。 |
|
コンポーネントを水平に整列させる。必要に応じて水平または垂直の位置合せを指定する。 |
|
コンポーネントを横1列または縦1列に続けて整列させる。必要に応じて折り返す。 |
|
1列以上の箇条書きリストを作成する。 |
|
ラベル、ヒントおよびメッセージを使用して、1つ以上のコンポーネントをレイアウトする。 |
複数の 入力コンポーネントをレイアウトする場合は、入力コンポーネントの |
カラーでオフセットされたコンテナの中にコンポーネントを配置する。 |
通常、 |
ファセットを使用して事前に定義された場所にコンポーネントを配置する。 |
|
一連のボタンをレイアウトする。 |
|
追加のページレベルまたはセクションレベルのヒントをユーザーに表示する。 |
|
ヘッダーを使用してページ・セクションおよびサブセクションを作成する。 |
|
長いページのセクションにクイック・リンクを追加する。 |
|
コンポーネント・グループの表示(公開)/非表示(非公開)を切り替えることができるようにする。 |
|
同時にコンテンツ・グループを選択および表示できるようにする。 |
ShowOneコンポーネントには、 |
|
JSFでは、バッキングBeanとは、主にUIロジックの提供と、アプリケーションのWeb層とビジネス層の間のデータ管理に使用される(データ転送オブジェクトに似た)JavaBeansです。通常、バッキングBeanはJSFページごとに1つあります。バッキングBeanには、ページで使用されるUIコンポーネントに対するロジックとプロパティが含まれます。たとえば、一部のユーザー・アクティビティの結果としてUIコンポーネントをプログラムで変更する、またはADF宣言アクション・メッソドの前または後でコードを実行するには、必要なコードをページのバッキング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間に厳密な関係を定義するには、4.5.3項「JSFページでのバッキングBeanの使用方法」を参照してください。 |
「クラスが存在しない場合は生成」チェック・ボックスを選択すると、「クラス」の値として設定された完全修飾クラス名を使用して、Javaクラスが新規作成されます。新しいファイルは、図4-9に示すように、アプリケーション・ナビゲータのViewControllerプロジェクトのApplication Sourcesノード内に表示されます。
バッキングBeanクラスを編集するには、アプリケーション・ナビゲータでファイル(SRDemopage.javaなど)をダブルクリックしてソース・エディタで開きます。新しいクラスの場合は、例4-11のようなコードが表示されます。
例4-11 JDeveloperによって作成される空のJavaクラス
package oracle.srdemo.view.backing; public class SRDemopage { public SRDemopage() { } }
faces-config.xml
には、例4-12に示すように、<managed-bean>
要素を使用してバッキングBeanの構成が追加されます。
例4-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バインディング・コンテナをインジェクトできます。これを実現する方法は、4.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です。たとえば、UIコンポーネントがbinding
属性を通じてバッキングBeanのプロパティにバインドされている場合、検証およびイベント処理のロジックをバッキング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の管理プロパティを構成する際に、例4-13に示すように、プロパティ名、クラス・タイプ、デフォルト値を宣言します。
例4-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>
例4-13のrate
プロパティは、EL式#{tax.rate}
を使用してBeanがインスタンス化されると、値5(Floatに変換)で初期化されます。
マネージドBeanとマネージドBeanのプロパティは、BeanまたはプロパティのタイプがListまたはMapであるか、java.util.Map
またはjava.util.List
を実装することを指定すると、リストまたはマップとして初期化できます。リストまたはマップ内の値のデフォルト・タイプは、java.lang.String
です。
例4-14に、ListであるマネージドBeanの例を示します。
例4-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コンポーネントを作成する場合、多くの処理が自動的に実行されます。詳細は、5.2.3項「データ・コントロール・パレットの使用時に行われる処理」を参照してください。データ・バインドされたUIコンポーネントでは、#{bindings.ProductName.inputValue}
などのADFデータ・バインディングのEL式を使用して、ページのバインディング・コンテナ内の関連バインディング・オブジェクトを参照します(bindings
は現在のページのADFバインディング・コンテナへの参照です)。
ADFデータ・バインディングを使用するページのバッキングBeanでは、必要に応じてバインディング・コンテナのバインディング・オブジェクトを参照できます。ADFバインディング・コンテナを参照する目的で、JSF値バインディングを#{bindings}
EL式に解決し、その結果をoracle.binding.BindingContainer
インタフェースにキャストできます。または、簡単な方法として、バッキングBeanが実行時にADFバインディング・コンテナでプログラム的に動作するように、同じ#{bindings}
EL式を参照するbindings
という名前の管理プロパティをfaces-config.xml
の適切なページのマネージドBean構成に追加できます。例4-15に、SRMainページのbacking_SRMain
マネージドBeanのbindings
管理プロパティを示します。
例4-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メソッドを追加します。例4-16に、bindings
の関連コードを格納するSRMain.java
の一部を示します。
例4-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バインディングのプロパティの詳細は、5.6項「ADFデータ・バインディングEL式の作成」を参照してください。
JSFバッキングBeanがADFモデル・レイヤーとどのように連携して機能するかの概要は、第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
に設定する必要があります。
JDeveloperの埋込みOC4Jにおけるテストおよびデバッグの場合、ADF Facesは埋込みOC4Jを自動的に検出し、ファイル変更チェックが有効に設定された状態で稼働するため、このパラメータをtrue
に明示的に設定する必要はありません。
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
に設定され、対応するアクション(値の変更など)が実行されると、入力コンポーネントは、自身を含むフォームを部分ページ送信によって自動的に送信します。したがって、ページ全体を再描画する必要なしにページの一部を更新できます。これは、部分ページ・レンダリングとして知られています。部分ページ・レンダリングの使用方法は、11.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のデプロイメントのベスト・プラクティスは、第22章「ADFアプリケーションのデプロイ」を参照してください。
ADF Facesキャッシュ・タグ・ライブラリを使用してコンテンツをキャッシュすることによって、スループットを増やし、レスポンス時間を短縮します。キャッシングにより、Webページの全部または一部がそれ以降のレスポンスで使用するためにメモリーに格納されます。クライアント・リクエストへのレスポンス時間は、それ以降のリクエストに対して、コンテンツを作成するコードを実行せずに、キャッシュされたコンテンツを再利用することで、著しく短縮されます。詳細は、第15章「キャッシングによるアプリケーション・パフォーマンスの最適化」を参照してください。