齷齪その2 sessionというものについて
2007年 11月 28日
今日は講義の無い日、なので、
今度こそ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で使用できなかったのか。
使用している参考書には
「セッションスコープに登録されたデータでは、リクエストをまたいでデータを受け渡すことができる」
と書いてあります。
じゃあできると思うんですが・・・。これ解決できた方教えてください。
今度こそ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で使用できなかったのか。
使用している参考書には
「セッションスコープに登録されたデータでは、リクエストをまたいでデータを受け渡すことができる」
と書いてあります。
じゃあできると思うんですが・・・。これ解決できた方教えてください。
by poppy_h
| 2007-11-28 02:05
| 情報技術