2011-12-28 102 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或長時間對話)來解決。