フォワード(サーブレット、JSPの連携)

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

これまで、サーブレットJSPについて学んできました。
プログラムの処理を書くにはサーブレットが向いていて、HTMLの出力を書くにはJSPが向いているといえます。

では、プログラムの処理をサーブレットに記述して、その結果のHTMLの出力をJSPに記述する、ということができれば、お互いのメリットを活かした実装ができるといえます。

それを実現する方法として「フォワード」と呼ばれるものがあります。フォワードを使用すると、処理を他のサーブレットJSPに転送することができます。

フォワードのサンプル

ここでは、サーブレットからJSPに転送するフォワードの例を確認していきましょう。

「HTMLファイル」 ⇒ (「サーブレットクラス」 → 「JSPファイル」)

サンプルでの具体的なファイル名は以下です。

「form.html」 ⇒ ( [MainServlet.java] → [result.jsp] )

サーブレットクラス(MainServlet.java

doPostメソッドに以下のコードを記述します。

@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    (省略)

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp");
        dispatcher.forward(request, response);
    }

}

RequestDispatcher クラスを使用することで、指定したオブジェクトにフォワードさせることができます。コードの例では「result.jsp」にフォワードさせています。

HTMLファイル(form.html)

サーブレットの説明で作成したサンプルと同じものです。(サーブレットクラス「MainServlet」に対してPOSTリクエストで送信しています。)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form action="/ServletAppTest/MainServlet" method="post">
        名前:<input type="text" name="name">
        趣味:<input type="text" name="hobby">
        <input type="submit" value="送信する">
    </form>

</body>
</html>

JSPファイル(result.jsp

JSPの説明で作成したサンプルと同じものです。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
<%= request.getParameter("name") %>
</p>
<p>
<%= request.getParameter("hobby") %>
</p>

</body>
</html>

実行

「form.html」を右クリックして、「実行」-「サーバーで実行」を選択します。

テキストボックスに入力して送信ボタンを押すと、入力したテキストが出力される画面に移動することを確認してください。

課題

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