为了获得良好的用户反馈,我在我的web应用程序中使用多个站点的消息。
要添加消息,只需使用:
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message));
我为type
和message
添加了变量,因为它取决于不同的验证。
好吧,我使用不同的ManagedBeans
为不同的网站,这是正常的。
我想到了,在不同的ManagedBeans
中添加这些消息的最佳实践是什么。
目前,我总是使用上面的代码片段超过30次(肯定会越来越多)。
我应该创建一个带有SessionScoped
注释或@ApplicationScoped
的Bean吗?你还有什么其他的提示吗,我应该知道?
只需将重复的静态代码隐藏到可重用的static
方法中,以使其更DRY ("Don't Repeat Yourself")。
以这样的方式设计静态方法,您最终可以从中重构,
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message));
,
Messages.addGlobalInfo(message);
或甚至使用import static com.example.Messages.*;
(Eclipse: Ctrl+Shift+M行):
addGlobalInfo(message);
它不需要是托管bean,因为它不保存任何状态。此外,您应该将这样一个实用程序类的默认构造函数设置为private
,这样Java/JSF就可以首先不通过反射中的new
操作符或Class#newInstance()
来构造它。如果您正在使用CDI,则在必要时用@Typed
注释它,并使用空值,以防止通过Bean<T>
将其注册为托管bean候选。
@Typed
public final class Messages {
private Messages() {}
// ...
}
JSF实用程序库OmniFaces有这个实用程序类:org.omnifaces.util.Messages
。
可以将此代码移动到某个实用程序类:
public void static addMessage(FacesMessage.Severity type, String message){
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(type, "", message));
}
你也可以用一个参数创建几个方法:addInfoMessage, adderormessage,…