2.2 リクエストスコープを利用したオブジェクトの共有

2.2 リクエストスコープを利用したオブジェクトの共有

Webアプリケーションで複数のクラスやファイルを連携して利用すると、処理中に作成されたデータやオブジェクトを他のクラスやファイルで共有したい場合が出てきます。そのため、Javaでは複数のクラスやファイル間でオブジェクトを共有できる領域が用意されています。この領域のことをスコープと呼んでいて、このスコープにオブジェクトを格納しておけば、他のクラスやファイルから必要に応じてオブジェクトを取り出し利用することができます。本節ではスコープの1つであるリクエストスコープについて学習します。

2.2.1 リクエストスコープの動作を知ろう

Webアプリケーションで複数のクラスやファイルを連携して利用すると、処理中に作成されたデータやオブジェクトを他のクラスやファイルで共有したい場合が出てきます。その結果、JavaのWebアプリケーションでは、1つの画面(View)を表示するまでに複数の処理(Controller)が呼び出されることがあります。
リクエストスコープは、ブラウザからWebページにアクセスした際に、そのページの表示が完了するまでの間、プログラム間でデータを共有することができます。つまり、1回のリクエストの処理が終わるまでに実行された全てのファイル内でオブジェクトを共有することができます。
ただし、リクエストの処理が終わるとスコープが破棄されるため、1回目のリクエスト時のオブジェクトを2回目のリクエストで利用することはできません。

リクエストスコープでは下の図のようにデータを共有することができます。

この図で示されているように、Controller①で登録したデータを、次のController②やViewで取得して扱うことができます。

2.2.2 リクエストスコープを利用するためのメソッド

リクエストスコープを利用する場合、Javaのプログラムでは、リクエストを扱う為のインタフェースであるjakarta.servlet.http.HttpServletRequestインタフェースに定義されたインスタンスメソッドを利用します。
このインスタンスメソッドには以下のようなものがありますが、Springでは後述する別の手段を使うので、参考程度に目を通していただければ大丈夫です。

リクエストスコープを利用するうえで重要なのは、以下の4点です。

  • 登録するデータには名前をつける。
  • 登録されたオブジェクトはObject型として登録される。
  • スコープからオブジェクトを取得する場合、名前を指定する。
  • スコープから取得したオブジェクトはObject型として返されるので適切な型にキャストする。

リクエストスコープの登録と取得について、凡例を元に案内します。まずは登録です。

書式:リクエストスコープに登録する

request.setAttribute("データの名前", 登録するデータ);

凡例:リクエストスコープに登録する

request.setAttribute("bookPrice", 2000);

変数requestは、jakarta.servlet.http.HttpServletRequestインタフェースのオブジェクトです。
HttpServletRequestインタフェースのオブジェクトに用意されたsetAttribute()メソッドを利用することで、リクエストスコープへデータを登録することができます。メソッドの引数には、登録するデータの名前と登録するデータを渡します。

次は、リクエストスコープからデータを取得する書式です。

書式:リクエストスコープから取得する

(登録したデータの型)request.getAttribute("データの名前");

凡例:リクエストスコープから取得する

(Integer)request.getAttribute("bookPrice");

HttpServletRequestインタフェースのオブジェクトに用意されたgetAttribute()メソッドを利用することで、リクエストスコープからデータを取得することができます。メソッドの引数には、登録されたデータの名前を渡します。また、リクエストスコープから取得したデータはObject型のデータに変換されているため、登録する前のデータ型へキャストする必要があります。

インタフェースとは

インタフェース(interface)とはJavaの仕組みの一つで、ある特定の機能の概要を記述したものです。
通常のクラス等とは異なり、メソッドの宣言をする際に具体的な記述ができないようになっていて、「この機能ではこういう処理をさせたいからメソッド名だけ挙げておくけど細かい処理内容はこのインタフェースを実装する各プログラムで決めてね」という形で使われる、雛形のようなプログラムです。
詳細はJava基礎(オプション)テキスト2章で案内していますので、時間があるときに精読してみると良いでしょう。

リクエストスコープに登録する名前

リクエストスコープにオブジェクトを登録するときには、そのオブジェクトの名前を付けます。
この名前はユニークな名前となっているため、わざと同じ名前で登録を行うと、前に登録されたオブジェクトが上書きされて消えてしまいます。そのため、似ているオブジェクトをリクエストスコープへ登録する際には、名前の付け方に注意が必要です。


NEXT>> 2.3 レスポンスを利用した画面表示内容の設定