2011-02-09 4 views
1

私は自分のアプリケーションでどのスコープを使用するべきかを扱うのが本当に困難です。ビューからマネージドBeanを初期化する

私は初期ビューレイアウトにaを使用してPrimefaceを使用しています。レイアウトの外には、多くの異なるマネージドBeanで使用されるダイアログがあります。

レイアウト内には、ヘッダー、フッター、左側のナビゲーション、中央の現在のビューがあります。次のように私の見解はなります

<h:body id=body"> 
    <p:layoutUnit id=head" position="top"> 
     <ui:insert name="header"> 
    </p:layoutUnit> 
    <p:layoutUnit id=head" position="bottom"> 
     <ui:insert name="footer"> 
    </p:layoutUnit> 
    <p:layoutUnit id=head" position="left"> 
     <ui:insert name="menu"> 
    </p:layoutUnit> 
    <p:layoutUnit id=head" position="right"> 
     <ui:insert name="main"> 
    </p:layoutUnit> 

    <p:dialog widgetVar="addAddressDialog" header="Add New Address"> 
     <h:form id="insertAddress"> 
      <h:inputText id="insert_address" label="Address" /> 
     </h:form> 
    </p:dialog> 

    <p:dialog widgetVar="updateAddressDialog" header="Add New Address"> 
     <h:form id="updateAddress"> 
      <h:inputText id="update_address" value=#{addressBean.selectedAddress.address" /> 
     </h:form> 
    </p:dialog> 

私のアプリケーションは、最初のビューがロードされているので、addressBeanの@PostConstructが呼び出さなっているロードするときに私が午前問題があります。 @PostConstructでは、contactIdという特定のIDに関連付けられたアドレスのリストを初期化します。この時点では、contactIdはインスタンス化されていません。これは、ユーザーが「メイン」ビューとやりとりすると起こります。

AddressBeanのMy Scopeは、contactIdが初めて設定されたときにのみ検索を実行する@ViewScopeです。その後、@PostConstructは決して再び呼び出されず、ビューがスコープから外れないように見えるため、contactIdが変更された場合でも、取り込まれた情報は保持され続けます。

@RequestScopeを試してみましたが、これは実際にはうまくいきます。しかし、 "メイン"ビュー内のデータテーブルにアドレスを表示するときに問題が発生します。 insertAddressDialog.show()という名前のデータテーブルの一番下にボタンがあります。最初に開いて、私はデータを挿入することができますが、ビューがその時点で失われていると推測するため、挿入した新しいレコードがデータテーブルに表示されません。そして、2.データテーブル上のボタンはもはや生きているか、またはアクティブではないので、ユーザがレコードを最初に挿入した後にダイアログが開いていない。

これは簡単なことだと思われますが、私のアプリケーションには問題の原因となっている多くのネストされたビューがあります。このようなものをどう扱うかについての洞察は、本当に助けになるでしょう。

答えて

0

これはPrimeFacesの問題のようなものではありません。

ViewScoped Beanは、関連付けられているページ(ビュー)から移動しない限り、有効範囲内にとどまります。 RequestScoped Beanは、対話するたびに再インスタンス化します。 1つのインタラクションでRequestScoped Beanに変数を格納しようとしている場合、2番目のインタラクションでこれらの変数を使用してデータベースを更新すると、2番目のインタラクションでBeanが再インスタンス化され、変数がなくなります(まだそこにある - その価値は消える)。

@PostConstructを使用してアドレスを初期化する魅力的な理由はありますか?あなたがメインページを持っているように聞こえますが、ユーザーが入力したメインページ(または、そうでなければプログラムが検索します)から、ユーザーのcontactIdから、プログラムとやり取りを始めます。このcontactId変数は、そのユーザーのcontactIdに関連付けられているすべてのアドレスを示すデータテーブルを設定するために使用されます。あなたのBeanロジックにエラーがあるように聞こえます。

最初にcontactIdを取得してから、それを使用してデータテーブルを埋める必要があります。あなたのプログラム/ユーザがcontactIdを提供するためにどのようにBeanとやりとりするのか分かりません。 contactIdがユーザーから入力された場合は、contactIdが入力される前に常に初期化されるため、@PostConstructのアドレスリストを初期化しないでください。プログラムがcontactIdを自動的に取得している場合(例えば、ユーザーがサインインしてプログラムがデータベースからユーザーのcontactIdを作成/取得したために知っている)、ユーザーの変数を自動的に取得する場合、そのコードを@PostConstruct - データテーブルが初期化される前。

または、代わりに@PostConstructを使用するのは、単に前に、あなたのページ(ビュー)は、任意の変数を参照する時点で、あなたのWebページ内のメソッド呼び出しが含まれています。あなたがに到達する前に

Beanが呼び出されると、構築されなければならない...

#{} myBean.myMethodここ その他のコード:ちょうど右のページにメソッド呼び出しを置くことができますメソッド呼び出し、およびユーザーのcontactIdは、Beanのデータ操作に使用できる必要があります。

+0

"メソッドコールをページに置くことができます: #{myBean.myMethod}他のコードはここにあります。 .. "それは私が考えなかった一つのアイデアだが、これは私にとってはうまくいかない。私のプログラムの仕組みについてのあなたの前提は正しいです。ビューがロードされる前にBeanをインスタンス化する方法や、提案したようにビューの最上部にBeanをインスタンス化する方法が必要です。 – medium

+0

if(address == null){myDao.getAddresses();のようなデータテーブルのgetterにloginを置くことができます。返信アドレス} else {返信アドレス}しかし、私はセッターやゲッターに論理がないはずがないという仮説を否定していました。 – medium

+0

さて、Beanは、ビューがロードされる前にインスタンス化されます。それが問題を起こしているのですが、Beanはインスタンス化(構築)され、直ちに@PostConstructが呼び出されます。 contactIdをBeanに渡した後で、データテーブルを初期化する必要があります。 @PostConstructでcontactIdを設定することもできます。特に、Beanをインスタンス化する前にすでに存在しているため、@ PostConstructでデータテーブルを初期化する必要があります。あなたの問題はただの流れです。 – Sean

関連する問題