forwardのサンプル

Revised: 5th/July/2002

サーブレットから JSP へのディスパッチ

ドキュメント・ルートの設定

ここでは、ドキュメント・ルート C:\java\dispatchers が、サーバのコンテキスト・ルート /dispatching になるように設定します。ドキュメント・ルートの DispatchingJSP.jsp へ、要求/応答を割りふるサーブレットを /WEB-INF/classes/ に配置しましょう。

server.xml の設定

ドキュメント・ルートの設定は、 Tomcat がインストールされているフォルダの中の conf/server.xml で行います。デフォルトでは C:\Program Files\Apache Tomcat 4.0\conf\server.xml になります。このファイルの202行目付近に次のようなコードがあります。

        <!-- Tomcat Manager Context -->
        <Context path="/manager" docBase="manager"
         debug="0" privileged="true"></Context>

これの次の行に、次のように記述します。

        <!-- Dispatching Examples Context -->
        <Context path="/dispatching" docBase="C:/java/dispatchers" debug="0"
                 reloadable="true" crossContext="true"/>

ドキュメント・ルートの作成

次に、ドキュメントルートに次のようなディレクトリを作成します。

C:\java\dispatchers以下のディレクトリ構造
図: C:\java\dispatchers 以下のディレクトリ構造

web.xml の設定

サーブレットに別名を設定して URL パターンにマップするために、ドキュメント・ルート内の C:\java\dispatchersWEB-INF 内に次のようなソースコードの web.xml を作成します。

<?xml version="1.0" encoding="Shift_JIS"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
	<!-- サーブレット名 -->
	<servlet>
		<servlet-name>disp</servlet-name>
		<servlet-class>DispatchingServlet</servlet-class>
	</servlet>

	<!-- URL パターン -->
	<servlet-mapping>
		<servlet-name>disp</servlet-name>
		<url-pattern>/welcome.servlet</url-pattern>
	</servlet-mapping>
</web-app>

サーブレットへの要求は、URL http://localhost:8080/dispatching/welcome.servlet へ送信します。実際はこのアドレスは不自然に過ぎます。

サーブレットのソースコード

ドキュメント・ルート C:\java\dispatchers が、サーバのコンテキスト・ルート /dispatching に設定されています。ドキュメント・ルートの dispatchingJSP.jsp へ、要求/応答を割りふるサーブレットは次のように記述します。

クライアントはサーバにこのサーブレットから応答を返すように要求を渡しますが、このサーブレットは JSP へその要求を渡して、応答の責任も放棄します。クライアント要求/応答の責任は JSP に委譲されます。

DispatchingServlet.java

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

public class DispatchingServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		doPerform(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		doPerform(request, response);
	}

	public void doPerform(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {

		String str = "JSPさーん!";

		// 要求へ属性と属性値をセット
		request.setAttribute("message", str);
		// サーブレット・コンテキストの取得
		ServletContext cont = getServletContext();
		// JSP のディスパッチャを取得
		RequestDispatcher reqJSP
			= cont.getRequestDispatcher("/dispatchingJSP.jsp");
		// ディスパッチャの forward メソッドを利用
		reqJSP.forward(request, response);
    }
}

getRequestDispatcher() メソッドの引数にリソースを指定しますが、必ずスラッシュ / から始まり、コンテキスト・ルートからの相対パスとして解釈されます。ドキュメント・ルート自身は含みません。ちょっと不思議な仕様ですが、 UNIX 系で言う「ルート」の別名として、複数のコンテキスト・ルートをセットしていると考えてください。サーバのルート直下のコンテキスト・ルートに、ドキュメント・ルートをマウントしているようにも解釈できます。

コンパイルは次のように行います。本稿では、以前 CLASSPATH にサーブレットクラスのアーカイブファイルへのパスを設定しているので、次のようにコンパイルできます:

C:\>cd C:\java\dispatchers\WEB-INF\classes

C:\java\dispatchers\WEB-INF\classes>javac DispatchingServlet.java

C:\java\dispatchers\WEB-INF\classes>

CLASSPATH を設定していない方は、 -classpath フラッグで、Tomcat のインストール・ディレクトリ内の common\lib\servlet.jar を設定する必要があります。デフォルトでは C:\Program Files\Apache Tomcat 4.0\common\lib\servlet.jar です。

JSP のソースコード

これを受け取る JSP は C:\java\dispatchers\dispatchingJSP.jsp です。

dispatchingJSP.jsp:

<%@page contentType="text/html; charset=Shift_JIS" %>
<% request.setCharacterEncoding("Shift_JIS"); %>

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" >
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<title>Servlet to JSP</title>
</head>
<body>
<jsp:useBean id="message" type="java.lang.String" scope="request" />
<p><%= message %></p>
<p>なんだい、サーブレットくん?</p>
</body>
</html>

要求も応答も明示的には受け取っていないようですが、暗黙オブジェクト requestresponse に代入されています。

動作確認

Tomcat を起動して設定ファイルの再読み込みを掛けてから次の URL をブラウザから要求します。

http://localhost:8080/dispatching/welcome.servlet
サーブレットからJSPへの転送実行結果
図:サーブレットからJSPへの転送実行結果

JSP への制御の埋め込み

この JSP の末尾に、別の JSP による制御を埋め込んで見ましょう。上記の JSP を次のように編集します。

<%@page contentType="text/html; charset=Shift_JIS" %>
<% request.setCharacterEncoding("Shift_JIS"); %>

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" >
  <head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<title>Servlet to JSP</title>
</head>
<body>
<jsp:useBean id="message" type="java.lang.String" scope="request" />
<p><%= message %></p>
<p>なんだい、サーブレットくん?</p>

<%@ include file="./copyright.jsp" %>
</body>
</html>

JSP への埋め込みには、ディレクティブとアクションタグの両方が使われますが、ここではディレクティブを使いました。このとき、対象が埋め込まれるのは、元の JSP がサーブレットに変換されるとき、即ち、サーバで公開されてから最初に要求を受け取るときです。従って、元の JSP が変更されてコンテナにサーブレット変換されるまでは、埋め込まれる JSP がどれだけ変更されようとも反映されません。この例では、埋め込むのは、同じディレクトリ中の copyright.jsp です。

copyright.jsp:

<hr />
<%@page import="java.util.*" %>

<address>
<% Date date = new Date(); %>
<%= date %><br />
Copyright &copy; 2002 Sugai, manabu. All Rights Reserved.
</address>
JSPへのJSPの埋め込み実行結果
図: JSP への JSP の埋め込み実行結果

ブラウザが受け取るソース:




<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" >
  <head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<title>Servlet to JSP</title>
</head>
<body>

<p>JSPさーん!</p>
<p>なんだい、サーブレットくん?</p>

<hr />


<address>

Fri Jul 05 20:22:22 JST 2002<br />
Copyright &copy; 2002 Sugai, manabu. All Rights Reserved.
</address>

</body>
</html>


Copyright © 2002 SUGAI, Manabu. All Rights Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送