Jsf 接缝+;RichFaces文件上传应鼓励重新加载

Jsf 接缝+;RichFaces文件上传应鼓励重新加载,jsf,richfaces,seam,seam2,Jsf,Richfaces,Seam,Seam2,我正在使用RichFaces3.3和Seam 2开发一个web应用程序 我有一个包含以下内容的页面: <h:form> <s:div id="myPanel"> <h:messages/> <rich:fileUpload fileUploadListener="#{service.uploadEvent}" maxFilesQuantity="1"> <a:support event="onuploadcomplete" r

我正在使用RichFaces3.3和Seam 2开发一个web应用程序

我有一个包含以下内容的页面:

<h:form>
<s:div id="myPanel">
  <h:messages/>
  <rich:fileUpload fileUploadListener="#{service.uploadEvent}" maxFilesQuantity="1">
    <a:support event="onuploadcomplete" reRender="myPanel"/>
  </rich:fileUpload>
</s:div>
</h:form>

service.uploadEvent
方法中,我接收文件并添加一条FacesMessage,让用户知道成功上传的文件

实际情况是:

  • 浏览器请求该页面
    • 服务器启动临时会话#1
    • 服务器呈现页面
    • 服务器发送完成的页面并终止对话#1
  • 客户端启动一个AJAX文件上传调用
    • 服务器启动临时会话#2
    • 服务器调用
      service.fileUpload()
      。此方法将
      FacesMessage
      添加到会话范围
      FacesMessage
      seam组件中
    • 服务器返回AJAX请求的响应并终止会话2,包括所有排队的
      FacesMessage
      s
  • 收到“onuploadcomplete”事件后,客户端请求重新提交“myPanel”
    • 服务器启动临时会话#3
    • 服务器呈现页面,为对话创建新的空
      FacesMessages
    • 服务器返回AJAX请求的响应(其中包含一个空的
      )并终止对话#3
  • 我可以通过多种方式解决这个问题:

  • 通过创建页面范围内的新FacesMessages组件
  • 通过在
    service.fileUpload()
    中将对话标记为长时间运行,并在执行
    fileUploadComplete()
    时结束对话

  • 正确的方法是在与
    service.fileUpload()
    相同的对话中重新提交页面。这是可能的吗?

    这只能通过使用自定义StatusMessages组件并将其范围限定到在Reender上仍然可用的上下文(例如页面或长时间运行的对话)来解决。

    您是否尝试过将
    替换为
    ?当AJAX操作创建新的FacesMessage时,它工作得很好。请参见

    Hmm,似乎RichFaces4通过在fileUpload上指定“render”属性有了解决方案。此属性在RichFaces3中不可用。仅使用长时间运行的对话进行测试。这不起作用,因为Seam在渲染阶段之前将所有状态消息推出到FacesContext。是的,我有。它不会呈现uploadListener中发出的FacesMessages。