0

注:この質問は、アプリでJSFスコープではなくCDIスコープを使用しているため、CDIスコープに関するものです。

1)RequestScoped(エンタープライズコンテキスト)にあるController Bean(TestController.java)は、このページに初めてアクセスしたときにindex_cut.xhtmlと呼ばれます。

ここに画像の説明を入力してください

2)[ロード]ボタンで、次のメソッドをロードして、正常に機能し、データを表示するsapFinancialPeriodListにデータを入力します。

<<XHTMLコード>>

<<JAVAコード>>

<<XHTMLコード>>

3)ページのコンテンツを変更して送信するとsapFinancialPeriodList、次の方法でNULLとして表示されます– </ p>

<<JAVAコード>>

<<XHTML結果>>

助言がありますか?

4

1 に答える 1

2

Beanはリクエストスコープであり、(ポスト)構築ではなくアクションでのみデータモデルをロードしています。データをロードしたアクション後のHTTP応答が終了すると、Beanはガベージされます。後続のリクエストは、すべてのプロパティがデフォルトに設定されたBeanの新しいインスタンスを取得します。ただし、同じデータモデルは(ポスト)構築中に保存されないため、空のままになります。

JSF2では、を使用してこれを解決し@ViewScopedます。nullこのようにして、ポストバック(またはを返す)によって同じビューを操作している限り、Beanは存続しますvoid

CDIでは、を使用してこれを解決する必要があります。これには、適切なタイミングで完了して呼び出す@ConversationScoped追加の@Inject Conversation定型文が必要です。具体的な例については、JSF 2.0forWizardパターンで使用するスコープも参照してください。begin()end()

<f:param>別の方法は、次のようにコマンドリンク/ボタンを介してデータモデルの作成を担当するパラメータを後続のリクエストに渡すことです。

<h:commandButton value="save" ...>
    <f:param name="period" value="#{bean.period}" />
</h:commandButton>

次に、次のように、リクエストスコープのBeanの(ポスト)コンストラクターでまったく同じデータモデルを再作成します。

String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);

(ちなみに、標準のJSFを使用している場合は、上記の方が解決しやすくなり@ManagedPropertyます。私が知る限り、CDIには、HTTP要求パラメーターをBeanプロパティとして設定できるアノテーションがありません)

参照:


具体的な問題とは関係なく、次のJSF 2.2は、新しい注釈と新しいタグを備えた新しい「Faces Flow」機能を使用して、この機能要件をより適切に解決します。@FlowScopedxmlns:j="http://java.sun.com/jsf/flow"

于 2012-11-05T18:04:30.857 に答える