Шов 2.2.2. Окончательные сообщения для отображения после a4j: mediaOutput - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть такой xhtml:

<a4j:outputPanel id="displayGraph" layout="block" style="clear:both; margin-top: 0px; margin-left: 80px;margin-bottom: 20px;">
        <a4j:mediaOutput element="img"  cacheable="false" session="false" createContent="#{generateGraph.paint}" value="#{graph}" mimeType="image/png" standby="Loading" /> 
    </a4j:outputPanel>

    <a4j:outputPanel id="errorMessage" ajaxRendered="true">
        <h:messages id="messages" styleClass="message" errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg"/>
    </a4j:outputPanel>

также у меня есть метод рисования в бэк-бине, который генерирует сообщение, если метод дает исключение. как это:

public void paint(OutputStream os, Object data) {
    try{ 
           //some actions
  } catch (IOException e) {
      e.printStackTrace();
      FacesMessages.instance().add(Severity.ERROR, "Sorry connection can not be achieved");
  }

} else {
      FacesMessages.instance().add(Severity.ERROR, "Sorry server does not exist");

}

}

теперь сообщения никогда не отображаются. кто-нибудь может сказать мне, что я делаю не так?

заранее спасибо

1 Ответ

0 голосов
/ 03 января 2012

FacesMessages - компонент шва в области разговора. Предположим, вы используете временные разговоры, вот что происходит:

  1. Первоначальный запрос к странице JSF. Временный разговор № 1 создан.
  2. Страница JSF обработана, разговор №1 прерван.
  3. AJAX-запрос для mediaOutput. Временный разговор № 2 создан.
  4. Изображение отображается. Объект FacesMessages, связанный с беседой № 2.
  5. Изображение возвращено. Разговор № 2 убит.
  6. a4j: outputPanel является ajaxRendered. Временный разговор № 3 создан.
  7. Пустые сообщения FacesMessages отображаются в диалоге № 3.

Вы можете проверить это, включив #{conversation.id} в ваши a4j: outputPanels и записав идентификатор разговора в вашем методе paint().

Есть два решения этой проблемы. Либо вы начинаете длительный разговор, и добавляете в свой mediaOutput. Другое решение состоит в том, чтобы не использовать FacesMessages, а пользовательский компонент в области PAGE для хранения ваших сообщений.

Вы также можете переключиться на RichFaces4, который включает аргумент «рендеринга» для каждого компонента richfaces, который гарантирует, что повторное рендеринг будет выполнен в том же запросе, что и исходный AJAX-запрос mediaOutput.

...