Teeda Extension featuring Goya 〜内部設計【ScopeとTakeOver】〜
要件定義→外部設計→(アーキテクチャ)→内部設計→コーディング→単体テスト→結合テスト
今回は、Teeda独自のスコープおよびTakeOverについて、説明します。これらは、画面遷移時のプロパティ値の引き継ぎに深く関わっています。
Teedaにおけるプロパティの引き継ぎ
前提ですが、Teedaでは、画面遷移の前後で同一プロパティがある場合に、値を引き継ぎます。
入力画面に「ユーザ名」(userName)とあり、入力確認画面にも「ユーザ名」(userName)とあると、入力した値が確認画面に表示される、ということになります。
ただし、上記は、ボタン押下で遷移したときの処理です。ボタンのidで、「doXxx」「jumpXxx」と指定しておくと、押下した際に画面遷移と共に、プロパティ値が引き継がれます。
Teedaにおけるスコープ
Webアプリケーションの場合、通常、application/session/requestのスコープを利用しますが、Teedaは、独自のアプリケーションスコープを持っています*1
以下のスコープによって、プロパティのライフサイクルが変化します。
サブアプリケーションスコープ(SubapplicationScope)
- 同一のサブアプリケーション内ならば、プロパティを引き継ぐ。異なるサブアプリケーションに遷移した場合は、プロパティ値は削除される。
リダイレクトスコープ(RedirectScope)
- 次の画面にリダイレクト後、プロパティ値は削除される。つまり、次の画面までしか値を引き継がない。
ページスコープ(PageScope)
- 次の画面に値を引き継がない。
実装は、以下のようにします。
@SubapplicationScope private String userName;
ここで、サブアプリケーションについて、少し詳しく説明します。サブアプリケーションとは、同じディレクトリ上に存在するHTMLの集合を指します。
-
- 同じサブアプリケーション
- /view/add/addInput.html
- /view//addResult.html
- 同じサブアプリケーション
-
- 異なるサブアプリケーション
- /view/hello/hollo.html
- /view/add/addInput.html
- 異なるサブアプリケーション
設計時には、あるデータに対するCRUDの処理を行う画面群になるでしょう。私の場合、ユースケース、もしくはメニューの単位で考えるようにしています。
TakeOver
プロパティ毎に個別に引き継ぎ設定をする場合に利用します。スコープでは制御しきれない、特定の画面間の遷移時に利用します。
値を引き継ぎたくない場合
@TakeOver(type=TakeOverType.NEVER)
値を引き継ぎたい場合(引き継ぐプロパティを指定)
以下のようにPageで指定する(Actionがある場合はActionに指定)と、userId, userName のみ、次画面に引き継ぎます。
@TakeOver(type=TakeOverType.INCLUDE, properties="userId, userName")
値を引き継ぎたい場合(引き継ぎたくないプロパティを指定)
以下のようにPageで指定する(Actionがある場合はActionに指定)と、userId, userName 以外のプロパティを、次画面に引き継ぎます。
@TakeOver(type=TakeOverType.EXCLUDE, properties="userId, userName")
実装に近い内容になっていますが、内部設計で、HTMLモックやCURDマトリクスを活用しながら、決定しておくと良いでしょう。
んー、でも疑問が湧いてきました。
2007/04/16 追記
- デフォルトスコープは、SubApplicationになるようです。
- スコープは、フィールドのみのようです。
*1:DIの機能を利用して、application/session/requestのスコープを利用することも可能です。