【JavaWebアプリ入門 #09】リクエストスコープ/転送

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は…

JavaWebアプリ入門 #09
リクエストスコープ
転送

というテーマでお送りします。

彩香
興味を持って 楽しんで学んでいくと
吸収が早い事に、最近 気づきました。

今回も、楽しみです。宜しくお願いします。

剛留
ご飯を食べる時に大切なことは
よく噛む事だと、最近 気づきました。

健康状態を良くして、Javaの勉強も頑張ります。
今回も、よろしくお願いします。

【1】 リクエスト転送

① サーブレットの処理

前回まで見てきた、サーブレットの処理では
Webブラウザから リクエスト が送られると…

対応する サーブレットの doGet() メソッドまたは
doPost() メソッドが起動されます。

そして、内部的に 処理を行って
最終的に レスポンスの生成をして…

それが Webブラウザに返される というものでした。

今回は、このリクエストを

別のサーブレットに転送する

…という事を 見ていきましょう。

② 転送の流れ

流れは、このようになります。

❶ Webブラウザからの リクエスト が送られます。

❷ 対応する サーブレットA の doGet() メソッドまたは
doPost() メソッドが起動され内部的に処理を行います。

❸ そして、別のサーブレットB にリクエストを転送します。
他のサーブレットに 残りの処理を任せる感じです。

❹ サーブレットB の doGet() メソッドまたは
doPost() メソッドが起動され 内部的に処理を行った後…

レスポンスの生成を行います。

❺ 最終的に レスポンスは Webブラウザに送られます。

彩香
質問です。1つのサーブレットで処理できるのに
どうして、わざわざ転送なんて、するんですか?
みのる
疑問を持って 学んでいくことも、楽しんで学んでいる
証拠かも知れませんね。良いですね…。

③ 転送の意味

さて、転送する意味ですね。

今のところは、プログラムが小さいので
1つのサーブレットで処理したほうが簡単ですね。

そして、段々と処理が複雑化してくると
分割したほうが、考えやすくなります。

転送は、Webコンテナと協力して動作する
Webアプリの 「 処理分割の手法 」 なのです。

のちのち、プログラムが大きくなってくると
効果を実感できると思います。

今のところは、こういう方法があるんだ…
という感じで 考えておきましょうか…。

彩香
先々に 生きてくるんですね。
楽しみにして、転送の基本を学びます。

④ リクエスト転送2ステップ

では、続いて リクエスト転送
2ステップを見ていきましょう。

❶ 転送オブジェクトの取得

引数で受け取った request オブジェクトの
getRequestDispatcher() メソッドを使って…

RequestDispatcher型のオブジェクトを取得します。
転送のために必要なオブジェクトと考えましょう。

getRequestDispatcerに渡す引数は
転送先の URLパターンです。

❷ 転送処理

❶ で取得した RequestDispatcher型のオブジェクト
(ここでは dispatcher という変数名を使っていますが)の…

forward()メソッドを呼び出します。

ここで、forward()メソッドに渡す引数は…

doGet() または doPost() で受け取った引数を
そのまま渡すこととなります。

【2】 リクエストスコープ

① リクエストスコープとは

リクエストスコープは
サーバの中に確保される データ保存領域です。

そして、このリクエストスコープは…

リクエストを受けてから、レスポンスを返すまで
利用可能となります。

リクエストスコープに データが保存れる時には
必ず「属性名」と「値」がセットになっています。

この例では、name という属性名 で
「たかはし」という値が保存されて…

gender という属性名で
「男」という値が保存されます。

イメージ的には、変数名と その値 という感じです。

剛留
質問です。

リクエストを受けてから、レスポンスを返すまで 利用可能な
リクエストスコープは、どんな時に使うんですか?

みのる
利用場面を想定するのも良いですね。

そして、これは 先程の リクエスト転送と
組み合わせて 使う事が多いんです。

② リクエスト転送 と リクエストスコープ

リクエスト転送の中で、リクエストスコープを
使う流れは、こんな感じです。

❶ Webブラウザからの リクエスト が送られます。

❷ 対応する サーブレットA の doGet() メソッドまたは
doPost() メソッドが起動され内部的に処理を行います。

❸ 転送先で 必要なデータを リクエストスコープに格納します。

❹ そして、別のサーブレットB にリクエストを転送します。

❺ 転送先 のサーブレットB では、必要なデータを
リクエストスコープから取得します。

❻ サーブレットB は、内部的に処理を行った後…
レスポンスの生成を行います。

❼ 最終的に レスポンスは Webブラウザに送られます。

という流れになるのです。
こんな感じで、大丈夫そうですか…?

剛留
分割の手法のための、保管領域なんですね。
基本をバッチリ学んでおきます。

③ リクエストスコープ利用方法

❶ データを格納する場合

引数で受け取った request オブジェクトの
setAttribute() メソッドを呼び出して格納します。

setAttribute() に渡す引数 は
属性名(String型), 値(Object型) です。

指定した属性名のデータが存在した場合
上書きします。

❷ データを取得する場合

引数で受け取った request オブジェクトの
getAttribute() メソッドを呼び出して 取得します。

getAttribute() に渡す引数は 属性名(String型)で
戻り値は 値(Object型) です。

結果は (Object型) ですので 元のデータ型に
ダウンキャストして使用します。

取得した戻り値の左側に () 丸括弧で 元のデータ型を
記述してキャストします。

また、指定した属性名のデータが存在しない場合の
戻り値は null となります。

【まとめ】

【1】 リクエスト転送
✅ サーブレットは、リクエストを
  別のサーブレットに 転送できる。
【2】 リクエストスコープ
✅ サーバの中に確保される
  データ保存領域。

✅ 保存期間は
  リクエストを受けてから
  レスポンスを返すまで。

✅ 主に、リクエスト転送と
  組み合わせて活用する。