第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("&"); m = Pattern.compile("<").matcher(s); s = m.replaceAll("<"); m = Pattern.compile(">").matcher(s); s = m.replaceAll(">"); } 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アプリ た場合にそれを無効化する( 「&」 , 「<」 , 「>」を「&」 , ケーションのapplication暗黙オブジェクトを取得できる 「<」,「>」に変換する)ために,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
© Copyright 2024 ExpyDoc