2

MVC コントローラーが JSF 2.1 である webapp を開発しています。私はに基づいているいくつかの方法を持っています

FacesContext.getCurrentInstance()

これを使って

  • Flash スコープからの値の配置/取得
  • ビューにメッセージを追加
  • リクエスト パラメータ マップを取得する

例:

public void addInfoMessage(String title, String description){
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,title, description));
}

public void putFlashMessage(String code, String value){
    FacesContext.getCurrentInstance().getExternalContext().getFlash().put(code, value);
}

すべての管理対象 Bean でこれを使用する場合、このメソッドを配置する適切な場所はどこにあるのでしょうか? 次の 2 つのオプションを検討します。

a) クラス「JSFUtils」を作成します。ここで、すべてのメソッドは public および static です。

b) スコープを宣言せず、@ManagedBean アノテーションを宣言せずに、これらのパブリック メソッドを使用して、スーパー クラス「ManagedBean」を作成します。すべてのマネージド Bean はこれらのクラスの子である必要があるため、これらのメソッドが継承されます。

4

2 に答える 2

3

ユーティリティ クラスは、推奨されるアプローチです。独自のものを再発明する代わりに、目的のユーティリティ クラスを持つOmniFacesなどの既存の JSF ユーティリティ ライブラリを使用できます。FacesMessages

String foo = Faces.getRequestParameter("foo");
Messages.create(summary).detail(detail).add();
Messages.addGlobalInfo(summary); // Without detail.
Faces.setFlashAttribute(key, value);

実際、「スーパー Bean」として抽象化することもできますが、これは再利用できず、すべての JSF プロジェクトで同じことを繰り返すことになります。また、クラスは 1 つのクラスからのみ拡張できます。そのため、Bean がたまたま別のスーパークラスから拡張する必要がある場合、道に迷ってしまいます。

于 2013-01-22T11:58:13.113 に答える
0

他の Bean 間で共有したい共通のロジックを持つクラスなど、他の有用なクラスを柔軟に拡張できるという理由だけで、この目的のためにユーティリティ クラスをお勧めします。

そうは言っても、JSFUtils クラスは時間の経過とともに非常に多くのメソッドで非常に雑然とし、非常に扱いにくくなる可能性があります。util メソッドを分類して、別々の静的ユーティリティ クラスに配置することをお勧めします。

于 2013-01-22T12:16:05.340 に答える