0

次のようなBeanクラスがあります。

static int variable_static;

public RestaurantBean() {  
    variable_static = 0;  
}

//...  

//value of variable_static  changes throughout the code  
//...

public string button() {  
    //firing this button causes the variable_static value to change back to 0
    return null;
}

コード全体で値が変更される静的変数があります (値を出力することでわかります) が、ボタンが起動されると、その値は自動的にデフォルト値に戻りますが、これは望ましくありません。これは JSF のポストバックですか? どうすればこれを防ぐことができますか?

4

2 に答える 2

2

問題は、それが@RequestScopedBean であるため、リクエスト (ajax リクエストを含む) ごとに作成され、コンストラクターがstatic変数を0(デフォルト値) に再初期化することです。ちなみに、これはコンストラクターで行われます。

public RestaurantBean() {
    //this is the culprit
    variable_static = 0;
}

これを知っていれば、解決策@ViewScopedは Bean のスコープをorのよう@SessionScopedに (必要に応じて)より広いものに変更することです。

この後、BalusC と私が考えること: なぜstaticフィールドを使用するのか? 少なくとも、このフィールドの唯一の目的は、同じビュー内の複数のリクエストに沿って存続することです (これは によって既に達成されています)。この変数を他のクラスと共有しない限り、修飾子@ViewScopedでマークする理由はありません(with はアプリケーションの奇妙な設計)。static

これに関する詳細情報:

于 2013-08-03T21:22:26.783 に答える
0

@ManagedBean が @RequestScope に設定されていると仮定すると、値がリセットされる理由は、新しいリクエストを受信するたびに Bean が作成されるためです。これは、ボタンをクリックすると発生します。そのクラスのインスタンスが作成されるたびにコンストラクターが呼び出されるため、変数の値がリセットされます。

上記で提案されたように、代わりに @ViewScope Bean を試すことができますが、BalusC のコメントに耳を傾けてください。本当の問題は、静的変数を使用して情報を追跡することです。情報を追跡する必要がある場合は、代わりにセッション属性の使用を検討してください。

于 2013-08-03T21:10:26.873 に答える