JSF 2.1 - 获取FacesContext策略

时间:2013-01-22 10:55:50

标签: jsf managed-bean facescontext

我正在开发webapp,我的MVC控制器是JSF 2.1。我有几种基于

的方法
  

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上使用它,在哪里放置这个方法的适当位置?我考虑两个选择:

a)创建类“JSFUtils”,其中所有方法都是公共的和静态的

b)创建超类“ManagedBean”,没有声明的范围,也没有声明的@ManagedBean注释,但使用这些公共方法。每个托管bean都应该是这些类的子代,因此它将继承这些方法。

2 个答案:

答案 0 :(得分:3)

推荐的方法是实用程序类。您可以使用现有的JSF实用程序库,例如具有OmniFacesFaces实用程序类的Messages来实现此目的,而不是重新构建您自己的库。

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

可以确实也将它抽象为“超级bean”,但这不是可重用的,你会在每个JSF项目中不断重复自己。此外,一个类只能从一个类扩展。因此,如果您的bean碰巧需要从另一个超级类扩展,那么您就丢失了。

答案 1 :(得分:0)

我建议使用实用程序类,因为您可以灵活地扩展其他有用的类,例如那些具有一些您希望在其他bean之间共享的通用逻辑的类。

话虽如此,JSFUtils类可能会随着时间的推移而变得非常混乱,并且可能变得非常难以管理。最好对util方法进行分类,并将它们放在单独的静态实用程序类中。