我正在使用 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
- 客户端启动 AJAX 文件上传调用
- 服务器开始临时对话#2
- 服务器调用
service.fileUpload()
. 此方法将 a 添加FacesMessage
到会话范围的FacesMessages
接缝组件。 - 服务器返回 AJAX 请求的响应并终止对话 #2,包括所有排队
FacesMessage
的 s。
- 收到“onuploadcomplete”事件,客户端请求重新渲染“myPanel”
- 服务器开始临时对话#3
- 服务器呈现页面,
FacesMessages
为对话 #3创建一个新的空白 - 服务器返回 AJAX 请求的响应(其中包含一个空的
<h:messages/>
)并终止对话 #3
我可以通过多种方式解决这个问题:
- 通过创建一个新的 PAGE 范围的 FacesMessages 组件。
- 通过将对话标记为长时间运行
service.fileUpload()
并在执行时结束fileUploadComplete()
。
正确的方法是在与service.fileUpload()
. 这可能吗?