(おそらく初歩的な文法のことなので場違いかもしれませんが)
今、私は「Java+MySQL+Tomcatで作る掲示板とブログ」の195ページ(非登録ユーザの利用制限)前後を読んでいるのですが、193pや195pに出てくる<jsp:useBean class...scope="session">の記述のscope="session"の意味がわかりません・・・
一応、195pの例で言うとBbsUserクラスのインスタンスをuserという名前でセッションの範囲で作った、という感じで理解しているのですが特に「セッションの範囲内」という意味がわかりません。
(多分「セッション」がよく分かってないのかなと思っているのですが)セッションのオブジェクトは今までどこにも取得していないのに、何でいきなりここで出てくるんだ?といった形で疑問になっています。
よろしくお願いします。
今、私は「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 を使用した瞬間に領域が確保され、以降同じアプリケーションの中で同じ名前で参照すると、つねに同じインスタンスが使用されます。
「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分
ありがとうございます。
なるほど。もう少し色々試しながら勉強していこうと思います。
なるほど。もう少し色々試しながら勉強していこうと思います。
投稿:rapuntuleru[rapuntuleru]/2007年 04月 08日 12時 45分
/更新:2007年 04月 08日 12時 45分