竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
【scope = "session"】?
by rapuntuleru[rapuntuleru]
(おそらく初歩的な文法のことなので場違いかもしれませんが)
 今、私は「Java+MySQL+Tomcatで作る掲示板とブログ」の195ページ(非登録ユーザの利用制限)前後を読んでいるのですが、193pや195pに出てくる<jsp:useBean class...scope="session">の記述のscope="session"の意味がわかりません・・・
 一応、195pの例で言うとBbsUserクラスのインスタンスをuserという名前でセッションの範囲で作った、という感じで理解しているのですが特に「セッションの範囲内」という意味がわかりません。
 (多分「セッション」がよく分かってないのかなと思っているのですが)セッションのオブジェクトは今までどこにも取得していないのに、何でいきなりここで出てくるんだ?といった形で疑問になっています。
 よろしくお願いします。
投稿:rapuntuleru[rapuntuleru]/2007年 04月 06日 17時 15分 /更新:2007年 04月 06日 17時 17分
スコープ=参照域
by KILROY[KILROY]
 「スコープ」というのは「見る」の意味です。「遠くを見る」のが「テレスコープ」だし、「小さいものを見る」のが「マイクロスコープ」。その bean がどこから「見える」か、つまりどの範囲内だったら参照できるか、が「スコープ」です。
 「page」というのがいちばん狭い範囲であり、ファイルの中に書いてあったら、そのファイルの終わりまででしか参照できません。 つまりは生成される Java プログラムに「 private 」かつ「 static でない」メンバ変数として埋め込まれる要素です。パッと定義してその場で使い終わったらすぐ消しちゃう、みたいな一時的な使用法が普通。 JaMyTo シリーズだとあんまり使われてませんが、「表示用にデータベースから一連のデータを引っ張ってくるときに使う、データを保持する bean 」のような「重い」 bean はこの page スコープを使うのが普通です。
 もっと広く、「サイトにアクセスしてから、ログオフするまでに共通して使う bean 」の場合は「session」スコープを使います。「session」というのは、「(一曲分の)演奏」みたいな意味にも使い(ジャズ用語の「ジャム・セッション」とか)、「何かが始まってから終わるまで」を表わします。「二重サブミットの防止」のときに使う「何回アクセスしたか」を数えるカウンターとか、ユーザの ID なんかを保持する bean なんかは、この「session」スコープで管理されます。なお、これは通常 cookie を使って管理されるのが普通ですが云々(うんぬん)、みたいな話は難しくなるので割愛。とりあえず、「 Tomcat が現在アクセスしている一人ひとりのユーザに対して用意している領域があり、それが『 session 』というコンテキストで参照できる」ということであり、それがセッション ID と一対一対応している、ということだけ把握しておいてください。
 いちばん広いのがアプリケーション・スコープで、 Tomcat が各アプリケーションごとに保持しているデータです。たとえばオンライン・ゲームで「現在アクセスしているプレイヤーの情報を管理する bean 」とかいうのは通常「 singleton 実装」(JavaBeans は普通 setHoge() にしろ getHoge() にしろ this に対して値を set/get するんですが、 singleton 実装だと static 領域に対して set/get します。このあいだ「ココをいじるともっと快感(その6)」に書いたデータベースのコネクションを返す Class なんかがこのタイプ)といった手を使って、「すべてのユーザから共通して見える領域」というのを実現するのですが、これをやっちゃうと JRE が共通だと異なったアプリケーションで同じものが見えてしまったりします。これを bean にして JSP のアプリケーション・スコープで管理すると、どこかで useBean を使用した瞬間に領域が確保され、以降同じアプリケーションの中で同じ名前で参照すると、つねに同じインスタンスが使用されます。
投稿:KILROY[KILROY]/2007年 04月 06日 22時 41分 /更新:2007年 04月 07日 06時 49分
RE:
by rapuntuleru[rapuntuleru]
ありがとうございます。
なるほど。もう少し色々試しながら勉強していこうと思います。
投稿:rapuntuleru[rapuntuleru]/2007年 04月 08日 12時 45分 /更新:2007年 04月 08日 12時 45分