2011-12-28 100 views
0

我使用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
    • 服务器呈现页面
    • 服务器发送完整的页面和杀死对话#1
  2. 客户端启动一个AJAX fileUpload请致电
    • 服务器启动临时对话#2
    • 服务器呼叫service.fileUpload()。此方法将FacesMessage添加到对话范围FacesMessages接缝组件。
    • 服务器返回AJAX请求的响应并杀死对话#2,包括所有排队的FacesMessage
  3. 收到的“onuploadcomplete”事件,客户端请求的“myPanel”
    • 服务器启动临时会话#3
    • 服务器呈现的页面重新呈现,创造了谈话一个新的空FacesMessages #3
    • 服务器返回对AJAX请求的响应(其包含一个空<h:messages/>)并杀死会话#3

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

  1. 通过创建一个新的FacesMessages组分,它是页面范围。
  2. 将对话标记为service.fileUpload(),并在做出fileUploadComplete()时结束。

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

+0

嗯,似乎RichFaces4通过指定fileUpload上的'render'属性来解决问题。此属性在RichFaces3中不可用。 – parasietje 2011-12-28 15:20:41

+0

刚刚使用长时间运行的对话进行测试。这不起作用,因为Seam在Render阶段之前将所有StatusMessages推出到FacesContext。 – parasietje 2011-12-28 15:21:43

回答

0

这只能通过使用自定义的StatusMessages组件并将其作用于在Rerender上仍可用的上下文(例如PAGE或长时间对话)来解决。