Сохранять сообщения JSF между вызовами AJAX - PullRequest
2 голосов
/ 21 июня 2011

Имеется страница JSF 1.2 с компонентами <rich:messages> и <a4j:poll>. Когда сообщение помещается в FacesContext, оно отображается только кратко, пока опрос не отправит следующий запрос. Можно ли сохранить сообщения через запросы AJAX?

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Возможно, но вам нужно будет сохранить сообщение самостоятельно.Сообщения в JSF являются областью запроса и, таким образом, очищаются между запросами.

1 голос
/ 05 декабря 2011

Добавьте следующее в свои лицевые стороны:

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

Создайте компонент поддержки для сохранения сообщений посредством вызовов 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;
}
}

И, наконец, добавьте эту строку в конец любогометод bean, который добавляет FacesMessage.

AjaxBacking.getCurrentInstance().putMessages(messages,facesContext.getMessageList(messages);
...