以前アメブロで公開した内容です。
JSF2.2 + Spring3.0の環境でViewScopeを使えるようにしてみました。
カスタムスコープを使用しています。
カスタムスコープの作成方法はこちらの記事を参考にさせて頂きました。
http://jarngreipr.blog106.fc2.com/blog-entry-7.html
こちらの記事通りの方法でViewScope自体は使えるようになるのですが、実際どういった時に「同一画面」と捉えれるのか?がよくわからなかったので、いろいろと試してみました。
何をもってして別画面と判断するのか?
viewIdというものを使用して判別しています。
JSF側で自動管理されているパラメータになります。
この値が変更されると、別の画面に変わったという判断になるようです。
GET遷移の場合
h:link
、h:button
を使用した場合などのGET遷移の場合は常にviewIdが切り替わるようで、かならず別画面であるという判定が行われます。
まあ、これは想定内ですね。
POST遷移の場合
h:commandLink
、h:commandButton
などでPOST遷移する場合。
ここ、ちょっと躓きましたが、結果以下のような形でした。
遷移先Actionの戻り値がvoidの場合
viewIdの変更なし
遷移先Actionの戻り値がStringの場合
Stringの内容によって変動
- return null
viewIdの変更なし
- return outcome
viewIdの変更あり
まとめ
結論としては、ViewScope範囲内で画面再表示を実施したい場合は、かならずPOST遷移を使用し、値をnullで返却する、という形で収まりました。
よく考えれば当たり前のことな気はしますね・・・
ちなみに、似たような話でf:viewAction
の「画面を初回表示した際にのみ」実施されるという「初回」の判断は何をもってしているのか?というのも調べたところ、こちらは完全にGET遷移かPOST遷移かだけで判断しているようです。
なので、 return outcome
で別ページから遷移してきても、実行されません。
カスタムViewScopeとf:viewAction
を併用する場合は、このあたり気を付けて実装する必要があると思われます。