フォーム処理のタスクフロー
フォームデータを処理する際、ウィザードターゲットオブジェクトに対して複数のタスクが実行される場合がよくあります。これらは基本的に、以下のシーケンスに従って実行されます。
1. 前処理
この段階では、データベース操作のセットアップが行われます。次に例を示します。
◦ オブジェクト作成ウィザードの場合、フォームデータの値からオブジェクトのインスタンスが作成され、オブジェクトの属性が設定されます。
◦ オブジェクト編集ウィザードの場合、フォームデータの値に基づいてオブジェクトがデータベースから取得され、オブジェクトの属性が修正されます。
2. データベーストランザクションブロックの開始
3. データベース操作の実行。次に例を示します。
◦ オブジェクト作成ウィザードの場合、オブジェクトはデータベースに保存されます。
◦ オブジェクト編集ウィザードの場合、オブジェクトはデータベース内で更新されます。
4. 後処理
主要なデータベース操作を終了した後、同じトランザクションブロックを開始する前に実行しなければならないデータベースタスクやその他のタスクを行い、これらのタスクが失敗した場合にデータベース操作がロールバックされるようにします。通常、以下のタスクでは、ターゲットオブジェクトを事前に永続化しておく必要があります。次に例を示します。
◦ オブジェクトを別のコンテナと共有する
◦ オブジェクトをワークフローに送信する
5. データベーストランザクションブロックの終了
6. トランザクションの後処理
タスク失敗時にデータベーストランザクション全体がロールバックされないように、トランザクションブロックを終了した後に実行しなければならないタスクを行います。次に例を示します。
◦ オブジェクトのチェックアウト
必要に応じ、この段階で追加のデータベース操作を実行できます。
各処理段階のタスクは、ObjectFormProcessors および ObjectFormProcessorDelegates によって実行されます。ウィザードには、DefaultObjectFormProcessor を拡張する ObjectFormProcessor が必要です。これがウィザードに適したタスクを制御し処理するためのプライマリクラスとなります。
ウィザードには、1 つまたは複数の
ObjectFormProcessorDelegates を任意で持ちます。これは、
ObjectFormProcessor によって (
DefaultObjectFormProcessor を経由して) 呼び出され、サブタスクの処理を実行します。
ObjectFormProcessorDelegates では、
DefaultObjectFormProcessorDelegate クラスを拡張してください。
ObjectFormProcessorDelegates の詳細については、
ウィザードに必要な ObjectFormProcessorDelegate クラスの作成を参照してください。
ObjectFormProcessor クラスと ObjectFormProcessorDelegate クラスには、各処理フェーズの中でタスクを実行するための preProcess()、doOperation()、postProcess()、および postTransactionProcess() メソッドがあります。すべてのウィザードにすべてのフェーズのタスクが配置されるわけではありません。したがって、デフォルトクラスである DefaultObjectFormProcessor および DefaultObjectFormProcessorDelegate からこれらのメソッドを拡張する場合、すべてのプロセッサおよび委任にこれらの全メソッドを実装する必要はありません。親クラスがデフォルトで各メソッドを実装します。ObjectFormProcessor にこれらのいずれかのメソッドを実装する場合、ObjectFormProcessorDelegates の呼び出しを処理する、DefaultObjectFormProcessor の super() メソッドが呼び出されます。
HTML フォームデータは、ObjectBeans のリストとして ObjectFormProcessors と ObjectFormProcessorDelegates に渡されます。ObjectBean には、1 つのターゲットオブジェクトに固有のデータと、すべてのターゲットオブジェクトに共通のデータが格納されています。1 つのターゲットオブジェクトが含まれたウィザードの場合、このリストには 1 つの ObjectBean だけが格納されます。複数のターゲットオブジェクトが含まれたウィザードの場合、このリストには、ターゲットオブジェクトごとに 1 つの ObjectBean が含まれています。これらの ObjectBeans は、オブジェクト間の関係とそれらの処理の順序を表すツリー構造に編成できます。ObjectBeans の作成は、FormProcessorController によって処理されます。
また FormProcessorController は、データトランザクションの開始/終了やロールバック (必要に応じて)、および ObjectFormProcessors の呼び出しも処理します。後者について、DefaultFormProcessorController は、ProcessorBeans というオブジェクトを使用します。親オブジェクト、タイプ、ObjectFormProcessorDelegates が同じであるターゲットオブジェクトは同じ ProcessorBean に配置されます。
各 ProcessorBean には、その中の ObjectBeans に ObjectFormProcessor と ObjectFormProcessorDelegates の独自のインスタンスが格納されます。ProcessorBeans は、オブジェクトの処理順序を制御するツリー構造に編成することができます (1 つのターゲットオブジェクトが含まれたウィザードには 1 つの ProcessorBean しか配置されません)。
DefaultFormProcessorController のタスクフローは以下のとおりです。
1. ルート ProcessorBean について ObjectFormProcessor の preProcess() メソッドを呼び出し、ProcessorBean を使用してこのメソッドに ObjectBeans を渡します。さらに、ルート ProcessorBean の子について、子リストに現れる順序でこのプロセッサの preProcess() メソッドを呼び出します。次に、子の子について preProcess() メソッドを呼び出します。
2. Transaction.start() を実行します。
3. ルート ProcessorBean とその子について、preProcess() と同じ方法で ObjectFormProcessor の doOperation() メソッドを呼び出します。
4. ルート ProcessorBean とその子について、preProcess() と同じ方法で ObjectFormProcessor の postProcess() メソッドを呼び出します。
5. ステップ 1 ~ 4 が成功した場合は、Transaction.commit() を実行します。
6. ルート ProcessorBean とその子について、preProcess() と同じ方法で ObjectFormProcessor の postTransactionProcess() メソッドを呼び出します。
あるメソッドによって FormProcessingStatus.FAILURE というステータスが返された場合、コントローラは、HTML レスポンスページに必要な情報を設定できるように、失敗した ObjectFormProcessor の setResultNextAction() メソッドを呼び出します。
|
トランザクションのネスティングは推奨されていないので、ステップ 3 またはステップ 4 で追加トランザクションブロックを ObjectFormProcessors で開いてコミットすることはしないでください。
|