リクエストスコープ(サーブレット、JSP、JavaBeansの連携)

(ブログ記事の一覧は「こちら」)

サーブレット」「JSP」「JavaBeans」で学んだものを組み合わせて作成します。

ここで、MVC(Model View Controller)モデルという考え方について確認しておきましょう。

様々なアプリを作成するとき、ある程度の規模になる場合は、プログラム全体の設計を行うことが必要になりますが、ここで一般的によく使われるものとしてMVCモデルがあります。
今回のJavaによるWebアプリでは、それぞれ以下に該当します。

  • M(Model):JavaBeans
  • V(View):JSP(JavaServer Pages)
  • C(Controller):サーブレット 【 Controller(MVCのC)】

基本的な仕組みとして、「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

サーブレットについては、修正は不要です。

課題

上記のサンプルについて、入力項目を「名前」「趣味」から、「特技」を加えたものに修正してください。