- PR -

Strutsタグを用いたページ切換えについて

投稿者投稿内容
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-01-31 10:34
引用:

ひろさんの書き込み (2004-01-30 22:07) より:
>Action にはセッション情報を維持するインスタンス変数を
>作成してはいけないのですが、問題ないでしょうか?
良くは分かりませんが、動作はしています。



スレッドセーフではないので、複数クライアントからアクセスすると
不正な動作をしますよ。
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2004-02-19 10:26
引用:

顔爺さんの書き込み (2004-01-29 19:07) より:

Action のインスタンスは複数のセッションで共用されるので、
Action にはセッション情報を維持するインスタンス変数を
作成してはいけないのですが、問題ないでしょうか?




毎度お世話になっています。
ちょっと他のことを調べていたのですが気になったので質問させてください。
顔爺さんの以下の記述についてですが、現在Actionクラスにsession属性を持たせています。
スレッドセーフで無いということは、sessionに限らず、属性を持たせるのはまずいということなのでしょうか?個人端末で検証していたので気がつきませんでした。
また何か回避策はありますでしょうか?
ご教授よろしくお願いします。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-02-19 11:55
Action#perform()でHttpSessionを使うのですよね?
引数のHttpServletRequestからgetSession()で毎回引っ張り出すようにすれ
ばよいのではないでしょうか?メソッドのローカル変数なら、必ずスレッド
セーフです^^;

#すみません、ふさわしくない言い回しをしてしまいました。
#メソッドのローカル変数自身は、スレッドごとのフレームスタック内に割り当て
#られるので、確かに「必ず」スレッドセーフです。
#ですが、複数のスレッドのコンテキストが、ある時点で同一のsessionに帰属する
#requestを処理していた場合は、その複数のスレッドが参照変数を通して参照する
#先のsessionオブジェクトは同一であるので、sessionオブジェクトの操作につい
#てはスレッドセーフではありませんね。


[ メッセージ編集済み 編集者: シュン 編集日時 2004-02-19 14:10 ]
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-02-19 13:28
http://www.jajakarta.org/struts/struts1.1/documentation/ja/target/api/org/apache/struts/action/Action.htm

から引用します。

> コントローラは同時に発生した複数のリクエストに対して同一のインスタンスを共有するため、
> Actionはスレッドセーフであるようにプログラムすべきです。 すなわち次の項目に従って設計すべきです。
>
> * リクエストの状態に関連する情報を保持するためにインスタンス変数やスタティック変数を
> 使用してはいけません。インスタンス変数やスタティック変数は同一のアクションに関して
> リクエストをまたがってグローバルなリソースを共有したい場合に使用します。

> * 他のリソース(JavaBeans、セッション変数等)へのアクセスは、それらが保護を要求する
> 場合は同期化しなくてはいけません(しかしながら、一般的にリソースクラスは必要に応じて
> 自分自身を保護するように設計すべきです)。

スキルアップ/キャリアアップ(JOB@IT)