2011-12-28 27 views
0

私はRichFaces 3.3とSeam 2を使ってWebアプリケーションを開発しています。Seam + RichFaces fileUploadはreRenderを誘導する

私は、次のページがあります。

service.uploadEvent方法で
<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> 

を、私はファイルを受信し、ユーザーが正常にアップロードされたファイルを知らせるためFacesMessageのを追加します。

ブラウザがページを要求する
    • サーバーは、サーバーがページをレンダリングする一時的な会話#1
    • 開始し
    • サーバーが完成したページを送信し、:

      は、実際に何が起こるかは、このです会話を中止する#1

  1. クライアントがAJAXファイルをアップロードする
    • サーバは一時的な会話を開始します。#2
    • サーバはservice.fileUpload()を呼び出します。このメソッドは、FacesMessageを対話スコープのFacesMessages seamコンポーネントに追加します。
    • サーバーはAJAX要求の応答を返し、キューに入れられたすべてのメッセージを含む会話#2を終了します。FacesMessage
  2. 「onuploadcomplete」イベントを受信すると、クライアントは「myPanel」
    • サーバが一時的な会話#3
    • を開始し、サーバーがページをレンダリングし、会話のための新しい空のFacesMessagesを作成するの再レンダリングを要求#3
    • サーバ(空<h:messages/>を含有する)AJAXリクエストに対するレスポンスを返し、3
会話#を殺します

私はいくつかの方法でこの問題を解決することができます。

  1. PAGEスコープのある新しいFacesMessagesコンポーネントを作成することにより。
  2. 会話をservice.fileUpload()に長時間実行し、fileUploadComplete()を終了すると終了します。

適切な方法は、同じ会話のページをservice.fileUpload()として再レンダリングすることです。これは可能ですか?

+0

まあ、RichFaces4には、fileUploadに 'render'属性を指定することで解決策があるようです。この属性はRichFaces3では使用できません。 – parasietje

+0

長時間の会話を使用してテストしました。 SeamはRenderフェーズの前にすべてのStatusMessagesをFacesContextにプッシュするため、これは機能しません。 – parasietje

答えて

0

これは、カスタムStatusMessagesコンポーネントを使用して、それをRerenderで引き続き利用できるコンテキスト(たとえば、PAGEまたはlongrunning CONVERSATION)に限定することによってのみ解決できます。

関連する問題