また週末ランニングしました。タコです。
もう桜は緑になりかけてて、変わりに土手沿いは蚊柱がプンプンたってました…。
その中を全力で突っ切って、ランニングしておりました。そんな週末。
蚊、口の中に入ってないかな…
もう夏が近づいている気がしますね。。。
僕は季節でいうと何故か、夏が一番好きなんですけど
走るのに夏は向いてないですねー
あついし。
ってことで今日も研修がんばります
今日はスコープについて学びます!
楽しいね!JSPも!
最初、ぱっと見難しそうで近寄りがたいJSPとServletくんでしたが、
心に寄り添って会話してみると
楽しい。
だいぶ仲も良くなってきたと思います(?)
でスコープなんですけど
どんな役割をもってるかというと
インスタンスを保存してくれます!
これがとっても重要でWebアプリケーションに欠かせない技術なんですね。
スコープといってもいくつかあります!
それぞれインスタンスを保存、使用できる範囲が違うのです!!
リクエストごとに生成されます。
一度レスポンスを返すと保存されたインスタンスは消えちゃいます。
だからリクエストをまたぐことはできません!
リクエスト内だけが範囲です!
フォワード先のJSPでは保存されたインスタンスは使えますが、
リダイレクトしたら消えちゃいます!
リクエストスコープはリクエストごとに生成するので、ユーザーごとにインスタンスを保存することも可能です!
そんなリクエストスコープです!
リクエストスコープに保存
1 |
request.setAttribute("属性名",インスタンス); |
既に同じ属性名でインスタンスが保存されてたら上書きされます。
リクエストスコープからインスタンスを取得
1 |
取得するインスタンスの型 名前 = (取得するインスタンスの型)request.getAttribu("属性名"); |
簡単!便利~!
セッションスコープに保存したインスタンスは、リクエストをまたいで使える!
ブラウザを閉じるまで利用できる!
リクエストスコープより範囲が広いんです!
そんなセッションスコープ。
書き方はリクエストスコープとはちょっとだけ異なります。
ちょっとだけ。
セッションスコープの取得
1 |
HttpSession session = request.getSession(); |
まず最初にセッションスコープ自体を取得します!このインスタンスのメソッドを使ってインスタンスの出し入れをするんですな.
セッションスコープに保存
1 |
session.setAttribute("属性名",インスタンス); |
リクエストスコープの保存と同じですね!
セッションスコープのインスタンスを取得
1 |
取得するインスタンスの型 名前 = (取得するインスタンスの型)session.getAttribu("属性名"); |
セッションスコープ自体を破棄
セッションスコープは使用できる範囲が広いから、
ずっとインスタンスを保存している必要がある。
でも保存だけしていたらどんどんインスタンスが溜まっていって
メモリがいっぱいになってしまいます。
それを防ぐために
セッションスコープ内のインスタンスや、
場合によってはセッションスコープそのものを破棄する必要があるんです!
スコープ内のインスタンスを削除
1 |
session.removeAttribute("属性名") |
スコープ自体を破棄
1 |
session.invalidate() |
ひとつのアプリケーションにつき一つ作成されるスコープです。
Webアプリケーションが終了するまでの間、
アプリケーション内のすべてのサーブレットクラスとJSPファイルで利用できます!
ユーザー別ではないから、アプリケーションスコープは全ユーザー共通です!
複数のリクエストで、ほぼ同時にアプリケーションスコープ内のインスタンスに変更を加えたり更新をすると、
リクエストが反映されないような不具合が起こることがあります…!
これは一つ目のサーブレットクラスが更新する前に
二つ目のサーブレットクラスが次のリクエストを取得してしまっているせい。
そうなる可能性があるのならアプリケーションスコープは使わないのが正しい判断です。
Webアプリケーションを終了するとアプリケーションスコープに保存したインスタンスは削除されます!
アプリケーションスコープを取得
アプリケーションスコープは
ServletContextクラスのメソッドを使ってインスタンスの出し入れをします!
1 |
ServletContext application = this.getServletContext(); |
保存・取得・削除
保存、取得、削除はリクエストスコープやセッションスコープと同じです!
1 2 3 4 5 6 7 8 9 |
アプリケーションスコープにインスタンスを保存 applicattion.setAttribute("属性名",名前); アプリケーションスコープからインスタンスを取得 取得するインスタンスの型 名前 = (取得するインスタンスの型)application.getAttribu("属性名"); アプリケーションスコープからインスタンスを削除 application.removeAttribute("属性名"); |
最後まで読んでいただきありがとうございますー
まとめますー
・スコープはインスタンスを保存して共有できる。
・リクエストスコープはリクエストごとに生成、リクエストはまたげない!
・セッションスコープはブラウザごとに生成、リクエストをまたげるが、削除が必須!
・アプリケーションスコープはアプリケーションごとに生成、全ユーザー共通の保存場所!複数ユーザーによる変更には注意!
気づけば、研修もあと半分!?
一日一日を大切に、大切にがんばっていきましょーーー!!
それじゃまたーーーーー