2

Struts1を使用するJavaWebアプリケーションには、基本的にこれを行う多くのコードがあります。

HttpSession session = httpServletRequest.getSession();
MyObject myObject = session.getAttribute(MY_OBJECT_KEY);

//code that mutates myObject - setting properties or whatever

session.setAttribute(MY_OBJECT_KEY, myObject);

私の質問:最後の行、session.setAttribute(..)は必要ですか?私には無意味に思えます-「myObject」と「session.getAttribute(..)」はメモリ内の同じ場所を参照していますよね?では、セッションで属性を再設定する必要はありませんか?これは私が気付いていないことをしますか?オブジェクトは、ドキュメントに記載されているHttpSessionBindingListenerを実装していません。

これはこのアプリ全体で行われているため、再確認する必要があると感じています。コードをクリーンアップしているという理由だけで、何も壊したくないのは確かです。ありがとう

4

2 に答える 2

1

それはあなたが「変異する」とはどういう意味かによります。このコンテキストでの「変更」が、インスタンスではなくプロパティを変更したことを意味する場合、いいえ、setAttribute最後に変更する必要はありません。

myObject基になるオブジェクトへの参照です。セッションには独自の参照があります。これらは両方とも同じ基になるオブジェクトを指しているため、同じインスタンスのプロパティを変更することになります。

今、あなたがするなら

myObject = new MYObject();

次に、新しいオブジェクトをセッションに渡す必要があります。この場合、参照myObjectはセッションの参照とは異なるインスタンスを指すようになります。

注意してください、ユニットテストを書いてそれをテストしてみませんか?

于 2012-07-27T16:26:58.810 に答える
0

@emulcahy、これは古い投稿だと思います。サーブレットリスナーの調査中に、これに遭遇しました。それらの「冗長な」setAttribute(s)の理由を見つけましたか?

サーブレットリスナーでイベントをトリガーするために追加されたのではないかと思います。HttpSessionAttributeListenerまたはHttpSessionBindingListenerを実装するオブジェクトがあるかどうかを確認することをお勧めします。これらは、これらのセッション変数に情報を記録するために使用できます。ちょっとした考え。すでに問題を解決している場合は、このメッセージを無視してください。

于 2012-10-01T23:23:22.803 に答える