読者です 読者をやめる 読者になる 読者になる

Teeda Extension featuring Goya 〜内部設計【ScopeとTakeOver】〜

Seasar2 Teeda

要件定義外部設計(アーキテクチャ)内部設計コーディング単体テスト結合テスト


今回は、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マトリクスを活用しながら、決定しておくと良いでしょう。




んー、でも疑問が湧いてきました。

  1. Teedaのデフォルトのスコープは、RedirectScope?それとも別物?別物だとしたら、それは何て呼ぶのでしょう?
  2. スコープは、クラスに対してアノテーションを指定することも可能?

2007/04/16 追記

  1. デフォルトスコープは、SubApplicationになるようです。
  2. スコープは、フィールドのみのようです。

*1:DIの機能を利用して、application/session/requestのスコープを利用することも可能です。