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>