業務でTeeda(Java系のコンポーネントベースのフレームワーク)を使うことになりまして、タイトルの件で少し詰まったので、今後のための覚え書きです。
やりたいこと
前画面から引き継いだ特定の変数の値をdo~() メソッドによる処理時、その後の自画面遷移時のinitialize処理でも保持させる(使用できるようにする)。
環境
- Java:バージョン1.8.0
- フレームワーク:Teeda
- OS:Windows10
Teedaの仕様
公式サイトより、関連のありそうなTeedaの仕様は以下の通り。
ページスコープ
- ポストバック (自画面表示) や ポストバック (リダイレクト) ~ リダイレクト表示 で同じページを表示している間維持されるスコープ
- 初期表示 や リダイレクト表示 で開始され、他のページがリクエストされると破棄されて、 新しいページスコープが開始される
注意点
- 初期表示で現在と同じページが表示される場合はページスコープは維持されず、新しいページスコープが開始される
- ポストバック (リダイレクト) で現在と同じページが表示される場合はページスコープは維持される
※詳細は以下を参照
ページスコープ | Seasar > Teeda
TakeOverアノテーション
- ライフサイクルメソッドに指定することで、遷移先画面に引き継ぐプロパティを指定できるアノテーション
- 種類は以下の3種類
- INCLUDE:properties属性で指定したプロパティだけを遷移先画面へ引き継ぐ
- EXCLUDE:properties属性で指定したプロパティ以外を遷移先画面へ引き継ぐ
- NEVER:全てのプロパティを遷移先画面へ引き継がない
※詳細は以下を参照
TakeOverアノテーション | Seasar > Teeda
試したこととその結果
パターン1:@pagescope × @TakeOver
- 引き継ぎたい変数に@pagescopeをつける
- do~() メソッドに@TakeOver(INCLUDE)をつける
@pagescope
String foo;
// 省略
@TakeOver(type = TakeOverType.INCLUDE, properties = "foo")
public Class<?> doBar(){
updateFuga(foo);
return FooPage.class;
}
結果
- doBarメソッドでは変数fooの値は引き継がれる
- doBarメソッドで処理→自画面遷移時のinitialize処理では変数fooの値は引き継がれない
なぜ、こうなったか?
TakeOverアノテーションにより遷移先画面に指定したプロパティが引き継がれたが、@pagescopeにより、自画面遷移のinitialize時に新しいページスコープがはじまってそれまでの値は破棄されたため、こうなったと考えられる。
パターン2:@TakeOverのみ
- do~() メソッドのみに@TakeOver(INCLUDE)をつける
String foo;
// 省略
@TakeOver(type = TakeOverType.INCLUDE, properties = "foo")
public Class<?> doBar(){
updateFuga(foo);
return FooPage.class;
}
結果
- do~() メソッド、処理後の自画面遷移時のinitialize処理ともに前画面での変数fooの値は引き継がれない(両方null)
なぜ、こうなったか?
ページスコープを用いていないため、前画面から引き継いだ変数はポストバック時に保持されておらず、自画面遷移時に渡す変数の値がnullのため、こうなったと考えられる。
パターン3:@TakeOver × hidden
- 処理→自画面遷移メソッドに@TakeOver(INCLUDE)をつける
- 対応するページにhiddenで引き継ぎたい変数を埋め込む
String foo;
// 省略
@TakeOver(type = TakeOverType.INCLUDE, properties = "foo")
public Class<?> doBar(){
updateFuga(foo);
return FooPage.class;
}
<form>
<input type = "submit" id = "doBar">Bar</input>
<input type = "hidden" name = "foo">
</form>
結果
- doBarメソッド、処理後の自画面遷移時のinitialize処理ともに前画面からの変数fooの値は引き継がれる。
なぜ、こうなったか?
前画面からの変数fooの値がhiddenによってdo~() メソッド実行時まで保持され、さらにTakeoverアノテーションによって自画面遷移時にも保持された、と考えられる。
試したこととその結果まとめ
上の3つのパターンと結果を表にまとめると以下の通り。
前画面から引き継いだ特定の変数の値をdo~() メソッドによる処理時、その後の自画面遷移時のinitialize処理でも保持させるには、
対象の変数をhtmlにhiddenで書いておき、@TakeoverでINCLUDEして引き継ぎ対象とすればOK!!(パターン3)
要素 \ パターン | 1 | 2 | 3 |
---|---|---|---|
@pagescope | ○ | - | - |
@Takeover | ○ | ○ | ○ |
hidden | - | - | ○ |
結果 | |||
メソッド内での保持 | ○ | × | ○ |
自画面遷移時のinitializeでの保持 | × | × | ○ |