最終更新日:190524 原本2012/06/02

サーブレットとJSP/HTMLのやりとり (3/5)

■JSPにフォワードして結果を表示する

もう1つの方法は、フォワードで結果を表示するJSPに表示を切り替えるというものです。サーブレットから結果を表示するJSPをフォワードで表示させれば、サーブレットで画面の表示などを行う必要はなくなります。

ただし、この方法を使う場合、「どうやってサーブレットから、フォワード先のJSPに結果のデータを渡すのか」ということを考えておかないといけません。では、これもサンプルを挙げながら説明をしましょう。


下のリスト欄にあるのは、フォームを持ったJSPと、その送信先となるサーブレットのソースコードです。helo.jspにアクセスしフォームに整数を書いて送信すると、/mygaeappにPOSTで送信され、そのままhelo.jspにフォワードされます。このとき、「Result:○○」というように、サーブレットで合計した結果が表示されます。

ここでは、サーブレットからJSPへ必要な値を渡すのに、以下のような処理をしています。

・サーブレットで値を保管する
request.setAttribute("input", param);
request.setAttribute("result", result);

・JSPで値を取り出す
<%=request.getAttribute("result") %>
<%=request.getAttribute("input") %>

requestは、HttpServletRequestクラスのインスタンスでしたね。この「setAttribute」というメソッドを呼び出すことで、、HttpServletRequest内に値を保管しておくことができます。これは、「getAttribute」メソッドでいつでもとり出すことができます。これらのメソッドの使い方を整理すると以下のようになります。

・値の保管
《HttpServletRequest》.setAttribute( 名前 , 値 );
・値の取得変数 = 《HttpServletRequest》.getAttribute( 名前 );

これで、HttpServletRequest(リクエスト)に値を保管できるようになりました。後は、フォワードを使ってJSPに表示を切り替えるだけです。この処理は、実は意外と面倒なのです。以下に整理しましょう。

1. ServletContextを取得する
ServletContext app = this.getServletContext();
ServletContextというのは、現在動いているWebアプリケーションを管理するためのものです。このインスタンス内に、Webアプリケーションに関する重要な機能がまとめられています。

2. RequestDispatcherを取得する
RequestDispatcher dispatcher = app.getRequestDispatcher("/helo.jsp");
ServletContextから「RequestDispatcher」というインスタンスを取得します。これは、リクエストをディスパッチ(別のものに掛け替える)するためのものです。まぁ、とりあえずは「この中に、フォワードがメソッドとして用意されているんだ」という点だけわかればOKでしょう。

3. forwardメソッドでフォワードする
try {
    dispatcher.forward(request, response);
} catch (ServletException e) {
    out.println(e);
}
取得したRequestDispatcherに用意されている「forward」でフォワードが実行されます。引数にはHttpServletRequestHttpServletResponseを指定します。これらは、いずれもdoGet/doPostで引数に渡されるインスタンスをそのまま設定しておけばよいでしょう。

フォワードは、forwardというメソッドで実行されますが、それを呼び出すまでにいろいろインスタンスを取得していかなければいけません。ServletContextRequestDispatcherを取得し、その中のメソッドを呼び出して初めてフォワードが実行されるのです。

●プログラム・リスト●

*program list*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
※helo.jsp
 
<%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
    font-size: 16pt;
    background: #AAFFAA;
    padding: 5px;
}
</style>
</head>
<body>
    <h1>Hello App Engine!</h1>
    <p>Result: <%=request.getAttribute("result") %></p>
    <hr>
    <p id="msg">※整数を入力:</p>
    <form method="post" action="/mygaeapp">
    <table>
        <tr>
            <td>入力</td>
            <td><input type="text" id="input" name="text1"
                value="<%=request.getAttribute("input") %>"></td>
        </tr>
        <tr>
            <td></td>
            <td>
                <input type="submit" value="送信する">
            </td>
        </tr>
    </table>
    </form>
</body>
</html>
 
 
※MyGaeAppServlet.java
 
package com.tuyano.libro.mygaeapp;
 
import java.io.*;
import java.net.URLDecoder;
 
import javax.servlet.*;
import javax.servlet.http.*;
 
@SuppressWarnings("serial")
public class MyGaeAppServlet extends HttpServlet {
     
    public void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws IOException {
        response.setContentType("text/plain");
        request.setCharacterEncoding("utf8");
        response.setCharacterEncoding("utf8");
        PrintWriter out = response.getWriter();
        out.println("Hello, world!");
    }
 
    public void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws IOException {
        response.setContentType("text/html");
        request.setCharacterEncoding("utf8");
        response.setCharacterEncoding("utf8");
        String param = URLDecoder.decode(request.getParameter("text1"),"utf8");
        PrintWriter out = response.getWriter();
        int result = 0;
        try {
            int n = Integer.parseInt(param);
            for(int i = 1;i <= n;i++){
                result += i;
            }
        } catch (NumberFormatException e) {
            out.println(e);
        }
        request.setAttribute("input", param);
        request.setAttribute("result", result);
        ServletContext app = this.getServletContext();
        RequestDispatcher dispatcher = app.getRequestDispatcher("/helo.jsp");
        try {
            dispatcher.forward(request, response);
        } catch (ServletException e) {
            out.println(e);
        }
    }
}