はじめに
研修でサーブレットとJSPについて学習する機会がありました。研修の復習、自己学習の備忘録です。初心者向けの記事となります。
目次
1.スコープとは
2.リクエストスコープ
3.セッションスコープ
4.アプリケーションスコープ
1.スコープとは
インスタンスを保存できる領域のこと。スコープにインスタンスを保存することで、サーブレットクラスやJSPファイルが取得でき、共有が可能となる。スコープに保存できるのはインスタンスのみ。
2.リクエストスコープ
リクエストスコープは、リクエストごとに生成されるスコープ。保存したインスタンスは、レスポンスが保存されるまで利用できる。リクエストスコープを操作するのは、HttpServletrequestインスタンスのメソッドを使うのと同じとも言える。
User user = new User("rion0726ittoti", 22); //①インスタンスの生成
request.setAttribute("user", user); //②インスタンスの保存
User u = (User)request.getAttribute("user"); //③リクエストスコープからインスタンスを取得
①インスタンスの生成
インスタンスの生成です。わからない方は、https://qiita.com/rion0726ittoti/items/f1e6c467eebf90e811ac
を参照してください。
②インスタンスの保存
request.setAttribute("属性名",インスタンス);
setAttribute()メソッドを使用。
第一引数の属性名は、インスタンスに保存する名前です。自由に付けられます。
③リクエストスコープからインスタンスを取得
getAttribute()メソッドを使用。
取得するインスタンスの型 変数名 = (取得するインスタンスの型)request.getAttribute("属性名");
getAttribute()メソッドを使用。
引数には、②で指定した属性名を使う。このメソッドはObject型のインスタンスを返すので、キャストで元の型(例でいうと、User)に戻す必要がある。
3.セッションスコープ
リクエストをまたいでインスタンスを利用できる。セッションスコープに保存したインスタンスは開発者が有効期間を決められる。
User user = new User("rion0726ittoti", 22); //①インスタンスの生成
HttpSession session = request.getSession(); //②HttpSessionインスタンスの取得
session.setAttribute("user", user); //③セッションスコープにインスタンスを保存
User u = (User)session.getAttribute("user"); //④セッションスコープからインスタンスを取得
session.removeAttribute("user") //⑤セッションスコープからインスタンスを削除
②HttpSessionインスタンスの取得
セッションスコープはHttpSessionインスタンスであるため取得をする。これによりセッションスコープを操作できる。
③セッションスコープにインスタンスを保存
④セッションスコープからインスタンスを取得
③④については、リクエストの時と同じです。
⑤セッションスコープからインスタンスを削除
session.removeAttribute("属性名");
インスタンス削除をします。
インスタンスの削除であって、セッションスコープそのものは、破棄は以下の方法で行います。
セッションスコープの破棄
session.invalidate();
ユーザーログアウトのタイミングなどで使います。スコープ自体が破棄され、保存していたすべてのインスタンスが消滅します。スコープの破棄をどのタイミングで行うかを気をつけないと後の挙動に影響を与えます。(例えば簡単なTwitterアプリでユーザー登録後に投稿後、ログインユーザーのIDが取得できないなど)
4.アプリケーションスコープ
1つのアプリケーションにつき1つだけ作成される。アプリケーションに保存されたインスタンスは、WEBアプリケーションが終了されるまでの間、アプリケーション内の全てのサーブレットクラス、JSPファイルで利用可。
User user = new User("rion0726ittoti", 22); //①インスタンスの生成
ServletContext application = this.getServletContext(); //②ServletContextインスタンスの取得
application.setAttribute("user", user); //③アプリケーションスコープにインスタンスを保存
User u = (User)application.getAttribute("user"); //④アプリケーションスコープからインスタンスを取得
application.removeAttribute("user") //⑤アプリケーションスコープからインスタンスを削除
②ServletContextインスタンスの取得
サーブレットクラスのスーパークラスであるHttpServletから継承したgetServletConetxt()メソッドで取得。
③アプリケーションスコープにインスタンスを保存
④アプリケーションスコープからインスタンスを取得
⑤アプリケーションスコープからインスタンスを削除
③④⑤については、セッションスコープと同じです。
初心者にとってはスコープって言われても何?、どこで使うの?となるかもしれません。私も最初はそうでした。また、現場ではサーブレットなんてあまり使わないよという方もいるかと思います。個人的には、ここらへんの知識は基礎であり、ここをしっかりと学んでこそ次のステップに活かされると思っています。
参考文献
志賀澄人 スッキリわかるサーブレット&JSP入門 株式会社インプレス