0

i have an xhtml like this:

<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>

also i have paint method in backing bean which generates message if the method gives exception. like this:

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");

}

}

now the messages are never shown. could anyone kindly tell me what i am doing wrong?

thanks in advance

4

1 回答 1

0

FacesMessages 是一个对话范围的接缝组件。假设您正在使用临时对话,会发生以下情况:

  1. 对 JSF 页面的初始请求。已创建临时对话 #1。
  2. JSF 页面呈现,对话#1 被终止。
  3. 媒体输出的 AJAX 请求。创建了临时对话 #2。
  4. 图像被渲染。FacesMessages 对象绑定到对话#2。
  5. 图像被返回。对话#2 被杀死。
  6. a4j:outputPanel 是 ajaxRendered。已创建临时对话 #3。
  7. 在对话#3 中呈现一个空的 FacesMessages。

您可以通过#{conversation.id}在您的 a4j:outputPanels 中包含并在您的paint()方法中记录对话 ID 来测试这一点。

这个问题有两种解决方案。要么你开始一个长时间的对话,然后添加到你的 mediaOutput。另一种解决方案是不使用 FacesMessages,而是使用自定义 PAGE 范围的组件来保存您的消息。

您还可以切换到 RichFaces4,它为每个 Richfaces 组件包含一个“render”参数,以确保在与初始 mediaOutput AJAX 请求相同的请求中发出重新呈现。

于 2012-01-03T15:26:44.833 回答