たまーにブログ解析を見に来るんですが、JSFの検索増えましたね。
日本語資料あんまりないですが、個人的には非常に便利だと思っているので
そろそろ流行りだしそうな感じなんですかね。


ということでまた備忘録。


JSF2.2 + Spring3.0の為、CDIのViewScopeが使えない環境でした
実際にはいろいろとやり方はあるんでしょうが…ごった煮状態だと何をどれで管理してるのか
わからなくなってしまいそうなので、Springのカスタムスコープをを使ってViewScopeを実現することにしました。


カスタムスコープの作成方法はこちらの記事を参考にさせて頂きました。


ただ、このViewScopeが適用されるにはいろいろと条件がありました。
というか、viewIdが新しくなると、たとえxhtmlとしては同じページでも
違う画面だという判断になってしまうので、どういう場合にviewIdが切り替わるのか?と色々と調べてみました。


■ GET遷移の場合


h:link、h:buttonを使用した場合などの、GET遷移の場合は常にviewIdが切り替わるようです。
まあ、これは想定内ですね。


■ POST遷移の場合


h:commandLink、h:commandButtonなどでPOST遷移する場合。
ここ、ちょっと躓きましたが、結果以下のような形でした。

①遷移先Actionの戻り値がboidの場合


viewIdの変更なし

①遷移先Actionの戻り値がStringの場合


Stringの内容によって変動

  return null   … viewIdの変更なし
  retun outcome  … viewIdの変更あり。元ページと同じoutcomeでも別扱い



こんな感じでした。
なので、ViewScope範囲内で画面再表示を実施したい場合は、かならずPOST遷移で値をnullで返却する、という形で収まりました。

よく考えれば当たり前のことな気はするんですけど、調べないとわかりませんでした。
まだまだ修行不足ですね。




ちなみに、f:viewActionについても調べてみました。
f:viewActionは「画面を初回表示した際にのみ」実施されるわけですが、
これもどういう判断でされているのか?を調べてみたんですけど
こちらは、完全にGET遷移かPOST遷移かだけで判断しているようです。
なので、 return outcomeで別ページから遷移してきても、実行されません。
このあたりややこしいですね