【发布时间】:2011-06-21 18:12:02
【问题描述】:
有一个 JSF 1.2 页面,上面有 <rich:messages> 和 <a4j:poll> 组件。当一条消息放在FacesContext 中时,它只会短暂显示,直到轮询发送下一个请求。是否可以跨 AJAX 请求保留消息?
【问题讨论】:
有一个 JSF 1.2 页面,上面有 <rich:messages> 和 <a4j:poll> 组件。当一条消息放在FacesContext 中时,它只会短暂显示,直到轮询发送下一个请求。是否可以跨 AJAX 请求保留消息?
【问题讨论】:
可能,但您需要自己保存消息。 JSF 中的消息是请求范围的,因此在请求之间被清除。
【讨论】:
将以下内容添加到您的 facelets:
<ui:define name="metadata">
<f:event type="preRenderView" listener="#{ajaxBacking.displayMessages}" />
</ui:define>
创建一个支持 bean 以通过 ajax 调用持久化消息:
@ManagedBean
@ViewScoped
public class AjaxBacking {
Map<String, List<FacesMessage>> messages;
public AjaxBacking(){
messages = new HashMap<String, List<FacesMessage>>();
}
public static AjaxBacking getCurrentInstance() {
AjaxBacking ajaxBacking = null;
FacesContext context = FacesContext.getCurrentInstance();
if ((ajaxBacking = (AjaxBacking) context.getViewRoot().getViewMap().get("ajaxBacking")) == null){
ajaxBacking = (AjaxBacking)context.getApplication().evaluateExpressionGet(context,"#{ajaxBacking}",AjaxBacking.class);
}
return ajaxBacking;
}
public void displayMessages(){
FacesContext facesContext = FacesContext.getCurrentInstance();
for (String component : messages.keySet()){
for (FacesMessage message : messages.get(component)) {
if (!facesContext.getMessageList(component).contains(message)){
facesContext.addMessage(component, message);
}
}
}
}
public void putMessages(String component, List<FacesMessage> facesMessage){
List<FacesMessage> messages = new ArrayList<FacesMessage>();
for (FacesMessage message : facesMessage) messages.add(message);
this.messages.put(component, messages);
}
public Map<String, List<FacesMessage>> getMessages() {
return messages;
}
}
最后将这一行添加到任何添加 FacesMessage 的 bean 方法的底部。
AjaxBacking.getCurrentInstance().putMessages(messages,facesContext.getMessageList(messages);
【讨论】: