我使用RichFaces 3.3和Seam 2开发Web应用程序。Seam + RichFaces fileUpload应该煽动reRender
我有以下页面:
<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 fileUpload请致电
- 服务器启动临时对话#2
- 服务器呼叫
service.fileUpload()
。此方法将FacesMessage
添加到对话范围FacesMessages
接缝组件。 - 服务器返回AJAX请求的响应并杀死对话#2,包括所有排队的
FacesMessage
。
- 收到的“onuploadcomplete”事件,客户端请求的“myPanel”
- 服务器启动临时会话#3
- 服务器呈现的页面重新呈现,创造了谈话一个新的空
FacesMessages
#3 - 服务器返回对AJAX请求的响应(其包含一个空
<h:messages/>
)并杀死会话#3
我可以用多种方式解决这个问题:
- 通过创建一个新的FacesMessages组分,它是页面范围。
- 将对话标记为
service.fileUpload()
,并在做出fileUploadComplete()
时结束。
正确的方法是在与service.fileUpload()
相同的对话中reRender页面。这可能吗?
嗯,似乎RichFaces4通过指定fileUpload上的'render'属性来解决问题。此属性在RichFaces3中不可用。 – parasietje 2011-12-28 15:20:41
刚刚使用长时间运行的对话进行测试。这不起作用,因为Seam在Render阶段之前将所有StatusMessages推出到FacesContext。 – parasietje 2011-12-28 15:21:43