Seam 2.2.2。在a4j:mediaOutput之后显示的最终消息

时间:2011-12-07 16:38:58

标签: jsf seam2

我有这样的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>

我也有支持bean的paint方法,如果方法给出异常,它会生成消息。像这样:

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 :(得分:0)

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

  1. 对JSF页面的初始请求。临时谈话#1创建。
  2. JSF页面呈现,会话#1被杀。
  3. 对mediaOutput的AJAX请求。已创建临时对话#2。
  4. 渲染图像。 FacesMessages对象绑定到会话#2。
  5. 返回图片。会话#2被杀。
  6. a4j:outputPanel是ajaxRendered。临时谈话#3创建。
  7. 在会话#3中呈现空的FacesMessages。
  8. 您可以在a4j:outputPanels中添加#{conversation.id},并在paint()方法中记录对话ID,从而对此进行测试。

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

    您还可以切换到RichFaces4,其中包含每个richfaces组件的“render”参数,这样可以确保在与初始mediaOutput AJAX请求相同的请求中发出重新渲染。