このチュートリアルでは、ナビゲーション、カプセル化、再利用、マネージドBeanライフ・サイクル、およびトランザクションをアプリケーション内で有効化するOracle ADFタスク・フローの作成方法を説明します。チュートリアルには、タスク・フロー・ダイアグラムの作成、アクティビティおよび制御フローの追加、完成したタスク・フローの実行に必要な基本的なステップが含まれます。
ここでは、さまざまなコンポーネントが含まれる2つのバインド・タスク・フローを作成します。移動先を決定するルーター、データを表示するビュー、フローを終了させるリターンを使用して、検索機能と更新機能をサポートできるタスク・フローを設計します。ビュー・コンポーネントをデータ・コントロールとバインドし、入力されたパスワードを処理するマネージドBeanを定義します。パスワードを確認して、アプリケーションへのログインを許可するルーター用のルールを定義します。JSFページを作成し、JSFページ内のリージョンとしてタスク・フローをバインドし、ユーザー名に使用するパラメータ値を作成します。
JDeveloperで作業する場合、アプリケーション内のプロジェクトとして作業を整理します。JDeveloperには、アプリケーションおよびプロジェクトの作成に利用できるいくつかのテンプレートが提供されています。テンプレートは、さまざまな種類のアプリケーションを開発するうえで必要となる基本的なテクノロジーに基づいて事前設定されており、ニーズに適したテンプレートを選択することで作業環境を構築できます。その後で、設定を行って、使用する予定のその他のテクノロジーを追加できます。
最初の項では、Fusionテクノロジーを使用して新規アプリケーションを作成し、データベースにアクセスする再利用可能なビジネス・コンポーネントを作成します。アプリケーションおよびモデル・コンポーネントを作成するには、以下のステップを実行します。
-
アプリケーション・ナビゲータで、「New Application」をクリックします。または、メニュー・オプションの「File」→「New」を選択して、新規アプリケーションを作成します。
-
New Galleryで、「General」→「Applications」カテゴリを選択し、「ADF Fusion Web Application」オプションを選択します。このオプションを選択すると、データ・バインドされたOracle ADF Webアプリケーションが作成されます。アプリケーションは2つのプロジェクトで構成されます。1つはデータ・モデル(Oracle ADF Business Components)用で、もう1つはビュー・コントローラ・コンポーネント(Oracle ADF FacesおよびOracle ADFタスク・フロー)用です。
「OK」をクリックします。 -
Create ADF Fusion Web Applicationダイアログ・ボックスで、Application NameをTaskFlowと指定します。新しいアプリケーション名を入力すると、それに合わせてディレクトリが変更されます。他の場所にファイルを作成したい場合は、パスのC:\JDeveloper\myworkの部分を変更できます。
Application Package Prefixフィールドの値をdemoに設定します。他の値はデフォルト値のままにして、「Finish」をクリックします。
ウィザード内のその他のページを見ると、Modelパッケージ名とViewControllerパッケージ名にプリフィックスとして"demo"が付けられることが分かります。
Overviewペインに、Fusion Web Application開発の手引きとして参照できるChecklistが表示されます。
Fusion Webアプリケーションを作成するときは、Checklistがデフォルトで表示されます。
-
アプリケーション・ナビゲータに2つの新しいプロジェクトが表示されます。デフォルトのネーミング規則により、プロジェクトの1つはModel、もう1つはViewControllerという名前になります。
-
CheckList Overviewを使用してモデル・コンポーネントの作成を開始します。「Connect to a Database」ステップをクリックします。
Initialize Business Components Projectダイアログを使用して、このデータ・モデル・プロジェクトのビジネス・コンポーネントを操作するときに使用する設計時アプリケーション・リソース接続を選択します。または、既存のIDEレベルの接続をコピーして、新しいアプリケーション・リソース接続を作成します。
このダイアログは、最初のビジネス・コンポーネントを作成する前に表示されます。また、SQL文を作成するときにビュー・オブジェクトによって使用されるSQLフレーバをグローバルに制御するときにも使用します。Oracleデータベース接続用のデフォルトは常にOracle SQLフレーバですが、他に、OLite(Oracle Liteデータベース用)、SQLServer(Microsoft SQL Serverデータベース用)、DB2(IBM DB2データベース用)、およびSQL92(サポート対象となっているSQL92準拠のその他のデータベース用)のSQLフレーバを選択できます。データ・モデル・プロジェクトを初期化した後は、Project Propertiesダイアログを使用してSQLフレーバを変更することはできませんが、adf-config.xmlファイルの概要エディタでSQLフレーバをオーバーライドできます。adf-config.xmlファイルにデータベース・タイプを指定すると、実際のデータベース・タイプが必要となるSQL文を実行時に生成できます。
-
ステップが開き、このタスクの実行に必要な前提条件などの役立つ情報が表示されます。「Create a Database Connection」ボタンをクリックします。
-
作成する新規接続のプロパティを次のように指定します。
データベースの正しいホスト、ポートおよびSIDが参照されるように、Oracle JDBC Settingsを適切に入力します。「Test Connection」ボタンをクリックして、成功したことを確認します。
確認したら、「OK」ボタンをクリックします。プロパティ 値 Connection Name HRConn Username hr Password hr
-
Checklistペインで、Connect to a Databaseステップのステータスを「Done」に設定します。
-
データベース・ノードを閉じ、「Build Business Services」ステップをクリックして開きます。次に、「Go to Sub steps」ボタンをクリックします。
-
サブタスク・リストで「Create Entity Objects and Associations」サブタスクをクリックします。
次に、「Create Entity Objects and Associations」ボタンをクリックします。
エンティティ・オブジェクトは、指定されたデータソースの行を表すとともに、関連付けられた属性の変更を制御するOracle ADF Business Componentsコンポーネントです。
重要なのは、ドメイン・ビジネス・ロジックをカプセル化して、ビジネス・ポリシーおよびビジネス・ルールが一貫して検証されることを保証できる点です。エンティティ・オブジェクトは、データ検証を実施するための宣言的なビジネス・ロジック機能を多数サポートします。通常は、宣言的な検証を補完するカスタム・アプリケーション・ロジックおよびビジネス・ルールを追加し、各エンティティ・オブジェクトに最大限のドメイン・ビジネス・ロジックを明確にカプセル化します。一連のエンティティ・オブジェクトを関連付けると、複数のアプリケーションで利用できる再利用可能なビジネス・ドメイン・レイヤーが構成されます。ほとんどの場合、1つのエンティティは1つのデータベース表にマッピングされます。
-
Select Project for Actionダイアログで「Model」プロジェクトを選択します。
「OK」をクリックします。 -
Initialize Business Components ProjectダイアログでHRConn接続を選択します。「OK」をクリックします。
-
Create Business Components from TablesウィザードのEntity Objectsページで「Query」ボタンをクリックし、データ・ディクショナリを調べて利用可能な表を表示します。
-
Availableリストから「EMPLOYEES」表を選択し、右矢印「」をクリックしてSelectedリストに移動します。この手順により、選択する表に基づいて、更新可能なエンティティ・オブジェクトが作成されます。
「Next」をクリックして続行します。 -
Entity-based View Objectsダイアログで、Employees(HR.EMPLOYEES)をSelectedリストに移動します。このステップにより、以前に作成したエンティティ・オブジェクトで問合せを実行するための適合するビュー・オブジェクトが作成されます。
名前がEmployeesView(Employees)に変更される点に注意してください。VO名と作成元の参照EOが表示されます。
「Next」をクリックして続行します。 -
Read Only View Objectsダイアログでは、「Next」をクリックして続行します。
ビュー・オブジェクトは、SQL問合せをカプセル化して問合せ結果の操作を簡素化するOracle Application Development Framework(Oracle ADF)コンポーネントです。
Oracle ADF Business Componentsプロジェクトで作成できるビュー・オブジェクトには、次の種類があります。
読取り専用ビュー・オブジェクト:最新の状態にする必要がない場合に使用(エンティティ・ベースでも可)
- エンティティ・ベース・ビュー・オブジェクト:データの更新が行われる場合に使用
- 静的データ・ビュー・オブジェクト:ビュー・オブジェクト自体で定義されたデータに使用
- プログラムで移入されるビュー・オブジェクト
1つ以上の既存のエンティティ・オブジェクトの属性に属性がマッピングされるビュー・オブジェクトを作成する場合は、更新可能な行がサポートされるようにエンティティ・ベース・ビュー・オブジェクトを構成できます。マッピングされたエンティティ・オブジェクトは、ビュー・オブジェクト定義で使用されるエンティティとして保存されます。こうすると、エンティティ・ベース・ビュー・オブジェクトとエンティティ・オブジェクトが自動的に連携され、データ・モデルは全面的に更新可能になります。エンティティ・ベース・ビュー・オブジェクトはクライアント対応のタスクに必要なデータだけを問い合わせ、マッピングされたエンティティ・オブジェクトを頼りに、ビューの行に対して行われた変更を自動的に検証して保存します。読取り専用ビュー・オブジェクトと同様に、エンティティ・ベース・ビュー・オブジェクトでもSQL問合せがカプセル化されるため、マスター/ディテール階層にリンクさせることができます。また、アプリケーション・モジュールのデータ・モデルで使用できます。 -
Application Moduleダイアログで、「Finish」をクリックして、Modelプロジェクトのビジネス・コンポーネントを作成します。
アプリケーション・モジュールは、エンドユーザーのタスクに関連する論理的な作業単位で使用されるビジネス・サービス・メソッドとUI認識型データ・モデルをカプセル化するOracle ADF Business Componentsコンポーネントです。
アプリケーション・モジュールは、対象のユースケースに必要な再利用可能なビュー・オブジェクトのインスタンスを含む"作業単位"のコンテナであり、ユースケースで表示または変更される情報が保持されている再利用可能なビジネス・ドメイン・レイヤーの、基盤となるエンティティ・オブジェクトにメタデータ経由で関係付けられています。
-
Checklistで、Create Entity Objects and Associationsステップのステータスを「Done」に設定します。「Close Step 3」ボタンをクリックします。
注:ステップ3.2、3.3および3.4も完了しているため、これらのステップのステータスもDoneに設定できますが、これらは上のレベルで設定します。 -
Build Business Servicesステップのステータスを「Done」に設定します。
-
モデル・プロジェクトでの作業が実行されます。Modelプロジェクトを展開すると、アプリケーション・ナビゲータは次のように表示されます。
-
JDeveloperメニュー・バーの「」Save Allアイコンをクリックするか、メニューから「File」→「Save All」を選択します。
次は、ViewControllerプロジェクトに関する作業を実行します。
TaskFlowアプリケーションをJDeveloperにロードしたら、ビューとリターンを含むバインド・タスク・フロー・ダイアグラムを作成します。次のステップを実行します。
-
アプリケーション・ナビゲータで「ViewController」ノードを右クリックし、コンテキスト・メニューから「New」→「From Gallery」を選択します。
Oracle ADFバインド・タスク・フローは、アプリケーションの再利用可能な部分をカプセル化するときに使用します。
バインド・タスク・フローは次の点でJavaメソッドに類似しています。
- 単一のエントリ・ポイントがある
- 入力パラメータを受け入れられる
- 戻り値を生成できる
- アクティビティおよび制御フロー・ルールの独自のコレクションがある
- 独自のメモリ・スコープおよびマネージドBeanの存続期間(ページ・フロー・スコープ・インスタンス)がある
Oracle ADFバインド・タスク・フローは、専用の一連のプライベート制御フロー・ルール、アクティビティ、およびマネージドBeanで構成されます。コール元は、バインド・タスク・フロー境界内のページ名、メソッド・コール、子バインド・タスク・フロー、マネージドBean、制御フロー・ルールなどの内部知識を必要としません。入力パラメータをバインド・タスク・フローに渡すことができ、バインド・タスク・フローの終了時に出力パラメータを返すこともできます。データ・コントロールはタスク・フロー間で共有できます。
-
New Galleryで、「Web Tier」→「JSF/Facelets」ノードを開き、「ADF Task Flow」を選択します。
-
Create Task Flowダイアログで、ファイル名としてemp-update-flowと入力します。次のチェック・ボックスを選択します。
「OK」をクリックします。プロパティ 値 Create as Bounded Task Flow チェックを入れる Create with Page Fragments チェックを入れる Create Train チェックを入れる -
空の新規タスク・フロー・ダイアグラムが表示され、アプリケーション・ナビゲータに新しいエントリが作成されます。
-
コンポーネント・パレットで「」Viewコンポーネントを選択し、ダイアグラム上にドラッグ・アンド・ドロップします。
もっとも重要なタスク・フロー・アクティビティ・タイプはビューです。JSFページまたはページ・フラグメントはビューで表示されます。
ページ・フラグメントは、別のJSFページのコンテンツとしてレンダリングされるJSF JSPドキュメントです。ページ・フラグメントは通常バインド・タスク・フローで使用されます。バインド・タスク・フローはリージョンとしてページに追加できます。こうすると、タスク・フローの再利用が可能になり、それぞれ固有のフローを含む複数の領域をページに含めることが可能になります。
ビュー・アクティビティは物理JSFページまたはページ・フラグメントを使用してメタデータで関連付けられます。ビュー・アクティビティはID属性で識別されます。ページまたはページ・フラグメントの名前は、タスク・フロー・メタデータ内の<page>要素で識別されます。ビュー・アクティビティIDとページ名は同じでなくても構いません。
-
デフォルト名をintroに変更します。
-
ダイアグラム上のintroビューの隣に、新規の「」ビューを作成します。
このビューの名前をsearchに変更します。 -
ダイアグラム上に3つ目の「」ビューを作成します。
ビュー名をUpdateに変更します。ダイアグラムは下のイメージのようになります。
3つのビューのそれぞれの間に点線が表示されます。トレインを含むタスク・フローを作成したため、すべてのビューの間に暗黙的なフローが存在します。 -
すべての変更を保存します。
アプリケーションを1つの大きなJSFページ・フローとして表現する代わりに、再利用可能な複数のタスク・フローに分割できます。各タスク・フローには、アプリケーションのナビゲーション・グラフの一部が含まれます。タスク・フロー内のノードはアクティビティです。ページを表示する、アプリケーション・ロジックを実行する、別のタスク・フローをコールするというような簡単な1つの論理的操作が、1つのアクティビティ・ノードで表されます。アクティビティ間のトランザクションは制御フロー・ケースと呼ばれます。
Oracle ADFタスク・フローには次の2種類があります。
- バインドなしのタスク・フロー:ユーザーがタスクを完了できるように対話する一連のアクティビティ、制御フロー・ルールおよびマネージドBeanです。バインドなしのタスク・フローは、バインド・タスク・フローに含まれない、アプリケーション内のすべてのアクティビティおよび制御フローで構成されます。
- バインド・タスク・フロー:特殊な形式のタスク・フローであり、バインドなしのタスク・フローとは対照的に、単一のエントリ・ポイントとゼロ以上のエグジット・ポイント(出口点)があります。このタスク・フロー専用の一連のプライベート制御フロー・ルール、アクティビティおよびマネージドBeanが含まれます。Oracle ADFバインド・タスク・フローでは、再利用、パラメータ、トランザクション管理、再開が可能です。
introページは、このタスク・フローのエントリ・ポイントです。ここからは、ページ内にトレインを作成する方法を説明します。次のステップを実行します。
-
emp-update-flowダイアグラムでintroビュー・コンポーネントをダブルクリックしてページを作成します。
Create New ADF Page Fragmentダイアログで「OK」をクリックし、デフォルト値を受け入れます。
-
ページ設計ペインが開きます。コンポーネント・パレットのADF Faces General Controls - Locationグループから「」Trainコンポーネントを選択し、ページ設計ペイン上にドロップします。
トレインは関連するアクティビティの進行状況を表すもので、エンドユーザーがタスクを完了するときのガイドとなります。
エンドユーザーが一連のトレイン・ストップをクリックすると、各ストップから特定のページにリンクされます。
オプションのTrain Button Barコンポーネントにはボタンが含まれており、これを追加すると、ストップを介して前後にナビゲートできる付加的な手段を提供できます。このコンポーネントをトレイン・コンポーネントと併用すると、トレイン・ストップ間の移動方法を複数提供できます。
1つのバインド・タスク・フローには1つのトレインのみ指定できます。バインド・タスク・フローに複数のトレインを論理的に含める場合は、独立したバインド・タスク・フローにそれぞれのトレインを追加する必要があります。
Bind Trainダイアログで、デフォルト値のまま「OK」をクリックします。
-
「」Train Button Barコンポーネントを選択し、Trainコンポーネントの下にドロップします。
Bind trainButtonBarダイアログで、デフォルト値のまま「OK」をクリックします。
-
コンポーネント・パレットのADF Faces Text and Selectionグループから「」Output Textコンポーネントを選択し、Train Button Barの下にドロップします。
プロパティ・インスペクタがまだ開いていない場合は、「View」→「Property Inspector」の順に選択するか[Ctrl] + [Shift] + [I]キーを同時に押して開き、ValueフィールドにWelcome to the Employee updaterと入力します。
ページは次のように表示されます。
-
すべての作業内容を保存し、「emp-update-flow」タブをクリックしてタスク・フロー・ダイアグラムを再表示します。
-
「search」ビュー・コンポーネントをダブルクリックして、検索ページを作成します。
-
Create New ADF Page Fragmentダイアログで、デフォルト値のまま「OK」をクリックします。
-
ページ設計ペインが開きます。コンポーネント・パレットのADF Faces General Controlsグループから「」Trainコンポーネントを選択し、ページ設計ペイン上にドロップします。
Bind Trainダイアログで、デフォルト値のまま「OK」をクリックします。
-
「」Train Button Barコンポーネントを選択し、Trainコンポーネントの下にドロップします。
Bind trainButtonBarダイアログで、デフォルト値のまま「OK」をクリックします。
-
すべての作業内容を保存し、「emp-update-flow」タブをクリックしてタスク・フロー・ダイアグラムを再表示します。
-
「update」ビュー・コンポーネントをダブルクリックして、更新ページを作成します。
-
Create New JSF Page Fragmentダイアログで、デフォルト値のまま「OK」をクリックします。
-
ページ設計ペインが開きます。コンポーネント・パレットのADF Faces General Controlsグループから「」Trainコンポーネントを選択し、ページ設計ペイン上にドロップします。
Bind Trainダイアログで、デフォルト値のまま「OK」をクリックします。
Bind Trainダイアログで、デフォルト値のまま「OK」をクリックします。
-
「」Train Button Barコンポーネントを選択し、Trainコンポーネントの下にドロップします。
Bind trainButtonBarダイアログで、デフォルト値のまま「OK」をクリックします。
-
「」Save Allアイコンをクリックして、アプリケーションを保存します。
検索ページと更新ページは、データ・コントロール・コンポーネントとバインドする必要があります。検索ページでは任意の列を条件にして従業員を問い合わせ、更新ページでは従業員の給与を表示および更新します。これらの操作を実行できるようにするために、次のステップを実行します。
-
「search」タブをクリックして、ページを再表示します。
-
アプリケーション・ナビゲータでData Controlsアコーディオンを開き、「AppModuleDataControl」→「EmployeesView1」→「Named Criteria」の順に開いて「All Queriable Attributes」をページ上にドラッグ・アンド・ドロップします。
データ・コントロールは基本的に、ソースから取得したデータをOracle ADF Fusion Web Applicationのユーザー・インタフェースで使用できるように橋渡しをするものです。
デフォルトでは、すべてのビジネス・コンポーネントについて、ビュー・オブジェクトに含まれるすべての属性の問合せに必要なデータ・コントロールが作成されます。このデータ・コントロールをページ上にドロップすると、出力コンポーネントとしてデータを表示できるページが作成されます。
データ・コントロールに含まれるオブジェクトを使用して、データ・バインドされたユーザー・インタフェース・コンポーネントを作成できます。よく使用されるデータ・コントロールのタイプのごく一部を次に示します。
ADF Business Components:このタイプのデータ・コントロールは、Oracle ADF Business Componentsアプリケーションにアプリケーション・モジュールを作成するときに、JDeveloperにより生成されます。
JavaBean:このタイプのデータ・コントロールは、POJO(Plain Old Java Object)からデータの構造を取得します。
EJB:EJBデータ・コントロールは基本的にJavaBeanデータ・コントロールと同じですが、EJBアーキテクチャに固有の機能を使用してデータの構造を取得する点が異なります。
Webサービス:Webサービス・データ・コントロールはWebサービスのWSDLからデータの構造を取得します。
ポップアップ・メニューから「Create」→「Quick Query」の順に選択し、「ADF Quick Query with Table」オプションを選択します。
クイック問合せ検索フォームは、単一の検索で十分な場合、またはこれを起点に詳細な問合せ検索に発展させる場合に使用します。
問合せ検索フォームもクイック問合せ検索フォームもOracle ADF Facesコンポーネントです。クイック問合せ検索フォームには1つの検索条件フィールドがあり、そのフィールドには、関連付けられたデータ・コレクションから使用できる検索可能属性のドロップダウン・リストが付いています。通常は、関連付けられているビュー・オブジェクトのすべての属性が検索可能な属性です。
Edit AttributeダイアログのControl Hintsページで、属性のDisplay HintプロパティをHideに設定すれば、その属性を除外できます。ユーザーは、選択された属性に対して検索することも、表示されたすべての属性に対して検索することもできます。検索条件フィールドのタイプは、対応する属性のタイプに自動的に合わされます。フォームにアドバンスト・リンクを組み込むと、クイック問合せからアドバンスト・モードの問合せ検索フォームへの切替えを制御するマネージドBeanを作成できます。
-
Edit Table Columnsダイアログで、「Single Row」オプションと「Enable Sorting」オプションを選択します。
「OK」をクリックします。 -
ページは次のように表示されます。
-
すべての作業内容を保存し、「update」タブをクリックしてページを開きます。
-
Data Controlsペインで「AppModuleDataControl」→「EmployeesView1」の順に選択し、更新ページへドラッグ・アンド・ドロップします。
-
ポップアップ・メニューから「Create」を選択し、「ADF Form」オプションを選択します。
Data Controlsパネルからオブジェクトをフォームとしてドロップしても、1つの属性をドロップしたときと同じ処理が行われます。ただし、
複数の属性バインディングおよび関連するUIコンポーネントが作成されます。UIコンポーネントの属性(値など)は、その属性のバインディング・オブジェクトのプロパティ(inputValueなど)または対応するビジネス・オブジェクトに設定されたコントロール・ヒントの値にバインドされます。
属性またはオブジェクトをJSFページにドラッグし、UIコンポーネントとしてドロップすると、ページ定義ファイルなどがそのページに作成されます(まだ存在しない場合)。イテレータおよび属性のバインディングが作成され、ページ定義ファイルに追加されます。また、UIコンポーネントに必須のJSPXページ・コードがJSFページに追加されます。
-
Edit Form Fieldsで、最後の3行(CommissionPct、ManagerID、DepartmentId)を選択し、「」Deleteボタンをクリックしてこれらを除外します。「Include Submit Button」オプションを選択し、「OK」をクリックします。
-
コンポーネント・パレットで「」Buttonアイコンを選択し、Submitボタンの隣にドラッグ・アンド・ドロップします。
-
プロパティ・インスペクタで、ボタンのTextフィールドにCancelと入力します。
-
ページは次のように表示されます。
-
「」Save Allアイコンをクリックして、アプリケーションを保存します。
トランザクションは、リターン・アクティビティを使用するか操作アクションにバインドされたボタンを使用して、終了させることができます。可能な場合はタスク・フロー・リターン・アクティビティを使用します。タスク・フロー・リターン・アクティビティを使用すると、Oracle ADFタスク・フローのビューで使用されたすべてのデータがコミットされます。また、アプリケーションでコミットおよびロールバックが行われる場所が分かりやすくなるため、メンテナンスが容易になります。トランザクション・コントロール用のリターン・アクティビティを実装するには、次のステップを実行します。
-
「emp-update-flow」タブをクリックして、タスク・フロー・ダイアグラムを再表示します。
-
「Overview」タブをクリックしてから「Behavior」タブを選択します。
-
Transactionグループで、リストから「Always Begin New Transaction」プロパティを設定します。
トランザクションは、グループとしてまとめてコミットまたはロールバックできる、永続化された作業のコレクションです。
バインド・タスク・フローは、トランザクションを表現したり宣言的にトランザクション境界を管理したりするときに使用できます。たとえば、顧客登録や従業員登録のタスク・フローは、タスク・フロー・リターン・アクティビティを使用して実装します。Cancelボタンでタスク・フローにロールバックを実装し、コミット機能にはSaveボタンを使用します。
こうすると、個々の従業員の更新は、粒度が単一行のトランザクションと見なされます。
-
ダイアグラムに戻り、「」Task Flow Returnコンポーネントを選択し、updateビューの下にドロップします。
コンポーネントの名前をcommitに変更します。
-
再度、「」Task Flow Returnコンポーネントを選択し、updateビューの下にドロップします。コンポーネントの名前をrollbackに変更します。
-
コンポーネント・パレットから「」Control Flow Caseコンポーネントを選択し、「update」ビューをクリックして「commit」リターンへドラッグ・アンド・ドロップします。
コンポーネントの名前をcommitに変更します。
-
コンポーネント・パレットから「」Control Flow Caseコンポーネントを選択し、「update」ビューをクリックして「rollback」リターンへドラッグ・アンド・ドロップします。続いて、コンポーネントの名前をrollbackに変更します。
-
タスク・フロー・ダイアグラムは次のように表示されます。
-
「commit」リターン・コンポーネントを選択し、プロパティ・インスペクタのBehaviorタブで、End Transactionフィールドの値リストから「commit」を選択します。
-
「rollback」リターンを選択して同じ操作を繰り返し、End Transactionのリストから「rollback」を選択します。
-
「」Save Allアイコンをクリックして、アプリケーションを保存します。
-
「update」タブをクリックして更新ページの設計ビューを開き、「Submit」ボタンを選択します。
プロパティ・インスペクタのActionフィールドで、リストから「commit」を選択します。
-
「Cancel」ボタンを選択します。
プロパティ・インスペクタのActionフィールドで、リストから「rollback」を選択します。
-
「」Save Allアイコンをクリックして、アプリケーションを保存します。
アプリケーションへは、ログイン・プロセスを経由しなければアクセスできないようにする必要があります。ログイン・ページ、ルーター、エラー・ページ、および以前に作成したタスク・フローを作成します。このタスク・フローを作成するには、以下のステップを実行します。
たとえば、JDeveloperでは、Fusion Web Applicationテンプレートを使用してFusion Webアプリケーションを作成すると、バインドなしの空のタスク・フローがデフォルトで作成されます(ソース・ファイル名adfc-config.xml)。Fusion Webアプリケーションの実行時には、そのバインドなしのタスク・フローに追加したアクティビティからバインド・タスク・フローをコールできます。
下に示すとおり、アプリケーションで最初に実行されるアクティビティは、ほとんどの場合、バインドなしのOracle ADFタスク・フローに含まれるビュー・アクティビティです。ビュー・アクティビティは、アプリケーションの一部として表示されるJSFページを表します。このアクティビティはHomeビュー・アクティビティから開始され、バインド・タスク・フローが次にコールされます。calltoLogin_taskFlowアクティビティでは、ユーザーがアプリケーションへログインできるようにするバインド・タスク・フローがコールされます。
Oracle ADFのバインドなしのフロー内にすべてのアプリケーション・アクティビティが存在するアプリケーションも設計できます。そのようなアプリケーションはStrutsまたはJSFアプリケーションを模倣しますが、Oracle ADFバインド・タスク・フロー機能は利用しません。タスク・フロー機能を十分に活用するには、Oracle ADFバインド・タスク・フローを使用します。
-
アプリケーション・ナビゲータで「ViewController」ノードを右クリックし、コンテキスト・メニューから「New」→「From Gallery」を選択します。
-
New Galleryで、「Web Tier」→「JSF」ノードをクリックし、「ADF Task Flow」を選択します。「OK」をクリックします。
-
Create Task Flowダイアログで、ファイル名としてsecurity-flowと入力します。「Create as Bounded Task Flow」を選択して、「Create with Page Fragments」チェック・ボックスを選択します。
「OK」をクリックします。 -
空の新規タスク・フロー・ダイアグラムが表示され、アプリケーション・ナビゲータに新しいエントリが作成されます。
-
コンポーネント・パレットで「」Viewコンポーネントを選択し、ダイアグラム上にドラッグ・アンド・ドロップします。
ビュー名をloginに変更します。
-
「」Routerコンポーネントを選択してloginビューの隣にドロップします。
ルーター・アクティビティを使用すると、EL式に指定されたロジックに基づいて、アクティビティのルーティングを宣言的に制御できます。
制御フローごとに異なるルーター・ケースを対応させることができます。各ルーター・ケースには次の要素が含まれ、制御の次のルーティング先となるアクティビティはこれらの要素を使用して選択されます。trueに評価された最初の式を使用して、対応する結果を決定します。
expression:trueまたはfalseのいずれかに評価されるEL式。例:#{(pageFlowScope.welcomeUserRegistrationBean.userSelection eq 'Customer')}
outcome:EL式がtrueに評価される場合にルーター・アクティビティから返される値。例:newCustomer制御フロー・ケース上でルーターのoutcomeがfrom-outcomeと一致する場合は、制御フロー・ケースが指すアクティビティに制御が渡されます。
ルーター・アクティビティのケースがいずれもtrueに評価されない場合、またはケースが指定されていない場合は、ルーターのデフォルトのoutcomeフィールドに指定されているoutcomeが使用されます(指定されている場合)。
-
アプリケーション・ナビゲータから「emp-update-flow」を選択し、routerの下のダイアグラムにドラッグ・アンド・ドロップします。
-
コンポーネント・パレットで「」Viewアイコンを選択し、ダイアグラム上にドラッグ・アンド・ドロップします。
ビューの名前をerrorに変更します。
-
「」Control Flow Caseアイコンを選択し、「login」ビューをクリックして、フローをrouterへドラッグ・アンド・ドロップします。
-
前の操作を繰り返して、routerからerrorビューへ「」Control Flow Caseを引きます。
フローの名前をbadに変更します。
-
前の操作を繰り返して、routerからemp-update-flow ビューへ「」Control Flow Caseを引きます。
名前をgoodに変更します。 -
前の操作を繰り返して、errorからloginビューへ「」Control Flow Caseを引きます。
フロー名をloginに変更します。ダイアグラムは次のように表示されます。 -
2つ目のタスク・フローが完成します。「」Save Allアイコンをクリックして、アプリケーションを保存します。
パスワード・フィールドのあるログイン・ページを作成し、パスワード値用のバッキングBeanを作成します。これにより、ルーターはパスワードに応じてerrorページまたはemp-updateフローに制御を移します。ページを作成してルーター・ルールを実装するには、以下のステップを実行します。
-
ダイアグラムで「login」ビュー・アイコンをダブルクリックし、ページを作成します。Create New ADF Page Fragmentで、デフォルト値のまま「OK」をクリックします。
-
コンポーネント・パレットから「Input Text」アイコンをドラッグし、loginページにドロップします。
Labelとしてpasswordを入力します。
-
AdvancedタブのBindingフィールドで、ドロップダウン・リストから「Edit」を選択します。
Edit Propertyダイアログで「New」ボタンをクリックして、パスワード値を保持するマネージドBeanを作成します。この機能を実行するBeanがすでに存在する場合は、そのBeanを選択して、既存のメソッドを選択するか、新しいメソッドを作成します。
マネージドBeanは、さまざまな構成ファイルを使用してアプリケーションに登録するJavaクラスです。
JSFアプリケーションが起動すると、これらの構成ファイルが解析され、その中にリストされているBeanが使用可能になります。EL式内でマネージドBeanを参照できるため、Beanのプロパティおよびメソッドにアクセスできます。マネージドBeanが初めて参照されたときにBeanがまだ存在しなかった場合は、マネージドBean作成機能がそのBeanのデフォルトのコンストラクタ・メソッドを呼び出してBeanをインスタンス化します。プロパティが宣言されている場合は、それらに宣言済みのデフォルト値が設定されます。
マネージドBeanは、UIレンダリングに関連するロジックを格納する場合にのみ使用します。アプリケーション・データおよび処理はすべて、アプリケーションのビジネス・レイヤーのロジックで処理する必要があります。データ関連のロジックはJavaクラスではなくPL/SQLを使用してデータベースに格納しますが、これと同様に、Oracle Fusion Webアプリケーションでは通常、ビジネス関連のロジックは中間層に格納します。このようにすると、このロジックをビジネス・サービス・メソッドとして公開できるため、Oracle ADF Modelレイヤーでアクセスできるようになり、データ・バインディングに使用できます。
Create Managed Beanダイアログに次の値を入力します。
プロパティ 値 Bean Name backing_login Class Name backing_login Package backing Extends java.lang.Object Scope request Generate Class If It Does Not Exist (チェックを入れる)
「OK」をクリックします。
-
Edit Propertiesに戻り、Propertyフィールドの横にある「New」ボタンをクリックします。
Create Propertyダイアログで、Property Nameとしてpasswordを入力します。
-
プロパティ・インスペクタには、Advancedノードの入力テキスト・コンポーネントが次のように表示されます。
実際のパスワード・フィールドでは、入力されたパスワード値を非表示にするために、AdvancedノードのVisibleプロパティをfalseに設定します。 -
「」Buttonコンポーネントをパスワード・フィールドの下にドラッグ・アンド・ドロップします。
Textプロパティをloginに変更します。
-
ルーターを選択します。
-
ルーターのプロパティ・インスペクタで、Default Outcomeとしてドロップダウン・リストから「bad」を選択します。
-
Expressionフィールドで、リストから「Expression Builder」オプションを選択します。
「ADF Managed Beans」→「backing_login」→「password」の順にノードを開いて「value」変数を選択し、「'=='」オペランドを選択して'oracle'と入力します。
「OK」をクリックします。
この例では、パスワードのハード・コード値としてoracleをコーディングしてあります。
-
プロパティ・インスペクタに戻り、Outcomeとして「good」を選択します。こうして、入力されたパスワードがoracleと等しい場合は'good'フローを経由してemp-updateフローにナビゲートされ、等しくない場合はerrorページにナビゲートされるようにします。
-
次に、マネージド・プロパティ値を操作するパラメータを作成する必要があります。security-flowフロー・ダイアグラムで、「Overview」タブ→「Parameters」タブの順にクリックします。
コール先のOracle ADFバインド・タスク・フローでは、入力パラメータを受け取ることができ、終了時にはコール元に戻り値を渡すことができます。
バインド・タスク・フローに入力パラメータを渡すには、次の項目を1つ以上指定する必要があります。
- タスク・フロー・コール・アクティビティ上の入力パラメータ。コール元のタスク・フロー内でパラメータ値が格納される場所を指定します。
- コール先のバインド・タスク・フロー上の入力パラメータ定義。コール先のバインド・タスク・フローがパラメータ値を取得できる場所を指定します。
入力パラメータ値をコール先のバインド・タスク・フローにマッピングするために、各オプションに指定する入力パラメータの名前は同じにします。各パラメータ値は、コール元とコール先のタスク・フロー内で値が取得される場所のマッピングに対応します。入力パラメータに値を指定しなければ、値はデフォルトで#{pageFlowScope.parmname}(parmnameはパラメータ名)になります。
入力パラメータが必要かどうかは、コール先のバインド・タスク・フローの入力パラメータ定義で指定できます。必要な入力パラメータが取得されない場合はエラーが発生します(エラーには、設計時と実行時にフラグが付けられます)。必須ではないと識別された入力パラメータ定義は、タスク・フロー・コール・アクティビティの作成時に無視できます。デフォルトでは、すべてのオブジェクトが参照渡しされます。タスク・フロー・コール・アクティビティの入力パラメータを参照渡しできるのは、個々の値ではなくマネージドBeanオブジェクトを渡す場合のみです。デフォルトでは、プリミティブ・タイプ(int、long、booleanなど)は値渡しされます。
-
Input Parameter Definitionsの「」Addボタンをクリックします。
-
下の表の値をパラメータに設定し、すべての作業内容を保存します。
プロパティ 値 Name username Class java.lang.String Value (自動設定) Required true -
「login.jsff」タブをクリックしてページを開き、「Output Text」コンポーネントをpassword入力テキストの上にドラッグ・アンド・ドロップします。
-
プロパティ・インスペクタで、Valueフィールドのリストから「Expression Builder」を選択します。
JSFでは、ELと呼ばれる簡単な式言語を使用して、表示または変更する情報をバインドします。
たとえば、特定のユーザー名を参照する#{userInfoBean.principalName}のような式や、ユーザー名がSKINGであるかどうかを評価する#{userInfoBean.principalName eq 'SKING'}のような式を使用します。実行時には、それぞれの式の文字列値およびブール値が汎用の式エバリュエータから返されるため、コーディングをしなくても個々のオブジェクトおよびそれらのプロパティへのアクセスが自動化されます。
JSFの特定のUIコンポーネントの値は、実行時にvalue属性によって決定されます。コンポーネントには値として静的なテキストを指定できますが、通常はvalue属性にEL式のバインディングを含めます。これが実行時インフラストラクチャによって評価され、表示されるデータが決まります。たとえば、現在ログインしているユーザーの名前を表示するoutputTextコンポーネントは、value属性が#{userInfoBean.principalName}に設定されている可能性があります。 コンポーネントのどの属性にもEL式を使用して値を割り当てられるため、動的なデータ駆動型ユーザー・インタフェースを容易に構築できます。たとえば、レンダリングされたUIコンポーネント属性に#{userInfoBean.prinicpalName !=null}のようなブール値式を使用すれば、ユーザーがログインしていないときにはコンポーネントを非表示にすることができます。userInfoBeanの現在のインスタンスにプリンシパル名がない場合は、レンダリングされた属性がfalseに評価され、ページからコンポーネントの表示がなくなります。
-
Expression BuilderでExpressionフィールドに値が入っていないことを確認し、「ADF Managed Beans」→「pageFlowScope」の順に開き、「username」を選択します。
「OK」をクリックします。 -
「security-flow」タブをクリックしてタスク・フロー・ダイアグラムを開き、「error」ビューをダブルクリックしてページを作成します。
Create New ADF Page Fragmentダイアログで、デフォルト値のまま「OK」をクリックします。
-
コンポーネント・パレットから「」Output Textをドラッグし、ページ上にドロップします。
プロパティ・インスペクタで、ValueフィールドにError, wrong passwordと入力します。
-
Designで[Enter]を押して新しい行を追加し、「」Buttonコンポーネントをドラッグしてerrorテキストの下にドロップします。
プロパティ・インスペクタで、TextフィールドをRetryに変更し、Actionのリストから「login」を選択します。
-
「」Save Allアイコンをクリックして、アプリケーションを保存します。
このタスク・フローを使用するJSFページを作成するには、以下のステップを実行します。
-
アプリケーション・ナビゲータで「ViewController」ノードを右クリックし、コンテキスト・メニューから「New」→「From Gallery」を選択します。
-
New Galleryで、Categoriesから「Web Tier」→「JSF/Facelets」を選択し、Itemsから「Page」を選択します。
「OK」をクリックします。 -
Create JSF Pageダイアログで、File Nameにmasterと入力し、「Reference ADF Page Template」オプションにチェックを入れ、「Oracle Three Column Layout」を選択します。
「OK」をクリックします。 -
スクロールして、表示されたページをエディタで確認します。
-
コンポーネント・パレットから「」Output Textコンポーネントをドラッグし、startファセットにドロップします。
プロパティ・インスペクタで、ValueフィールドをWelcomeに変更します。
-
「ViewController」→「Web Content」→「WEB-INF」の順にノードを開き、「security-flow.xml」をドラッグしてFacet centerにドロップします。
メニューから「Region」を選択します。
JSFページまたはページ・フラグメント(.jsff)にバインド・タスク・フローをレンダリングするには、Oracle ADFリージョンを使用します。
Oracle ADFリージョンは次で構成されます。
- リージョンをレンダリングするページまたはページ・フラグメントに表示されるaf:regionタグ
- oracle.adf.view.rich.modelパッケージからRegionModelを実装するインスタンス・オブジェクト
- Oracle ADFリージョンで使用するバインド・タスク・フローを識別する、ページ定義内のタスク・フロー・バインディング
初めてレンダリングされるときのOracle ADFリージョンのコンテンツは、バインド・タスク・フロー内の最初のビュー・アクティビティのものです。バインド・タスク・フローで使用するビュー・アクティビティは、ページではなくページ・フラグメントに関連付ける必要があります。Oracle ADFリージョンへは、タスク・フロー・バインディングの入力パラメータまたはコンテキスト・イベントを使用して値を渡すことができます。また、タスク・フロー・バインディングを使用してバインド・タスク・フローからOracle ADFリージョンへ渡す入力パラメータは、タスク・フロー・バインディングのparametersMapプロパティの構成で決定できます。
Oracle ADFリージョンのアクティブ化やリフレッシュのタイミングも、リージョンの構成で決定できます。また、Oracle ADFリージョンおよびバインド・タスク・フローを構成することで、バインド・タスク・フロー内でナビゲーション・コントロールを停止させ、Oracle ADFリージョンを含むページにコントロールを渡すこともできます。さらには、動的リージョン(Oracle ADF動的リージョン)も作成できます。これは、リージョンにレンダリングするバインド・タスク・フローを、実行時にタスク・フロー・バインディングによって決定するものです。動的リージョンを作成して動的リージョン・リンクを構成すると、実行時にOracle ADF動的リージョンにレンダリングされるバインド・タスク・フローをエンドユーザーが変更できるようになります。
Edit Task Flow Bindingで、Valueフィールドに#{'Scott'}と入力します。
-
現在のマスター・ページは次のように表示されます。
-
「」Save Allアイコンをクリックして、アプリケーションを保存します。
これで、タスク・フローはリージョンとしてマスター・ページに統合され、実行できる状態になりました。次のステップを実行します。
-
masterページのエディタで右クリックし、コンテキスト・メニューから「Run」を選択します。
welcome -
ブラウザにページがロードされ、username変数(Scott)が表示され、パスワードの入力待ち状態になります。
-
誤ったパスワード値(oracle以外の値)を入力してみます。
次に「login」ボタンをクリックします。ルーターによってerrorページにナビゲートされます。 -
「Retry」ボタンをクリックして正しいパスワードでログインします。
-
loginページに戻り、パスワード値としてoracleを入力します。
次に、「login」をクリックします。
-
トレインが表示された新しいページが開きます。
-
新しいページで、「Next」ボタンまたはトレインの2つ目のボタンをクリックします。
-
トレインの2つ目のステップ(検索ページ)で「LastName」を選択します。
検索フィールドにA%と入力し、Aで始まる従業員名をすべて取得します。
「search」ボタンをクリックします。 -
返されたリストで任意の従業員を1人選択し、「Next」ボタンをクリックします。
新しい条件の入力準備が整うまでは、Searchパネルは閉じていても構いません。
-
選択した従業員のEditページでSalaryを任意の値に変更し、「Submit」をクリックします。
-
自動的にloginページに戻ります。
-
JDeveloperに切り替えてDatabase Navigatorを開きます(表示されていない場合は、「Window」→「Database」→「Databases」の順に選択します)。
-
「TaskFlow」→「HRConn」→「Tables」の順にノードを開き、「Employees」表をダブルクリックして開きます。
-
「Data」タブをクリックして従業員の値を表示します。
「LAST_Name」列を選択し、コンテキスト・メニューから「Sort」を選択します。
-
Filterフィールドを使用するか、Sort操作を使用すると、求めている従業員の情報をさらに簡単に取得できます。「Sort」ボタンをクリックし、Sort ColumnsダイアログでLAST_NAMEをSelected Columnsペインに移動します。
「OK」をクリックします。 -
Salaryを更新した従業員を検索し、新しい値で更新がコミットされていることを確認します。
-
この最後のプロセスを繰り返して、Cancel(ロールバック)アクションをテストしても構いません。
これで、このチュートリアルは完了です。
- モデル・コンポーネントの作成
- バインド・タスク・フロー・ダイアグラムの作成
- タスク・フロー・ページの構築
- タスク・フロー・ページへのデータ・コントロールのバインド
- タスク・フローへのトランザクション・コントロールの設定
- 2つ目のタスク・フローの定義
- タスク・フロー・コンポーネントとルーター・ルールの定義
- JSFページの作成とリージョンとしてのタスク・フローのページへのバインド
- Developing Fusion Web Applications with Oracle Application Development Framework
- Creating ADF Task Flows
- Developing Applications with Oracle JDeveloper