Presentationのスコープについて
Presentation層におけるスコープについて
@ConversationScoped
画面操作に関するスコープとして、また その考察
実装イメージ
- 開始ポイントを必ず
index.xhtml
にする。 - ファイル名を除くフォルダパスが変更されるタイミングを
@ConversationScoped
の開始・終了の境界にする。 - フォルダ名を宛先(
index.xhtml
は省略可能。SAStruts風?) - 同一会話内の画面遷移は
xhtml
名だけで遷移する。.xhtml
の省略不可。 - 会話開始前に
index.xhtml
以外のパスにアクセスをしようとしたら、同一フォルダのindex.xhtml
にフォワードする。 - 画面遷移はリダイレクトするように
Interseptor
で?faces-redirect=true";
を付与する。同一画面遷移(return null)の場合は、自画面パスを取得して対応する サブフォルダも親フォルダの会話範囲にする*1
考察
@ViewScoped
(JSF依存)は使わない
- フォルダパスが変わらない=同一画面ということになるので、会話の開始・終了のタイミングは問題なさそう。
- クライアントに情報を持たないので通信量が少なくて良さそう。
@FlowScoped
(JSF依存)は使わない
- 同一会話を同一フォルダまたは子フォルダで表現すれば求めている要件は満たしている。
@FlowScoped
と違って遷移フローのためのクラスとかXML
を作成しなくていいので分かりやすくなりそう。jar
にして部品化することは出来なくなる可能性大?。部品化する場合、仕組みを含めて全て取り込まないといけないことになるのでサイズが大きくなってしまう?。
会話の開始は どうやって?
タイミング
画面初期表示
なぜ
遷移の終了フェーズで開始をしないと、前回の会話をそのまま引き継いでしまう。
Interseptor
で実現しようとしたけれど、終了から開始までにフェーズが変わっていないため、前回の会話スコープIDを そのまま引き継いでしまって想定していた挙動が実現できなかった。
どうやって
viewAction
で実装。
共通的に扱えるようにするためにテンプレートを使用すればボイラーな実装はしなくてよくなる。
JSF 2.2ではf:eventのpreRenderViewではなくf:viewActionを使う? - DENの思うこと
会話の終了は どうやって?
タイミング
Interseptor
なぜ
処理前後のURLで終了判定をしたいため、処理前後のURLを把握できる場所がInterseptor
だから。
また、終了時点で、次の画面に遷移する前に確実に終了させておきたい。
どうやって
処理前の画面URLと処理後のURLのフォルダが異なる場合は会話を終了させる。
画面遷移のルール
遷移というか、パス指定のルールはSAStrutsを参考にしようかと思っています。
随分、昔の話にはなりますが、SAStrutsをやって、EEを見たときに「ほとんど同じじゃない?」と思ったということもあって、親和性がある気がしている。
全く同じにする、というつもりはないけれど、基本的な考え方については色々と参考にしようかな。
フォルダで会話スコープの実装例
2018/5/3 追記
イメージしていることの お試し実装をしてみました。
@RequestScoped
単純な参照のみの画面の事を考えて@RequestScoped
は残す。
実装イメージ(悩み中)
StatelessView
の強制
Stateless View
の制御を@RequestScoped
を使用した場合に強制的に行うようにInterseptor
で対応。
閲覧のみのコントローラーですよ、ということが分かるようにする工夫が必要かな。
@ApplicationScoped
ユーティリティクラス(悩み中)
ユーティリティクラスをInject
対象にする状態が、すでに良くない気がしている。でもテスト容易性のためにstatic
クラスにしないで、ということはあるかもしれないので、一応想定はしておく。
@SessionScoped
ユーザー情報
- ログイン以降のユーザーの状態。
- 認証・認可
ゲストユーザー情報
- ログインする前の状態保持。ショッピングカート的な仕組みだと必要かも。
*1:2017/8/6 追記:スコープが広すぎるので対象外にするべき?