我使用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