2011-06-29 2 views
0

Seam 3、RichFaces 4を使用して少しのアプリケーションを動作させようとしています。私はいろいろなことを試しましたが、最終的なハードルに落ち続けます。リクエストパラメータを介してcustomerIdを実行しています。しかし、私がpopupPanelのRichFaces commandButtonを押すと、そのcustomerIdはもう利用できなくなりました。Seam、RichFaces&PopupPanelでパラメータを渡す

一部のデータを管理するアプリケーションを設定しています。基本的にはあなたがURLを介してこの第二のリポジトリページに得ることができるなど、編集、あなたが作成できる「リポジトリ」を含む別の画面が表示されますこと、一つの画面から顧客を選択:

http://localhost:8080/media-manager/repositories.xhtml?customer=12

私は、リポジトリのページにメタデータを介して顧客のIDを設定し、initを呼び出し

@Named 
@RequestScoped 
public class RepositoryBean extends AbstractViewBean<Repository> { 
    // Various properties etc. here 

    private Long customerId; 

    public void init() { 
     log.info("Customer ID is "+ customerId); 
    } 
} 

:私はその後まで、この値を選ぶBeanを持って

<f:metadata> 
    <f:viewParam name="customer" value="#{repositoryBean.customerId}"/> 
    <f:event type="preRenderView" listener="#{repositoryBean.init}" /> 
</f:metadata> 

これは最初はうまくいきます。私は提供されたIDで顧客に必要な情報を表示することができます。しかし、ポップアップパネルを作成しようとすると少し間違っています。ここで最初のコードの簡易版です:私は保存CommandButtonを打つたび

<rich:popupPanel id="repositoryModalPanel" modal="true" resizeable="true"> 
    <f:facet name="header">Title</f:facet> 
    <f:facet name="controls"> 
    <h:outputLink value="#" onclick="#{rich:component('repositoryModalPanel')}.hide(); return false;">X</h:outputLink> 
    </f:facet> 
    <h:form id="modalForm" class="modalForm"> 
    <fieldset> 
    <ul class="layout form"> 
     <li> 
     <label for="name" class="required">Name:</label> 
     <h:inputText id="name" value="#{repositoryBean.instance.name}" required="true"> 
      <!-- rich:validator event="blur"/--> 
     </h:inputText> 
     <rich:message for="name" errorClass="error errormessage" /> 
     </li> 
     <li class="last"> 
     <a4j:commandButton id="create" value="Create" action="#{repositoryBean.saveRepository}" rendered="#{empty repositoryBean.instance.id}"/> 
     <a4j:commandButton id="save" value="Save" action="#{repositoryBean.saveRepository}" rendered="#{not empty repositoryBean.instance.id}"/> 
     <a4j:commandButton id="cancel" value="Cancel" action="#{repositoryBean.clearInstance}" immediate="true" /> 
     </li> 
    </ul> 
    </fieldset> 
</h:form> 

は基本的には、initメソッドが呼び出されますが、得意先メンバーが移入されることはありません。なぜ誰にも洞察がありますか?

私はviewParamがGETリクエストのためだけであることを読んだので、多分それは問題ですか?しかし、その場合、他の解決策は何ですか?例えば、@ManagedPropertyを使用して見たことは、Seam 3には当てはまりません。

答えて

1

RepositoryBeanはRequestScopedなので、特に保存ボタンを押したときにリクエストごとに新しく作成されます。

直接的な解決方法は、RepositoryBeanをConversationScopedに昇格させ、ページに入ると長時間実行させることです。

@Named 
@ConversationScoped 
public class RepositoryBean extends AbstractViewBean<Repository> { 
    // Various properties etc. here 

    @In 
    Conversation conversation 

    private Long customerId; 

    public void init() { 
     log.info("Customer ID is "+ customerId); 
     conversation.begin(); 
    } 
} 

そのためeasieast方法はpreRenderViewをダンプし、代わりにシーム3ビュー・アクションを使用することです。

+0

これはうまくいきますが、1ページだけの会話を避けることをおすすめします。あなたはリクエストスコープに固執する方法を知っていますか? –

+0

もちろん、パラメータをGETとして明示的に渡すことができ、init()メカニズム全体を忘れてしまいます。しかし、あなたが言及していない要件がない限り、このケースでは会話を避けることが絶対に間違っているように感じます。一時的なものから長時間のものへの会話を促進するという全体のコンセプトが、このユースケースを念頭に置いて正確に*設計されていることを忘れないでください...確かに、パフォーマンスの低下/メモリ消費の増加を心配する必要はありません。そんなこと... –

関連する問題