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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/817c95e6-e15f-1f7e-fc7c-7331bfc8c1c9.png)


## 環境
* Java：バージョン1.8.0
* フレームワーク：Teeda
* OS：Windows10

## Teedaの仕様
公式サイトより、関連のありそうなTeedaの仕様は以下の通り。
### ページスコープ
* ポストバック (自画面表示) や ポストバック (リダイレクト) ～ リダイレクト表示 で同じページを表示している間維持されるスコープ
* 初期表示 や リダイレクト表示 で開始され、他のページがリクエストされると破棄されて、 新しいページスコープが開始される

#### 注意点
* 初期表示で現在と同じページが表示される場合はページスコープは維持されず、新しいページスコープが開始される
* ポストバック (リダイレクト) で現在と同じページが表示される場合はページスコープは維持される

※詳細は以下を参照
[ページスコープ | Seasar > Teeda](http://teeda.seasar.org/ja/extension/concept/scope.html#%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)

### TakeOverアノテーション
* ライフサイクルメソッドに指定することで、遷移先画面に引き継ぐプロパティを指定できるアノテーション
* 種類は以下の3種類
    * INCLUDE：properties属性で指定したプロパティだけを遷移先画面へ引き継ぐ
    * EXCLUDE：properties属性で指定したプロパティ以外を遷移先画面へ引き継ぐ
    * NEVER：全てのプロパティを遷移先画面へ引き継がない

※詳細は以下を参照
[TakeOverアノテーション | Seasar > Teeda](http://teeda.seasar.org/ja/extension/concept/scope.html#TakeOver%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

## 試したこととその結果
### パターン1：@&#xFFF0;pagescope × @&#xFFF0;TakeOver
* 引き継ぎたい変数に@&#xFFF0;pagescopeをつける
* do～() メソッドに@&#xFFF0;TakeOver（INCLUDE）をつける

```java: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アノテーションにより遷移先画面に指定したプロパティが引き継がれたが、@&#xFFF0;pagescopeにより、自画面遷移のinitialize時に新しいページスコープがはじまってそれまでの値は破棄されたため、こうなったと考えられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/2c3ee750-d8bc-9c2b-1e3d-155bdea6e454.png)

### パターン2：@&#xFFF0;TakeOverのみ
* do～() メソッドのみに@&#xFFF0;TakeOver（INCLUDE）をつける

```java: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/96035885-f96b-a85a-ed5b-aed02d45c9be.png)


### パターン3：@&#xFFF0;TakeOver × hidden
* 処理→自画面遷移メソッドに@&#xFFF0;TakeOver（INCLUDE）をつける
* 対応するページにhiddenで引き継ぎたい変数を埋め込む

```java:FooPage.java

String foo;

// 省略

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

```
```html: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/7491d465-fa6c-14a0-b34d-a9eee3e2704f.png)


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

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

## 参考
- [ページスコープ | Seasar > Teeda](http://teeda.seasar.org/ja/extension/concept/scope.html#%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)
- [TakeOverアノテーション | Seasar > Teeda](http://teeda.seasar.org/ja/extension/concept/scope.html#TakeOver%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)