0
1

More than 3 years have passed since last update.

【Teeda】do~() メソッド→自画面遷移時のinitialize処理で変数の値を保持させる

Last updated at Posted at 2019-12-28

業務でTeeda(Java系のコンポーネントベースのフレームワーク)を使うことになりまして、タイトルの件で少し詰まったので、今後のための覚え書きです。

やりたいこと

前画面から引き継いだ特定の変数の値をdo~() メソッドによる処理時、その後の自画面遷移時のinitialize処理でも保持させる(使用できるようにする)。

image.png

環境

  • 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)をつける
FooPage.java
@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時に新しいページスコープがはじまってそれまでの値は破棄されたため、こうなったと考えられる。

image.png

パターン2:@￰TakeOverのみ

  • do~() メソッドのみに@￰TakeOver(INCLUDE)をつける
FooPage.java

String foo;

// 省略

@TakeOver(type = TakeOverType.INCLUDE, properties = "foo")
public Class<?> doBar(){
    updateFuga(foo);
    return FooPage.class;
}

結果

  • do~() メソッド、処理後の自画面遷移時のinitialize処理ともに前画面での変数fooの値は引き継がれない(両方null)

なぜ、こうなったか?

ページスコープを用いていないため、前画面から引き継いだ変数はポストバック時に保持されておらず、自画面遷移時に渡す変数の値がnullのため、こうなったと考えられる。

image.png

パターン3:@￰TakeOver × hidden

  • 処理→自画面遷移メソッドに@￰TakeOver(INCLUDE)をつける
  • 対応するページにhiddenで引き継ぎたい変数を埋め込む
FooPage.java

String foo;

// 省略

@TakeOver(type = TakeOverType.INCLUDE, properties = "foo")
public Class<?> doBar(){
    updateFuga(foo);
    return FooPage.class;
}

foo.html
<form>
    <input type = "submit" id = "doBar">Bar</input>
    <input type = "hidden" name = "foo">
</form>

結果

  • doBarメソッド、処理後の自画面遷移時のinitialize処理ともに前画面からの変数fooの値は引き継がれる。

なぜ、こうなったか?

前画面からの変数fooの値がhiddenによってdo~() メソッド実行時まで保持され、さらにTakeoverアノテーションによって自画面遷移時にも保持された、と考えられる。
image.png

試したこととその結果まとめ

上の3つのパターンと結果を表にまとめると以下の通り。
前画面から引き継いだ特定の変数の値をdo~() メソッドによる処理時、その後の自画面遷移時のinitialize処理でも保持させるには、
対象の変数をhtmlにhiddenで書いておき、@￰TakeoverでINCLUDEして引き継ぎ対象とすればOK!!(パターン3)

要素 \ パターン 1 2 3
@￰pagescope - -
@￰Takeover
hidden - -
結果
メソッド内での保持 ×
自画面遷移時のinitializeでの保持 × ×

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1