0

我正在使用 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 文件上传调用
    • 服务器开始临时对话#2
    • 服务器调用service.fileUpload(). 此方法将 a 添加FacesMessage到会话范围的FacesMessages接缝组件。
    • 服务器返回 AJAX 请求的响应并终止对话 #2,包括所有排队FacesMessage的 s。
  3. 收到“onuploadcomplete”事件,客户端请求重新渲染“myPanel”
    • 服务器开始临时对话#3
    • 服务器呈现页面,FacesMessages为对话 #3创建一个新的空白
    • 服务器返回 AJAX 请求的响应(其中包含一个空的<h:messages/>)并终止对话 #3

我可以通过多种方式解决这个问题:

  1. 通过创建一个新的 PAGE 范围的 FacesMessages 组件。
  2. 通过将对话标记为长时间运行service.fileUpload()并在执行时结束fileUploadComplete()

正确的方法是在与service.fileUpload(). 这可能吗?

4

2 回答 2

0

你试过用 替换<h:messages /><rich:messages />?当 AJAX 操作创建新的 FacesMessages 时,它运行良好。见http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_messages.html

于 2012-01-09T15:20:12.613 回答
0

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

于 2012-01-06T10:33:41.773 回答