在AJAX调用之间保留JSF消息



有一个JSF 1.2页面,上面有<rich:messages><a4j:poll>组件。当消息被放置在FacesContext中时,它只会短暂显示,直到轮询发送下一个请求。是否可以在AJAX请求之间保留消息?

可能,但您需要自己保存消息。JSF中的消息是请求范围的,因此在请求之间被清除。

将以下内容添加到您的facelets中:

<ui:define name="metadata">
  <f:event type="preRenderView" listener="#{ajaxBacking.displayMessages}" />
</ui:define>

创建一个backingbean以通过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);

最新更新