リクエストスコープ(サーブレット、JSP、JavaBeansの連携)
(ブログ記事の一覧は「こちら」)
「サーブレット」「JSP」「JavaBeans」で学んだものを組み合わせて作成します。
ここで、MVC(Model View Controller)モデルという考え方について確認しておきましょう。
様々なアプリを作成するとき、ある程度の規模になる場合は、プログラム全体の設計を行うことが必要になりますが、ここで一般的によく使われるものとしてMVCモデルがあります。
今回のJavaによるWebアプリでは、それぞれ以下に該当します。
基本的な仕組みとして、「C(Controller)」から処理を開始して、「C」が「M(Model)」で定義しているデータ形式でデータを受け取り、「C」が「M」でのデータを「V(View)」に渡して表示する、という流れになります。
ウィキペディア(Wikipedia)のページも参考にしてください。
リクエスト(request)スコープ
スコープとは、データの有効な範囲のことです。
リクエストスコープとは、クライアントからのリクエスト(request)とサーバーからのレスポンス(Response)の間でのスコープのことです。
つまり、MVCモデルで作成したプログラム間でデータが保持されるので、便利な活用ができます。
以下は、UserInfoクラス(JavaBeans)を対象とした、リクエストスコープへの保存とインスタンスの取得のプログラム例です。
リクエストスコープに保存
// UserInfoクラス(JavaBeans) UserInfo userInfo = new UserInfo(); userInfo.setName(strName); userInfo.setHobby(strHobby); // リクエストスコープに保存 request.setAttribute("user_info", userInfo);
リクエストスコープからインスタンスを取得
// リクエストスコープからUserInfoクラスのインスタンスを取得 UserInfo userInfo = (UserInfo) request.getAttribute("user_info");
"user_info" は属性名です。保存と取得のときに文字列として一致していれば、属性名は自由に設定して問題ありません。
サンプル1(MVC)
「フォワード」のページのサンプルに対して、MVCモデルに合わせた書き方に変更してみましょう。
「HTMLファイル」
⇒ ((「サーブレットクラス」 ↔ 「JavaBeans」)→ 「JSPファイル」)
フォワードのページのサンプルでは、MVCモデルの「VC」を使用した書き方になっていました。これにJavaBeansの仕様にあてはまるクラスを追加することで、MVCモデルを完成させましょう。
【M】JavaBeans(UserInfo.java)
JavaBeansで作成したクラスを使用します。
【V】JSP(result.jsp)の修正
JavaBeansで定義したUserInfoクラスを呼び出し、各項目のデータを取得しています。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.test.UserInfo" %> <% // UserInfoクラス(JavaBeans) UserInfo userInfo = (UserInfo) request.getAttribute("user_info"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% // 文字コードをセット(日本語の文字化けを避ける) request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); %> <p> name:<%= userInfo.getName() %> </p> <p> hobby:<%= userInfo.getHobby() %> </p> </body> </html>
【C】サーブレット(MainServlet.java)の修正
doPostメソッドを修正します。
JavaBeansで定義したUserInfoクラスを呼び出し、各項目のデータをセットして、JSPにフォワードしています。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); String strName = request.getParameter("name"); String strHobby = request.getParameter("hobby"); // UserInfoクラス(JavaBeans) UserInfo userInfo = new UserInfo(); userInfo.setName(strName); userInfo.setHobby(strHobby); request.setAttribute("user_info", userInfo); // フォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp"); dispatcher.forward(request, response); }
サンプル2(メソッドの追加)
JavaBeansに新たなメソッドを追加して、そのメソッドを使用するサンプルを作成します。
【M】JavaBeans(UserInfo.java)への追加
新たなメソッドを追加します。下のプログラムを見てわかるように、「名前」「趣味」のデータを含む文章を返すメソッドを作成します。
package com.test; import java.io.Serializable; public class UserInfo implements Serializable { private String name; private String hobby; ... (省略) // 以下を追加 public String getUserInfoSentence() { return "名前は" + this.name + "です。趣味は" + this.hobby + "です。"; } }
【V】JSP(result.jsp)の修正
上のJavaBeansで追加したメソッドを呼び出します。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.test.UserInfo" %> <% // UserInfoクラス(JavaBeans) UserInfo userInfo = (UserInfo) request.getAttribute("user_info"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% // 文字コードをセット(日本語の文字化けを避ける) request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); %> <p> <% if (userInfo != null) { %> <%= userInfo.getUserInfoSentence() %> <% } %> </p> </body> </html>
【C】サーブレット(MainServlet.java)
サーブレットについては、修正は不要です。
課題
上記のサンプルについて、入力項目を「名前」「趣味」から、「特技」を加えたものに修正してください。