日記を書きつつ、意見を書いたり語ってみたり


by poppy_h
カレンダー
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

齷齪その2 sessionというものについて

今日は講義の無い日、なので、
今度こそJavaのみを齷齪とやってました!

で!目標のショッピングカート、予定部分まで完成!

ちょっと参考までにセッション(session)というものについて説明。

今回、sessionとは、クライアント単位の接続のこと。
前にも言いましたが、普通に実装すると、データの共有が起こってしまう、
つまり、自分のカゴに勝手に商品を入れられてしまう。

1人ごとにカゴ、ショッピングカートは必要ですね。
そこでこのsessionというものを利用します。

利用するにはまず
javax.servlet.http.HttpSessionが必要。

めんどくさいので
import javax.servlet.http.*;
と記述しちゃいましょう。

まずセッションの取得を行います。

HttpSession session = request.getSession();
これでセッションを取得しています。

セッションからオブジェクトを取得
たとえば
Integer count = (Integer) session.getAttribute("count");

これはint型のオブジェクトを取得しています。
session.getAttribute()のカッコの中身に注目。
sessionはStringで管理するのです。
つまり、保管しておきたいデータをStringで名前を付けて、管理するってことです。
そのなずけたStringを入れることで、その補完データを読み出すのです。

これは自分で用意したクラスでも可能

たとえば私はShopstaという、書籍情報を保持するクラスを作りました。

Shopsta cart = (Shopsta) session.getAttribute("cart");

これでまるまる保持していたものを呼び出せます。

まぁこれはこれで問題発生したりもしましたが、その辺は後半に書きます。


呼び出したものを書き換えたり、そんな処理の後にはまたその変化後のデータを保管したい、
そういうための記述がこちら
session.setAttribute("count", count);

そう、countというStringで名前をつけ、countというオブジェクトを保管する。

分かりやすい仕組みですね。


どうしてsessionを使うとカゴ(つまりデータ)の共有が起こらないの?という人のためにちょっとした解説。
セッションを取得した際に、セッションIDというものが発行されます。
ちなみにsession.getId();でIDの表示できます。

そのIDで人を判断して、データの振り分けを行ってるわけですね。
これが原因でメモリーリークとかで重大なエラーが起こったりもすることもあるようで。

セッションはデフォルトで30分でタイムアウトするようです。
つまり、30分アクセスのなかったデータは、アクセスできなくなってしまう。
Hotmailとかでセッションの取得がどうたら、出てきたのはそういう理由です。
もちろんこちらも指定できます。


さて、すごいこまったのがJSPのとき。
というのもセッションで取得できない、というエラーが発生したのです。
Javaサーブレットではセッションの取得ができるのに、JSPで記述するとダメ。

これ、私以外にも悩んでる人いました。

そんな人のための解決法。
サーブレットにて、sessionを取得、これは大丈夫ですね。
そして、書き換えたものをsessionに格納、これも同じです。

JSPエラー回避法、それは
request.setAttribute("count", count);
この記述で行うこと。

sessionじゃなくてrequestを使うのです。

呼び出す側(JSP側の記述)はもちろん
Integer count = (Integer) request.getAttribute("count");

これで呼び出せます。

セッションスコープじゃなくてリクエストスコープでやるという手。
これで解決できました。


さてさて、しかしセッションはなぜJSPで使用できなかったのか。
使用している参考書には
「セッションスコープに登録されたデータでは、リクエストをまたいでデータを受け渡すことができる」
と書いてあります。
じゃあできると思うんですが・・・。これ解決できた方教えてください。
[PR]
by poppy_h | 2007-11-28 02:05 | 情報技術