托管 Bean - JSF 2.1 - 获取 FacesContext 策略



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

FacesContext.getCurrentInstance()

我用它来

  • 从闪存范围放置/检索值
  • 在视图中添加消息
  • 获取请求参数映射

例子:

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 都应该是这些类的子级,因此它将继承这些方法。

建议使用实用程序类。您可以使用现有的 JSF 实用程序库,例如具有FacesMessages实用程序类的 OmniFaces,而不是重新发明自己的实用程序库。

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

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

我会推荐一个实用程序类来实现此目的,因为您可以灵活地扩展其他有用的类,例如那些具有一些您希望在其他 Bean 之间共享的通用逻辑的类。

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

最新更新