暗黙オブジェクトの機能

第5回
で作る
暗黙オブジェクトの機能
今回は,前回に引き続き暗黙オブジェクト(response,request,application,
pageContext,config)の機能について見ていきます。responseとrequestはデータ
のやり取りの中心的機能となる重要な暗黙オブジェクトです。
広島市立大学情報科学部
中村 学 Manabu Nakamura
[email protected]
表1 暗黙オブジェクトの型とスコープ(再掲)
暗黙オブジェクト
型
スコープ
request
javax.servlet.http.HttpServletRequest
request
response
javax.servlet.http.HttpServletResponse page
pageContext
javax.servlet.jsp.PageContext
page
session
javax.servlet.http.HttpSession
session
application
javax.servlet.ServletContext
application
out
javax.servlet.jsp.JspWriter
page
Context,config)の便利な機能について見ていきます。
config
javax.servlet.ServletConfig
page
詳細に関しては,APIのドキュメントなどをご覧くださ
page
java.lang.Object
page
exception
java.lang.Throwable
page
暗黙オブジェクトの便利な機能②
前回ページ数の都合で見ることのできなかった暗黙
オブジェクト(response,request,application,page
い。JSPの暗黙オブジェクトの型,使用可能範囲(スコ
ープ)を表1に示しておきます。
Headerメソッド(setDateHeaderメソッド,setIntHea
response暗黙オブジェクト
derメソッド)が用意されています(リスト1,図1,図
2)*1。
response暗黙オブジェクト(javax.servlet.http.Http
ServletResponse型のオブジェクト)は,サーバーからク
でに設定されているかどうかを調べることができます。
ライアントへ返送するレスポンスを表す暗黙オブジェク
ただし,ヘッダーはその名前が示すようにレスポンスの
トです。レスポンスの設定(set)を行うためのsetXxxメ
先頭に付加されるものです。out暗黙オブジェクトのflush
ソッドが多数用意されています(レスポンスの内容その
メソッドの実行あるいはバッファがいっぱいになること
ものは,out暗黙オブジェクト経由でクライアントへ返送
による書き出し(サーバーからクライアントへリクエス
されます)
。さらにJSP/サーブレットからレスポンスに
トが返送される)の前にヘッダーを追加・設定しなけれ
さまざまな情報を追加(add)するためのaddXxxメソッ
ばいけません*2 。
ドが用意されています。
80
また,containsHeaderメソッドにより,ヘッダーがす
コンテンツ(レスポンスの内容)の種類(およびそれ
ヘッダー(レスポンスに付加される名前と値の組)を
に使用されている文字集合:charset)を設定するための
追加するためのaddHeaderメソッド(引数として渡した
setContentTypeメソッドが用意されていますが,JSPか
long(倍精度整数)を日時として扱うaddDateHeaderメ
らはpageディレクティブのcontentType属性により設定
ソッド,引数として渡したint(整数)を設定するaddInt
することもできます*3。設定された文字集合はgetChara
Headerメソッド),ヘッダーの値を設定するためのset
cterEncodingメソッドにより取得できます。また,ad
JAVA Developer 2002/12
で作る
図1 リスト1でのオブジェクトの挙動
リクエスト
request暗黙オブジェクト
Webブラウザ
setContentType()
addHeader()
addCookie()
/developer/response.jsp
response暗黙オブジェクト
レスポンス
out暗黙オブジェクト
write()
print()
Tomcat
response.setContentType("text/html; charset=shift_jis")
(pageディレクティブのcontentType属性)
response.addHeader(
"java", "developer")
response.addCookie(
new Cookie(
"java", "developer"))
HTTP/1.1 200 OK
Content-Type: text/html; charset=shift_jis
Set-Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXX; Path=/developer
java: developer
Set-Cookie: java=developer
Date: Xxx, XX Xxx XXXX XX:XX:XX GMT
Server: Apache Coyote/1.0
Connection: close
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
…
</html>
図2 リスト1の実行(http://localhost:8080/developer/response.jsp)
dCookieメソッドにより,cookieを追加することができ
ます。
request暗黙オブジェクト
ヘッダー部
out.write()
out.print()
リスト1
$CATALINA_HOME/webapps/developer/response.jsp
<%@ page
contentType="text/html; charset=shift_jis" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>response</title>
</head>
<body>
response.containsHeader("java"):
<%= response.containsHeader("java") %>
<br>
response.addHeader("java", "developer");
<% response.addHeader("java", "developer"); %>
<br>
response.containsHeader("java"):
<%= response.containsHeader("java") %>
<br>
response.getCharacterEncoding():
<%= response.getCharacterEncoding() %>
<br>
response.addCookie(new Cookie("java", "developer"));
<%
response.addCookie(
new Cookie("java", "developer"));
%>
</body>
</html>
request暗黙オブジェクト(javax.servlet.http.Http
ServletRequest型のオブジェクト)は,クライアントか
らサーバーへ送信されてきたリクエストを表す,request
Apache 1.3.27,Apache 2.0.43
スコープを持つ暗黙オブジェクトです。response暗黙オ
Apache 1.3.26以前,Apache 2.0.42以前に,クロス
*1) Tomcatをインストールしたディレクトリ(たとえば,c:¥Program
Files¥Apache Group¥Tomcat 4.1, c:¥My Documents¥jakarta-tomcat4.1.12-LE-jdk14,/usr/local/jakarta-tomcat-4.1.12-LE-jdk14)を
"$CATALINA_HOME"と表記します。また,一般的な説明では,ファイル
セパレータを"/"と表記します。Windowsでは"¥"と読み替えてください
*2)レスポンスに含まれるヘッダーの確認にはtelnetコマンドなどを使用
してください(第2回の記事などをご覧ください)
*3)pageディレクティブのcontentType属性はresponse暗黙オブジェクト
のsetContentTypeメソッドの呼び出しに変換されます
サイトスクリプティングの問題などが報告されています
(http://www.st.ryukoku.ac.jp/~kjm/security/memo/2002/
10.html#20021004_apache)
。
これらの問題が修正されたApache 1.3.27,Apache
2.0.43がすでにリリースされています(http://httpd.apac
he.org/)
。
Tomcat4で作るJSPサーバー入門
81
で作る
表2 request暗黙オブジェクトのメソッドとそれに相当するCGIの環境変数
返り値
相当するCGIの環境変数
サーバーソフトの名前
SERVER_SOFTWARE
サーバーの名前
SERVER_NAME
CGIのリビジョン
GATEWAY_INTERFACE
getProtocol()
リクエストが使用しているプロトコル
SERVER_PROTOCOL
getServerPort()
リクエストを受け取ったポート番号
SERVER_PORT
getMethod()
リクエストに用いられた方法(メソッド)
REQUEST_METHOD
getPathInfo()
補足的なパス
PATH_INFO
getPathTranslated()
getPathInfoメソッドで取得した補足的なパスを実際のパスに変換したもの
PATH_TRANSLATED
getServletPath()
このサーブレット(JSP)を呼び出したURLの一部分
SCRIPT_NAME
getQueryString()
URL中の質問文字列(?以降)
QUERY_STRING*
getRemoteHost()
リクエストを送信したクライアントの名前
REMOTE_HOST
getRemoteAddr()
リクエストを送信したクライアントのIPアドレス
REMOTE_ADDR
getAuthType()
認証の種類
AUTH_TYPE
getRemoteUser()
リクエストしたユーザー
REMOTE_USER
身元情報
REMOTE_IDENT
getContentType()
コンテンツ(リクエスト本体)の種類
CONTENT_TYPE
getContentLength()
コンテンツ(リクエスト本体)の長さ
CONTENT_LENGTH
getHeader()
リクエストのヘッダーの値
HTTP_XXX(HTTP_ACCEPT,HT
TP_USER_AGENTなど)
request暗黙オブジェクトのメソッド
(後述するapplication暗黙オブジェ
クトのgetServerInfoメソッド)
getServerName()
* JSP/サーブレットでは,リクエストの内容をrequest暗黙オブジェクトのgetParameterメソッドにより取得できます。CGIでは,リクエストの内容を環境変数QUERY_STRING
から取得し,解析・デコードする必要があります。環境変数CONTENT_LENGTHが空(null)でなければ,標準入力からCONTENT_LENGTHバイトだけ取得し,解析・デコードす
る必要があります
図4 リスト2でのオブジェクトの挙動
GET /developer/request.jsp?lang=Java&lang=C&char=duke&char=haro HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.1) Gecko/20020826
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,
video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1
Accept-Language: ja
Accept-Encoding: gzip, deflate, compress;q=0.9
Accept-Charset: Shift_JIS, utf-8;q=0.66, *;q=0.66
Keep-Alive: 300
Connection: keep-alive
Cookie: java=developer
ヘッダー
cookie
リクエスト
request暗黙オブジェクト
getHeaderNames()
getHeaders()
getParameterNames()
getParameterValues()
getCookies()
/developer/request.jsp
Webブラウザ
response暗黙オブジェクト
レスポンス
out暗黙オブジェクト
ブジェクトと対をなし,JSP/サーブレットからリクエス
トに含まれるさまざまな情報を取得(get)するための
getXxxメソッドが用意されています。CGIでは,これら
の情報は環境変数に格納されています(参考:http://
write()
print()
Tomcat
(http://localhost:8080/examples/servlet/RequestInfoEx
ample)
,およびそのソースをご覧ください。
request暗黙オブジェクトのメソッドに関して,いくつ
か補足説明を行います。
hoohoo.ncsa.uiuc.edu/cgi/env.html)
。request暗黙オブ
response暗黙オブジェクトのaddHeaderメソッド/set
ジェクトのこれらのメソッドとCGIの環境変数との比較
Headerメソッドと対をなし,request暗黙オブジェクトに
を表2に示します 。使用例は,Tomcatに含まれている
は,ヘッダーの値を返すgetHeaderメソッド(ヘッダーの
サンプル「Snoop」JSP(http://localhost:8080/exampl
値を日時として扱い,longを返すgetDateHeaderメソッ
es/jsp/snp/snoop.jsp,図3)や「Snoop」サーブレット
ド,ヘッダーの値をint(整数)として返すgetIntHeader
*4
82
引数
JAVA Developer 2002/12
で作る
図3 http://localhost:8080/examples/jsp/snp/snoop.jsp
リクエストに
含まれる情報が
表示される
図5 リスト2の実行例(http://localhost:8080/developer/request.jsp?lang=
Java&lang=C&char=duke&char=haro)
メソッド)が用意されています。そのほか,ヘッダーの
名前の列挙(java.util.Enumeration)を返すgetHeaderNa
mesメソッド,指定されたヘッダーの値の列挙を返すget
Headersメソッドも用意されています(リスト2,図4,
図5)
。
同様に,引数の値を返すgetParameterメソッドだけで
はなく,引数の名前の列挙を返すgetParameterNamesメ
ソッド,指定された引数の値の配列を返すgetParamet
erValuesメソッドも用意されています(引数のjava.util.
Map(キーと値のペア)を返すgetParameterMapメソッ
ドも用意されています)
。
さらに,response暗黙オブジェクトのaddCookieメソ
ッドにより,レスポンスに追加(サーバーからクライア
ントへ返送)されたあと,再びクライアントからサーバ
ーへ送信されたcookie(javax.servlet.http.Cookie型のオ
リスト2 getHeadersメソッドの使用例($CATALINA_HOME/webapps/
developer/request.jsp)
<%@ page import="java.util.*,
jp.ac.hiroshima_cu.its.mondo.developer.util.Sanitizer" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request</title>
</head>
<body>
<%
Enumeration names =
request.getHeaderNames();
while (names.hasMoreElements()) {
String s =
(String)names.nextElement();
%>
request.getHeaders(<%=
Sanitizer.sanitize(s) %>):
<%
Enumeration headers =
request.getHeaders(s);
while (headers.hasMoreElements()) {
%>
"<%= Sanitizer.sanitize(
(String)
headers.nextElement()) %>",
<%
}
%>
<br>
<%
}
names = request.getParameterNames();
while (names.hasMoreElements()) {
String s =
(String)names.nextElement();
%>
request.getParameterValues(<%=
Sanitizer.sanitize(s) %>):
<%
String[] values =
request.getParameterValues(s);
if (values != null)
for (int i = 0; i < values.length; i++) {
%>
<%= Sanitizer.sanitize(
values[i]) %>,
<%
}
%>
<br>
<%
}
%>
request.getCookies():
<%
Cookie[] cookies = request.getCookies();
if (cookies != null)
for (int i = 0; i < cookies.length; i++) {
%>
Cookie("<%= Sanitizer.sanitize(
cookies[i].getName()) %>",
"<%= Sanitizer.sanitize(
cookies[i].getValue()) %>"),
<%
}
%>
</body>
</html>
ブジェクトの配列)をgetCookiesメソッドにより取得で
きます。$CATALINA_HOME/webapps/developer/requ
est.jsp(リスト2)は,$CATALINA_HOME/webapps
*4)個々の情報の詳細に関しては,CGIの仕様をご覧ください。また,getConte
ntLengthメソッド,getServerPortメソッドは整数(int)を返しますが,そのほか
のメソッドは文字列(java.lang.String)を返します
Tomcat4で作るJSPサーバー入門
83
で作る
リスト3 フォームデータの送信($CATALINA_HOME/webapps/developer/
questionnaire.jsp)
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>questionnaire</title>
</head>
<body>
<form method="get" action="<%=
response.encodeURL("request.jsp") %>">
favorite programming languages:
<br>
<input type="checkbox" name="lang" value="Java">
Java
<br>
<input type="checkbox" name="lang" value="C++">
C++
<br>
<input type="checkbox" name="lang" value="C">
C
<br>
favorite characters:
<br>
<input type="checkbox" name="char" value="duke">
duke
<br>
<input type="checkbox" name="char" value="haro">
haro
<br>
<input type="submit">
<input type="reset">
</form>
</body>
</html>
リスト4 タグの無効化($CATALINA_HOME/webapps/developer/WEBINF/classes/jp/ac/hiroshima_cu/its/mondo/developer/util/Sanitizer.
java)(再掲)
package jp.ac.hiroshima_cu.its.mondo.developer.util;
リスト5 ログファイルの記録($CATALINA_HOME/webapps/developer/
application.jsp)
<%@ page import="java.util.*" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>application</title>
</head>
<body>
<% application.log("application.jsp"); %>
application.getContext("/developer/"):
<%= application.getContext(
"/developer/") %>
<br>
application:
<%= application %>
<br>
application.getContext("/examples/").getResourcePaths(
"/"):
<br>
<%
Iterator i =
application.getContext("/examples/").
getResourcePaths("/").iterator();
while (i.hasNext()) {
%>
<%= i.next() %>
<br>
<%
}
%>
application.getServerInfo():
<%= application.getServerInfo() %>
<br>
application.getMajorVersion():
<%= application.getMajorVersion() %>
<br>
application.getMinorVersion():
<%= application.getMinorVersion() %>
</body>
</html>
import java.util.regex.Matcher;
import java.util.regex.Pattern;
リスト6
public class Sanitizer {
public static String sanitize(String s) {
if (s != null) {
Matcher m;
m = Pattern.compile("&").matcher(s);
s = m.replaceAll("&amp;");
m = Pattern.compile("<").matcher(s);
s = m.replaceAll("&lt;");
m = Pattern.compile(">").matcher(s);
s = m.replaceAll("&gt;");
}
return s;
}
}
$CATALINA_HOME/conf/server.xml設定(一部抜粋)
<Context path="/developer" docBase="developer"
crossContext="true" />
application暗黙オブジェクト
application暗黙オブジェクト(javax.servlet.Servlet
Context型のオブジェクト)はapplicationスコープを持つ
暗黙オブジェクトです。logメソッドによりログファイル
($CATALINA_HOME/logs/localhost_log.XXXX-XX-
/developer/questionnaire.jsp(リスト3)のようなフォ
XX.txt)に記録を残すことができます(リスト5,図6)
。
ームから入力されたリクエスト情報を処理することがで
また,getContextメソッドにより,ほかのWebアプリケ
きます(ここでは表示するだけです)
。
ーションのapplication暗黙オブジェクトを取得すること
なお,$CATALINA_HOME/webapps/developer/requ
est.jsp(リスト2)は,引数などにHTMLのタグが渡され
ただし,WebアプリケーションからほかのWebアプリ
た場合にそれを無効化する(
「&」
,
「<」
,
「>」を「&amp;」
,
ケーションのapplication暗黙オブジェクトを取得できる
「&lt;」,「&gt;」に変換する)ために,jp.ac.hiroshima_
cu.its.mondo.developer.util.Sanitizerクラス(リスト4,
第4回のリスト3)を利用しています 。
*5
84
もできます。
JAVA Developer 2002/12
ように設定しておく必要があります(リスト6)
。
そのほか,サーバーの情報を取得するためのgetServer
Infoメソッド,ServletコンテナがサポートするAPIのバー
で作る
図6 http://localhost:8080/developer/application.jsp
リスト7 ファイルのインクルード($CATALINA_HOME/webapps/deve
loper/pageContext.jsp)
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>pageContext</title>
</head>
<body>
<%@ include file="navigation.jsp" %>
page: <%= page %>
<jsp:include page="navigation.jsp">
<jsp:param name="p2" value="p2" />
</jsp:include>
<% pageContext.include("navigation.jsp"); %>
</body>
</html>
図7 http://localhost:8080/developer/pageContext.jsp?p1=p1
Tomcat 4.0.6,Tomcat 4.1.12
Tomcat 4.0.4以前,Tomcat 4.1.10以前に,JSPのソ
ースが漏洩する問題などが報告されています(http://ja
karta.apache.org/site/news.html#1009.1)
。これらの問
題が修正されたTomcat 4.0.6,Tomcat 4.1.12がすでに
リリースされています(http://jakarta.apache.org/builds
/jakarta-tomcat-4.0/release/)
。
vax.servlet.jsp.PageContext型のオブジェクト)を使用す
ると,pageスコープ内でオブジェクトを共有できるだけ
でなく,スコープ(page,request,session,applic
ジョンを取得するためのgetMajorVersionメソッド,
ation)を指定して,オブジェクト(属性)を共有するこ
getMinorVersionメソッド,Webアプリケーションのリソ
とが可能です(スコープを指定できるsetAttributeメソッ
ース(サーブレット,JSP,HTMLファイルなど)の集合
ド/getAttributeメソッド/removeAttributeメソッド/
(java.util.Set)を取得するためのgetResourcePathsメソッ
getAttributeNamesメソッドも用意されています)*6。
ド,リソースのURLを取得するためのgetResourceメソッ
そのほか,pageスコープ,requestスコープ,session
ド,リソースを読み込むためのストリームを取得するた
スコープ,applicationスコープの順に検索し,属性値を
めのgetResourceAsStreamメソッドなどが用意されてい
返すfindAttributeメソッド,指定したスコープ内の属性
ます。
名の列挙(java.util.Enumeration)を返すgetAttribute
NamesInScopeメソッド,属性のスコープを返すgetAttr
pageContext暗黙オブジェクト
ibutesScopeメソッドも用意されています 。
また,pageContext暗黙オブジェクトのforwardメソッ
pageスコープを持つpageContext暗黙オブジェクト(ja
*5)jp.ac.hiroshima_cu.its.mondo.developer.util.Sanitizerクラス(リスト
4,第4回のリスト3)は事前にコンパイルしておくことが必要です
* 6) pageContext暗 黙 オ ブ ジ ェ ク ト に は , 各 ス コ ー プ を 表 す 定 数
pageContext.XXX_SCOPE(たとえば,pageContext.REQUEST_SCOPE)
が用意されています
*7)jsp:forwardタグはpageContext暗黙オブジェクトのforwardメソッド
の呼び出しに変換されます
*8)pageContext暗黙オブジェクトのincludeメソッドによく似たものと
して,includeディレクティブも用意されています。指定されたファイル
は,実行時ではなく,変換時に(JSPが変換されたクラスのソースに)読
み込まれます(指定されたファイルには拡張子はとくに必要ありません)
。
ドにより,フォワード先を指定できます(第4回のリスト
一方,jsp:includeタグ(includeアクション)はpageContext暗黙オブジ
ェクトのincludeメソッドとほぼ同様の機能を持ちます。指定されたページ
は,変換(コンパイル)時ではなく,実行時に読み込まれます(指定され
たページには拡張子が必要です。拡張子によって動作が異なります。指定
されたページが*.jspの場合は,別のJSPとして動作し,その結果は最終的
なレスポンスにインクルードされ,返送されます)。jsp:includeタグの場
合は,jsp:paramタグによりリクエストの内容(引数)を追加し,指定さ
れたページでrequest暗黙オブジェクトのgetParameterメソッドにより取
得することも可能です。
そのほか,細かい差異は仕様をご覧ください
Tomcat4で作るJSPサーバー入門
85
で作る
リスト8 リスト7に読み込まれるファイル($CATALINA_HOME/webapps/
developer/navigation.jsp)
<p style="background:#b0b0b0">
<a href="<%= response.encodeURL(
"response.jsp") %>">
response.jsp</a>,
<a href="<%= response.encodeURL(
"request.jsp") %>">
request.jsp</a>,
<a href="<%= response.encodeURL(
"questionnaire.jsp") %>">
questionnaire.jsp</a>,
<a href="<%= response.encodeURL(
"application.jsp") %>">
application.jsp</a>,
<a href="<%= response.encodeURL(
"pageContext.jsp") %>">
pageContext.jsp</a>,
<a href="<%= response.encodeURL(
"config.jsp") %>">
config.jsp</a>
<br>
page: <%= page %>,
request.getParameter("p1"):
<%= request.getParameter("p1") %>,
request.getParameter("p2"):
<%= request.getParameter("p2") %>
</p>
リスト9
リスト10
$CATALINA_HOME/conf/web.xmlの設定(一部抜粋)
…
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
…
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
…
図8 http://localhost:8080/developer/config.jsp
初期化引数名の一覧(/webapps/developer/config.jsp)
<%@ page import="java.util.*" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>config</title>
</head>
<body>
<%
Enumeration names =
config.getInitParameterNames();
while (names.hasMoreElements()) {
String s =
(String)names.nextElement();
%>
config.getInitParameter(<%= s %>):
<%= config.getInitParameter(s) %>
<br>
<%
}
%>
config.getServletName():
<%= config.getServletName() %>
<br>
config.getServletContext():
<%= config.getServletContext() %>
<br>
application:
<%= application %>
<jsp:include page="navigation.jsp" />
</body>
</html>
黙オブジェクト(exception,out,page,request,resp
onse,config(ServletConfig)
,application(ServletCont
ext)
,session)を返すgetXxxメソッド(たとえば,get
Exceptionメソッド)も用意されています(とくにうれし
くないですねぇ……)
。
config暗黙オブジェクト
config暗黙オブジェクト(javax.servlet.ServletConfig
型のオブジェクト)は,4つのメソッドを持っています。
getInitParameterNamesメソッドにより初期化引数名の
1,リスト10)*7 。includeメソッドによりほかのファイル
列挙を取得し,その値をgetInitParameterメソッドにより
を読み込むこともできます(リスト7,リスト8,図7) 。
取得し,表示してみました(リスト9,図8)
。getServlet
複数のページに同じもの(たとえば,上下左右に配置さ
Nameメソッドにより,サーブレットの名前を取得するこ
れるナビゲーションバーやスクリプトレット)が含まれ
とができます。
*8
ているような場合に,それを共通化すれば便利でしょう。
さらに,pageContext暗黙オブジェクト以外の8つの暗
86
JAVA Developer 2002/12
これらは,Webアプリケーションのデフォルトの設定
ファイルである$CATALINA_HOME/conf/web.xmlにお
で作る
SSIとCGI
Tomcat 4.1.12では,動的にコンテ
C:¥>ren servlets-cgi.renametojar ser
す(リスト11)。拡張子を"shtml"にし
ンツを生成するための仕組みである
vlets-cgi.jar
ておく必要があります。CGIスクリプ
SSI/CGIが利用可能です(SSI/CGI
●Windows以外(Cygwin,UNIX)
トは,各Webアプリケーションが格納
ベースのシステムが存在する,比較的
% cd server/lib
されたディレクトリの/WEB-INF/cgiデ
シンプルで再利用などに配慮する必要
% mv servlets-ssi.renametojar servle
ィレクトリに置きます(リスト12,リ
がないと予想される,JSP/サーブレ
ts-ssi.jar
スト13)
。
ットの学習に割ける時間がない,
% mv servlets-cgi.renametojar servle
SSI/CGIの使い方を学習したいなど以
ts-cgi.jar
CGIには,"http://localhost:
8080/Webアプリケーションのパスの名
外に,JSP/サーブレットではなく
次に,$CATALINA_HOME/conf/we
SSI/CGIを使用する意味はとくにない
b.xmlからコメントアウトされている
たとえば,http://localhost:8080/develo
ような気がしますが……)
。SSI/CGI
SSI/CGIの設定(188∼210,238∼
per/cgi-bin/test.bat,http://localhost:
を使用するための設定(例)を以下に
254行付近の<servlet>∼</servlet>,
8080/developer/cgi-bin/test
示します。
288∼291,296∼299行付近の<serv
というURLでアクセスできます。これ
let-mapping>∼</servlet-mapping>)
らは,先ほど有効にした$CATALINA_
を有効にします *10。
HOME/conf/web.xmlの設定により決ま
まず,$CATALINA_HOME/server/l
ib内の拡張子が"renametojar"の2つの
ファイルの拡張子を"jar"に変更します。
SHTMLファイル(SSIを使用する
●Windows
HTMLファイル)は,通常のHTMLフ
C:¥>cd server¥lib
ァイルと同様に,$CATALINA_HOME
C:¥>ren servlets-ssi.renametojar ser
/webapps以下の各Webアプリケーショ
vlets-ssi.jar
ンが格納されたディレクトリに置きま
リスト11
$CATALINA_HOME/webapps/developer/ssi.shtml
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SSI</title>
</head>
<body>
last modified:
<!--#echo var="LAST_MODIFIED"-->
</body>
</html>
前/cgi-bin/CGIスクリプトの名前,
っているものです(変更可能です)
。
SSI:Server Side Include,http://httpd.apa
che.org/docs-2.0/howto/ssi.html
CGI:Common Gateway Interface,http://
www.w3.org/CGI/,http://httpd.apache.
org/docs-2.0/howto/cgi.html
リスト12 $CATALINA_HOME/webapps/developer/WEB-INF/cgi/test.bat
(Windows,Cygwin用CGIスクリプト)
@echo off
echo Content-type: text/plain
echo.
set
リスト13 $CATALINA_HOME/webapps/developer/WEB-INF/cgi/test
(UNIX用CGIスクリプト)
#!/usr/bin/sh
echo Content-type: text/plain
echo
set
いて設定されています(リスト10)*9 。また,getServlet
いて見てきました。次回は,JSP/サーブレットからのデ
Contextメソッドによりapplication暗黙オブジェクト(jav
ータベースの利用について見ていき,連載の最終回とし
ax.servlet.ServletContext型のオブジェクト)を取得でき
てまとめを行いたいと思います。
ます(これもとくにうれしくないですねぇ……)
。
これまで同様,http://www.lake.its.hiroshima-cu.ac.
ただし,JSPが変換されたクラスがextendsしている
jp/~mondo/において,本稿のアフターサポートを行いた
javax.servlet.GenericServletクラスがjavax.servlet.
いと思っています(内容を発展させることができればい
ServletConfigインタフェースをimplementsしているの
いのですが……)
。最後になりましたが,本稿に関してア
で,config暗黙オブジェクトを指定しなくてもこれらの
ドバイスをいただきました,タイムインターメディアの
メソッドは使用可能です。
柴田ゆき枝さん,CACの森下民平さんにお礼を申し上げ
ます。
今回はここまで
今回は,前回の続きで暗黙オブジェクトのresponse,
request,application,pageContext,configの機能につ
*9)<servlet-mapping>∼</servlet-mapping>において,"*.jsp"というパ
ターンのURLに"jsp"サーブレットを関連付けています。さらに,<servlet>
∼</servlet>において,"jsp"サーブレットの初期化引数logVerbosityLevel
(ログのレベル)をWARNING(警告)に設定しています
*10)設定ファイルを見るとわかるように,Tomcat上のSSI/CGIは,サ
ーブレットにより実現されています
Tomcat4で作るJSPサーバー入門
87