0

私はJSF初心者です。マネージドビーンについて質問です。

ステップ 0:

マネージドBean BeanAがあり、スコープはリクエストです。そして BeanA instance1.propertyA = "0";

ステップ1:

ajax を使用して国を変更し、BeanA.countryChanged メソッドでマネージド Bean BeanA.propertyA = "A" を変更します。

<t:selectOneMenu id="Country" required="true" valueChangeListener="#{BeanA.countryChanged}">
    <a4j:support event="onchange" limitToList="true" ajaxSingle="true" />
    <f:selectItems value="#{BeanA.countries}" /> 
</t:selectOneMenu>

ステップ2:

フォームを送信してテキスト入力を検証する

<h:inputText id="street" required="#{BeanA.propertyA == "A"}"

step2 の BeanA instance2 の値 propertyA は、JSF 検証フェーズで "A" になるはずですが、実際には "0" です。JSF が BeanA インスタンスのプロパティ値をロードして新しい BeanA インスタンスを作成する方法がわかりません。どうすればいいですか、値は「A」に変わりますか?ありがとう、

4

1 に答える 1

1

症状は、Bean がリクエストスコープであることを示しています。これは、HTTP リクエストごとに再構築されることを意味します。おそらく、すべての ajax リクエストが個別の HTTP リクエストとしてカウントされることにも気付いていないでしょう。実際には、同じビューの ajax ポストバック全体で同じ Bean インスタンスを再利用していません。真新しいインスタンスが作成されるたびに、そのすべてのプロパティがデフォルトに設定されます。

ajaxを念頭に置いて設計されたJSF 2.0はview、標準APIの新しいスコープで解決しました。

JSF 1.x では、サードパーティのコンポーネント ライブラリにフォールバックする必要があります。特定のケースでは、Tomahawk と Ajax4jsf の両方を使用している場合、2 つのオプションがあります。

  1. を使用し<t:saveState>ます。

    <t:saveState value="#{BeanA}" />
    
  2. または、 を使用します<a4j:keepAlive>

    <a4j:keepAlive beanName="BeanA" />
    
于 2013-07-27T14:51:08.350 に答える