サーブレットでのページリダイレクト - JSP

サーブレットでのページリダイレクト方法について紹介します。

サーブレットでページリダイレクトするには、context.getRequestDispatcher()メソッドを呼び出しRequestDispatcherを取得し、RequestDispatcher.forward()メソッドを呼び出してリダイレクトをします。

コード (JSPフォーム:input.jsp)

<%@page contentType="text/html"%>
<%@page 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>input.jsp</title>
  </head>
  <body>
    <h1>input.jsp</h1>
    <BR><HR><BR>
    <DIV align="CENTER">
      <H2>E-Mail Address Book</H2>
      <FORM method="POST" action="Control">
        <TABLE>
          <TR><TD>Last Name</TD>
            <TD><INPUT type="text" name="firstname"></TD></TR>
          <TR><TD>First Name</TD>
            <TD><INPUT type="text" name="lastname"></TD></TR>
          <TR><TD>Corporation</TD>
            <TD><INPUT type="text" name="corporation"></TD></TR>
        </TABLE>
        <BR><BR>
        <INPUT type="submit" name="pagename" value="ADDRESS">
        <INPUT type="reset" value="Reset">
      </FORM>

    </DIV>
  </body>
</html>

解説

HTMLフォームを用意します。Action先はControlサーブレットに設定します。

コード (JSPファイル output.jsp)

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="addressbean" scope="session" class="webApplication25.AddressBean" />

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>output.jsp</title>
  </head>
  <body>
    <h1>output.jsp</h1>
    <br><hr><br>
    <div align="center">
      <%-- AddressBean オブジェクト内の情報を獲得 --%>
      <TABLE border="1">
        <TR>
          <TD>Name</TD>
          <TD><jsp:getProperty name="addressbean" property="firstName" />
            <jsp:getProperty name="addressbean" property="lastName" /><BR></TD>

        </TR>
        <TR>
          <TD>e-Mail Address</TD>
          <TD><jsp:getProperty name="addressbean" property="corporation" /><BR></TD>
        </TR>
      </TABLE>
      <BR><HR><BR>
      <A href="./Control"<font size="3">BACK</font></A>
    </div>
  </body>
</html>

解説

AddressBeanの利用を宣言します。
  <jsp:useBean id="addressbean" scope="session" class="webApplication25.AddressBean" />

beans(AddressBean)からプロパティの内容を読み出して画面に表示します。
  <TABLE border="1">
  <TR>
  <TD>Name</TD>
  <TD><jsp:getProperty name="addressbean" property="firstName" />
  <jsp:getProperty name="addressbean" property="lastName" /><BR></TD>
  </TR>
  <TR>
  <TD>e-Mail Address</TD>
  <TD><jsp:getProperty name="addressbean" property="corporation" /><BR></TD>
  </TR>
  </TABLE>

コード (Bean: AddressBean.java)

package webApplication25;

import java.io.*;

public class AddressBean implements Serializable {

  private String firstName = null;
  private String lastName = null;
  private String email = null;
  private String corporation = null;

  /** Creates a new instance of AddressBean */
  public AddressBean() {
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getCorporation() {
    return corporation;
  }

  public void setCorporation(String corporation) {
    this.corporation = corporation;
  }
}

解説

Beanの実装です。各プロパティ(firstName, lastName, email, corporation)に対応するゲッターとセッターメソッドを実装しています。

コード (AddressExecute.java)

package webApplication25;

public class AddressExecute {

  /** Creates a new instance of AddressExecute */
  //public AddressExecute() {
  //}
  public AddressBean execute(String firstName, String lastName, 
    String eMail, String corporation) {
    //アドレス情報を格納するための AddressBeanオブジェクト
    AddressBean bean = null;

    //AddresBeanオブジェクトの作成
    bean = new webApplication25.AddressBean();

    //引数で受け取った情報を格納
    bean.setFirstName(firstName);
    bean.setLastName(lastName);
    bean.setEmail(eMail);
    bean.setCorporation(corporation);

    return bean;
  }
}

解説

AddressBeanのインスタンスを作成し、値を設定するクラスです。設定する値はexecute()メソッドの引数に与えます。戻り値は作成され値が設定されたbean(AddressBean)のインスタンスが戻ります。

コード (サーブレット:Control.java)

package webApplication25;

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import webApplication25.AddressBean.*;

public class Control extends HttpServlet {

  private ServletConfig config = null;
  private ServletContext context = null;

  /** Creates a new instance of Control */
  public Control() {
  }

  public void init() {
    this.config = getServletConfig();
    this.context = config.getServletContext();
  }

  public void doGet(HttpServletRequest req, HttpServletResponse res)
          throws ServletException, IOException {
    //JSPファイルへフォワードする RequestDispatcher オブジェクト
    RequestDispatcher rd = null;

    //セッション・オブジェクトのチェック
    if (checkSession(req)) {
      //セッションオブジェクトがあった場合は廃棄
      HttpSession session = req.getSession(false);
      session.invalidate();
    }

    //アドレス情報の入力フォームを表示するJSPファイルへフォワード
    rd = context.getRequestDispatcher("/input.jsp");
    rd.forward(req, res);
  }

  public void doPost(HttpServletRequest req, HttpServletResponse res)
          throws ServletException, IOException {
    //JSPファイルへフォワードするRequestDispacherオブジェクト
    RequestDispatcher rd = null;

    //クライアント側で押したボタンの情報を取得
    String pageName = req.getParameter("pagename");

    if (pageName.equals("ADDRESS")) {
      //ADDRESS を受け取った場合
      HttpSession session = null;
      //セッションオブジェクトのチェック
      if (checkSession(req)) {
        //セッションオブジェクトがある場合は取得
        session = req.getSession(false);
      } else {
        //セッションオブジェクトがない場合は新規作成
        session = req.getSession(true);
      }

      //ロジックに渡すアドレス情報を取得
      String firstName = req.getParameter("firstname");
      String lastName = req.getParameter("lastname");
      String eMail = req.getParameter("email");
      String corporation = req.getParameter("corporation");

      //アドレス情報に対するロジックを生成し実行
      AddressExecute ae = new webApplication25.AddressExecute();
      webApplication25.AddressBean ab = ae.execute(firstName, lastName, eMail, corporation);

      //セッションオブジェクトに生成したAddressBeanオブジェクトを格納
      session.setAttribute("addressbean", ab);
      rd = context.getRequestDispatcher("/output.jsp");
    } else {
      //ADDRESS 以外を受け取った場合
      doGet(req, res);
      // returnは指定してもよい
      return;
    }
    //アドレス情報を表示するJSPファイルへフォワード
    rd.forward(req, res);
  }

  //セッションオブジェクトのチェックメソッド
  public boolean checkSession(HttpServletRequest req) {
    HttpSession session = req.getSession(false);
    if (session != null) {
      return true;
    } else {
      return false;
    }
  }
}

解説 doGet()メソッド

ControlサーブレットにGETでアクセスした場合はセッションオブジェクトがあればそれを廃棄し、input.jspにリダイレクトします。

解説 doPost()メソッド

ControlサーブレットにPOSTでアクセスした場合は、POST時に押されたボタンのキャプションを判定します。キャプションが"ADDRESS"ならばinput.jspからのポストであることが判定できます。セッションオブジェクトのチェックをし、あればセッションオブジェクトを取得、なければセッションオブジェクトを新規作成します。
次にAddressExecuteクラスのインスタンスを作成し、execute()メソッドを呼び出します。executeメソッドの引数にはPOSTで受け取ったFirstName,LastName,Corporationの情報を与えます。executeメソッドの戻り値としてAddressBeanのインスタンスが戻りますので、これを"addressbean"という名前でセッションオブジェクトに格納します。
その後、output.jspにリダイレクトします。

コード (web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
    "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>Control</servlet-name>
    <servlet-class>webApplication25.Control</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Control</servlet-name>
    <url-pattern>/Control</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

実行結果

起動後のinput.jspの画面


フォームに入力し、[ADDRESS]ボタンを押します。


output.jspにリダイレクトされ、フォームの入力内容が画面に表組みされて表示されます。
[BACK]リンクをクリックするとinput.jspの画面に戻ります。


著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-06
作成日: 2011-02-14
iPentec all rights reserverd.