システム開発で思うところ

Javaで主にシステム開発をしながら思うところをツラツラを綴る

スコープについて

@ConversationScoped

画面操作に関するスコープとして、また その考察

実装イメージ

  • 開始ポイントを必ずindex.xhtmlにする。
  • ファイル名を除くフォルダパスが変更されるタイミングを@ConversationScopedの開始・終了の境界にする。
  • フォルダ名を宛先(index.xhtmlは省略可能。SAStruts風?)
  • 同一会話内の画面遷移はxhtml名だけで遷移する。.xhtmlの省略不可。
  • 会話開始前にindex.xhtml以外のパスにアクセスをしようとしたら、同一フォルダのindex.xhtmlフォワードする。
  • 画面遷移はリダイレクトするようにInterseptor?faces-redirect=true";を付与する。同一画面遷移(return null)の場合は、自画面パスを取得して対応する
  • サブフォルダも親フォルダの会話範囲にする*1

考察

@ViewScopedJSF依存)は使わない

  • フォルダパスが変わらない=同一画面ということになるので、会話の開始・終了のタイミングは問題なさそう。
  • クライアントに情報を持たないので通信量が少なくて良さそう。

@FlowScopedJSF依存)は使わない

  • 同一会話を同一フォルダまたは子フォルダで表現すれば求めている要件は満たしている。
  • @FlowScopedと違って遷移フローのためのクラスとかXMLを作成しなくていいので分かりやすくなりそう。
  • jarにして部品化することは出来なくなる可能性大?。部品化する場合、仕組みを含めて全て取り込まないといけないことになるのでサイズが大きくなってしまう?。

会話の開始は どうやって?

タイミング

画面初期表示

なぜ

遷移の終了フェーズで開始をしないと、前回の会話をそのまま引き継いでしまう。

Interseptorで実現しようとしたけれど、終了から開始までにフェーズが変わっていないため、前回の会話スコープIDを そのまま引き継いでしまって想定していた挙動が実現できなかった。

どうやって

viewActionで実装。
共通的に扱えるようにするためにテンプレートを使用すればボイラーな実装はしなくてよくなる。

JSF 2.2ではf:eventのpreRenderViewではなくf:viewActionを使う? - DENの思うこと

会話の終了は どうやって?

タイミング

Interseptor

なぜ

処理前後のURLで終了判定をしたいため、処理前後のURLを把握できる場所がInterseptorだから。

また、終了時点で、次の画面に遷移する前に確実に終了させておきたい。

どうやって

処理前の画面URLと処理後のURLのフォルダが異なる場合は会話を終了させる。

画面遷移のルール

遷移というか、パス指定のルールはSAStrutsを参考にしようかと思っています。

随分、昔の話にはなりますが、SAStrutsをやって、EEを見たときに「ほとんど同じじゃない?」と思ったということもあって、親和性がある気がしている。

全く同じにする、というつもりはないけれど、基本的な考え方については色々と参考にしようかな。

Super Agile Struts - Tutorial

フォルダで会話スコープの実装例

2018/5/3 追記
イメージしていることの お試し実装をしてみました。

vermeer.hatenablog.jp

@RequestScoped

単純な参照のみの画面の事を考えて@RequestScopedは残す。

実装イメージ(悩み中)

StatelessViewの強制

Stateless Viewの制御を@RequestScopedを使用した場合に強制的に行うようにInterseptorで対応。

閲覧のみのコントローラーですよ、ということが分かるようにする工夫が必要かな。

@ApplicationScoped

ビジネスロジック

パーフェクトJavaEEを見ていると、Serviceなどのビジネスロジックは、このスコープにしておくと良さそう。ビジネスロジックに状態を持ってはいけないという思想としても正しいと思う。

インフラレイヤー

コネクションとかインフラ関係でコンテナに1つあれば十分のインスタンス

ユーティリティクラス(悩み中)

ユーティリティクラスをInject対象にする状態が、すでに良くない気がしている。でもテスト容易性のためにstaticクラスにしないで、ということはあるかもしれないので、一応想定はしておく。

@SessionScoped

ユーザー情報

  • ログイン以降のユーザーの状態。
  • 認証・認可

ゲストユーザー情報

  • ログインする前の状態保持。ショッピングカート的な仕組みだと必要かも。

*1:2017/8/6 追記:スコープが広すぎるので対象外にするべき?