Seam + RichFaces fileUpload应该煽动reRender

时间:2011-12-28 14:44:04

标签: jsf richfaces seam seam2

我正在使用RichFaces 3.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
    • 服务器呈现页面
    • 服务器发送完成的页面并杀死会话#1
  2. 客户端启动AJAX fileUpload调用
    • 服务器启动临时会话#2
    • 服务器调用service.fileUpload()。此方法将FacesMessage添加到Conversation-scoped FacesMessages seam组件。
    • 服务器返回AJAX请求的响应并终止会话#2,包括所有排队的FacesMessage
  3. 收到'onuploadcomplete'事件,客户端请求'myPanel'的reRender
    • 服务器启动临时会话#3
    • 服务器呈现页面,为会话#3
    • 创建一个新的空FacesMessages
    • 服务器返回AJAX请求的响应(包含空<h:messages/>)并杀死会话#3
  4. 我可以通过多种方式解决这个问题:

    1. 创建一个新的FacesMessages组件,该组件是PAGE范围的。
    2. 将对话标记为service.fileUpload()中的长时间运行,并在执行fileUploadComplete()时结束。
    3. 正确的方法是在与service.fileUpload()相同的对话中重新调整页面。这可能吗?

2 个答案:

答案 0 :(得分:0)

这只能通过使用自定义StatusMessages组件并将其范围限定在Rerender上仍然可用的上下文(例如PAGE或长跑CONVERSATION)来解决。

答案 1 :(得分:0)

您是否尝试将<h:messages />替换为<rich:messages />?当AJAX操作创建新的FacesMessages时,它很有效。见http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_messages.html