Revised: 5th/July/2002
ここでは、ドキュメント・ルート 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 以下のディレクトリ構造 |
web.xml の設定サーブレットに別名を設定して URL パターンにマップするために、ドキュメント・ルート内の C:\java\dispatchers の WEB-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 は 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>
要求も応答も明示的には受け取っていないようですが、暗黙オブジェクト request と response に代入されています。
Tomcat を起動して設定ファイルの再読み込みを掛けてから次の URL をブラウザから要求します。
http://localhost:8080/dispatching/welcome.servlet
![]() |
| 図:サーブレットから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 © 2002 Sugai, manabu. All Rights Reserved. </address>
![]() |
| 図: 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 © 2002 Sugai, manabu. All Rights Reserved.
</address>
</body>
</html>
| FC2> | ||