ここで、タブ シートを持つ Web アプリケーションを構築するのに少し混乱しています。タブ シート クラスでは、ユーザーが選択したタブを格納するために、データ メンバー (静的文字列変数) を使用しています。ユーザーがタブシートに戻ったときに、ユーザーが最後に選択したタブを表示できるように、これを行っています。望ましい結果を得ています。ただし、(ブラウザーのキャッシュを削除した後) ログアウトしてログインすると、タブ シートはユーザーが最後に選択したタブを選択し、デフォルトのタブを選択しません。タブ シートが別のコンポーネントによって初期化されています。私が理解していないのは、クラス定義がガベージコレクションされていないということですか? なぜ古いデータを選ぶのですか?これを修正するには?
4 に答える
変数を静的にすることは、変数をユーザーセッションに分離することに相当すると想定しているようです。そうではありません。
なんらかのセッション処理が必要な場合は、実際にsession が必要です。(サーバーの再起動、複数のサーバーなどで何が起こるかを考慮する必要があります。)
静的変数がある場合、それはそのクラスローダーのそのクラスの1 つの変数です。ユーザーとは何の関係もありません。同じサーバーにヒットした場合、すべてのユーザーに同じ変数が表示されます。
Web アプリの構築に使用しているテクノロジについては何も教えてくれませんでしたが、基本的には、サーバー側のユーザー セッションに関して提供されているものを調べるか、隠しフィールドなどを使用して情報を伝達する必要があります。したがって、サーバーはそれを追跡する必要はまったくありません。
静的メンバーはオブジェクトごとではなくクラスごとに格納されるため、静的メンバーの値はすべてのクラス インスタンス (オブジェクト) で同じであり、インスタンスがスコープ外に出ても「リセット」されません。このように静的メンバーを使用するのは悪い考えです。アプリケーションのすべてのユーザーが同じ値を参照し、そのうちの 1 人が変更を引き起こすと、変更された値が全員に表示されるためです (つまり、ユーザー 1 がタブを変更した場合)。 、他のすべてのユーザーのタブも変更されます)。
値が絶えず変化している場合、静的ではありません。これらの種類の変数を格納するには、別のメカニズムを使用することを検討する必要があると思います。
ブラウザーのキャッシュをクリアしても、静的変数が格納されているサーバー上のオブジェクトには影響しません。ユーザーがログアウトする (または選択してログインする) 場合は、明示的に再設定する必要があります。