Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

画面遷移に悩む

現在開発しているプロトタイプでは、画面xhtmlの裏にいるバックビーンはCDIの管理Beanを使用することで統一しました。

@Named(value = "xxxBean")...

Beanは画面で共通的に持つフィールド変数(画面IDやユーザ情報クラスなど)は抽象クラスで括りだし、実装しています。

public abstract class AbstractBaseBean implements Serializable{
    
    /**
     * 画面ID
     */
    private String screenId;

    ...
}

これを継承したCDI管理Beanを各画面に対して1対1となるように定義する形です。

 
@Named(value = "xxxBean")
@RequestScoped
public class XxxBean extends AbstractBaseBean implements Serializable{

   各画面の定義

}

で、悩ましいのがスコープと画面遷移です。

当初は単純にRequestScopeにしていました。画面遷移は自画面のBeanの関数を呼び出して、そこから抽象クラスの画面遷移処理へ遷移先の画面IDを渡して呼び出します。抽象クラスでは、ログ処理を行い、画面IDからURLを返す処理をします。

RequestScopeなので、画面遷移の際に自画面のBeanのコンストラクタ(@PostConstruct)が呼ばれます。
これはASP.NET的に簡単にポストバック判定ができるものと思っていました。
FacesContextにisPostbackなる関数もあったので。

しかしながら、記述してみると、なぜか上手く判定してくれません。なぜだ…。これは要詳細調査事項として保留中です。

仕方ないからSessionScopeにするか、と安易に考えそうですが、業務系で使うシステムなのでメモリ肥大は性能問題等に絡んでくるため好ましくないです。

CDIにはConversationScopeという便利なスコープもあるので、これを採用して、コンストラクタでBeginして、画面遷移でEndするようにしました。
しかし、ブラウザの戻るボタンが絡んでくると上手く動かないケースがあり、微妙です。

上記でやっていることは、JSFのViewScopeと同じなので、ViewScopeが欲しいのですが、CDIには標準ではないようです。なぜ…。

そんなこんなで、現在どのようにスコープを設定するか、中々悩ましい状況となっています。
みんなどうやっているんだろうか…。結構調べたのですが、なかなか「これだ!」という情報がないなぁ、という感じです。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村