リクエストスコープを利用しサーブレットからJSPへ値を渡す
11.2 リクエストスコープを利用しサーブレットからJSPへ値を渡す
本節では、JSP/サーブレットに用意されたスコープの1つであるリクエストスコープの利用方法について学習します。
11.2.1 オブジェクトの登録と取得
リクエストスコープにオブジェクトを登録する場合、以下の書式を利用します。
書式:リクエストスコープへのデータの登録
変数requestは、javax.servlet.http.HttpServletRequestインタフェースのオブジェクトです。
HttpServletRequestインタフェースのオブジェクトに用意されたsetAttribute()メソッドを利用することで、リクエストスコープへデータを登録することができます。メソッドの引数には、登録するデータの名前と登録するデータを渡します。次は、リクエストスコープからデータを取得する書式です。
書式:リクエストスコープからのデータの取得
HttpServletRequestインタフェースのオブジェクトに用意されたgetAttribute()メソッドを利用することで、リクエストスコープからデータを取得することができます。メソッドの引数には、登録されたデータの名前を渡します。また、リクエストスコープから取得したデータはObject型のデータに変換されているため、登録する前のデータ型へキャストする必要があります。
では、リクエストスコープを利用してサーブレットとJSP間でデータを共有するプログラムを作成してみましょう
リクエストスコープを利用しサーブレットからJSPへデータを渡すプログラム
サーブレット内で定義した文字列をリクエストスコープに登録し、その文字列をJSPで受け取り画面に表示するプログラムです。リクエストスコープへのデータの登録方法とリクエストスコープからのデータの取得方法について学習しましょう。
実行結果
アプリケーション構成
➢ UseRequestServlet1.java① ソース・フォルダ :web_basic/WEB-INF/src
② パッケージ :ch11
③ 名前 :UseRequestServlet1
④ スーパークラス :javax.servlet.http.HttpServlet
⑤ アクセスURL :http://localhost:8080/web_basic/UseRequestServlet1
package ch11; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class UseRequestServlet1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //リクエストスコープへの登録 request.setAttribute("bookTitle", "JSP/サーブレットの本"); request.getRequestDispatcher("/view/ch11/useRequest1.jsp").forward(request, response); } }➢ web.xml
<servlet> <servlet-name>UseRequestServlet1Mapping</servlet-name> <servlet-class>ch11.UseRequestServlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>UseRequestServlet1Mapping</servlet-name> <url-pattern>/UseRequestServlet1</url-pattern> </servlet-mapping>
➢ useRequest1.jsp① 親フォルダの入力または選択 :web_basic/view/ch11
② ファイル名 :useRequest1.jsp
③ アクセスURL :UseRequestServlet1.javaからの画面遷移でアクセスされる
<%@page contentType= "text/html; charset=UTF-8" %> <% //リクエストスコープからのデータの取得 String bookTitle = (String)request.getAttribute("bookTitle"); %> <html> <head> <title>リクエストスコープを利用したプログラム</title> </head> <body> 本の名前:<%= bookTitle %> </body> </html>
解説
このプログラムは、サーブレット内の13行目でsetAttribute()メソッドを利用し、リクエストスコープにデータを登録しています。setAttribute()メソッドの第1引数に「bookTitle」という文字列を渡しています。この第1引数が、登録するデータの名前になります。また、第2引数には「JSP/サーブレットの本」という文字列を渡しています。この文字列が、実際にリクエストスコープに登録されるデータです。
図 11.2.1: リクエストスコープへのデータ登録の流れ
ここで1つ注意する点があります。setAttribute()メソッドの第2引数は、Object型と呼ばれるクラス型です。Object型は全てのクラスが継承している型なので、この型を引数とすることで、どのような型でも登録することができます。
setAttribute()メソッドによってリクエストスコープ内に登録される際に、String型の文字列「JSP/サーブレットの本」はObject型に自動型変換されて登録されます。
図 11.2.2:リクエストスコープへのデータ登録時の型変換
14行目では、フォワードを利用してuseRequest1.jspに転送を行っています。
useRequest1.jspへ処理の転送後は、5行目で登録された文字列を取得しています。
getAttribute()メソッドの引数に「bookTitle」という文字列を渡しています。この引数の文字列がリクエストスコープから取得するデータの名前になります。
図 11.2.3: リクエストスコープからのデータ取得の流れ
ここで注意する点は、登録されたデータはObject型で取得されることです。そのため、取得されたデータを適切に扱うためには、型をリクエストスコープへ登録される前の型に明示的に変換(キャスト)する必要があります。
図 11.2.4:リクエストスコープへのデータ登録時の型変換
このように、サーブレット内でリクエストスコープにデータを登録し、登録されたデータをJSP内で取得することで、データを共有することができるようになります。実行結果からわかるように、サーブレット内でリクエストスコープに登録した文字列をJSPで表示することができています。
また、このリクエストスコープへ登録可能なデータは、既存のクラスのデータだけではありません。
次のプログラムでは自作クラスのデータを登録するプログラムについて確認します。
11.2.2 自作クラスのデータの登録と取得
前節では、既存のクラス型であるString型の文字列をリクエストスコープに登録するプログラムを作成しました。
リクエストスコープに登録可能なデータは既存のクラス型だけではありません。自作したクラスのデータについても同様に扱うことができます。
自作クラスのデータを渡すプログラム
サーブレット内で自作クラスのデータをリクエストスコープに登録し、そのデータをJSPで受け取り画面に表示するプログラムです。リクエストスコープに登録された自作クラスのデータを取得し画面に表示できることを確認しましょう。
実行結果
アプリケーション構成
➢ User.java① ソース・フォルダ :web_basic/WEB-INF/src
② パッケージ :ch11
③ 名前 :User
package ch11; public class User { private String name; private int age; public User() { this.name = "名無し"; this.age = 0; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
➢ UseRequestServlet2.java① ソース・フォルダ :web_basic/WEB-INF/src
② パッケージ :ch11
③ 名前 :UseRequestServlet2
④ スーパークラス :javax.servlet.http.HttpServlet
⑤ アクセスURL :http://localhost:8080/web_basic/UseRequestServlet2
package ch11; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class UseRequestServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Userオブジェクトの生成 User objUser = new User(); objUser.setName("神田タロー"); objUser.setAge(25); //リクエストスコープへのUserオブジェクトの登録 request.setAttribute("RequestUser", objUser); request.getRequestDispatcher("/view/ch11/useRequest2.jsp").forward(request, response); } }➢ web.xml
<servlet> <servlet-name>UseRequestServlet2Mapping</servlet-name> <servlet-class>ch11.UseRequestServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>UseRequestServlet2Mapping</servlet-name> <url-pattern>/UseRequestServlet2</url-pattern> </servlet-mapping>
➢ useRequest2.jsp① 親フォルダの入力または選択 :web_basic/view/ch11
② ファイル名 :useRequest2.jsp
③ アクセスURL :UseRequestServlet2.javaからの画面遷移でアクセスされる
<%@page contentType= "text/html; charset=UTF-8" %> <%@page import="ch11.User" %> <% //リクエストスコープからのデータの取得 User objUser = (User)request.getAttribute("RequestUser"); String name = objUser.getName(); int age = objUser.getAge(); %> <html> <head> <title>自作クラスのオブジェクトを登録する</title> </head> <body> 名前は:<%= name %><br> 年齢は:<%= age %><br> </body> </html>
解説
このプログラムは、自作クラスであるUserクラスを定義しています。このクラスには1人分の名前と年齢を格納するフィールド変数とアクセサメソッドが定義されています。
サーブレット内でUserクラスのオブジェクトをリクエストスコープに登録し、フォワード先のJSPでオブジェクトを取得し、オブジェクト内のデータを画面に表示しています。
UseRequestServlet2.javaの14行目から16行目でUserオブジェクトを生成しています。その際に、名前を「神田タロー」、年齢を「25」と設定しています。
19行目でリクエストスコープにUserオブジェクトを登録し、20行目でuseRequest2.jspへ処理を転送します。
useRequest2.jspでは、自作のクラスであるUserクラスを利用するため、ページディレクティブを利用してインポートを行なっています。
useRequest2.jspへ処理の転送後は、6行目で登録されたUserクラスのオブジェクトを取得しています。このオブジェクトの型は元はUser型なので、User型へキャストを行います。
7行目、8行目ではUserクラスのオブジェクトに用意されたゲッターメソッドを利用して名前と年齢のデータを取得しています。
実行結果からも分かるように、サーブレット内でリクエストスコープに登録した自作クラスのオブジェクトをJSPで取得し、オブジェクト内のデータを表示することができます。このように、既存のクラス型以外にも自分で作成したクラスのオブジェクトを扱うことも可能です。