サーブレットの呼び出し方(invoker)
少し脱線しますが、サーブレットの呼び出し方について確認しておきます。
今後のテストで利用するサンプル用アプリケーションを作成しながら確認していきましょう。
まずWebアプリケーション全体のパスを決めます。今回は「webxmltest」とします。
次にこのWebアプリケーション全体を配置するディレクトリを決めます。「d:\servlet-sample\webxmltest\」というディレクトリを作成しました。またこのディレクトリの中には「WEB-INF」ディレクトリを作成し、さらに「WEB-INF」ディレクトリの中に「classes」ディレクトリを作成します。
「WEB-INF」ディレクトリの中には「web.xml」ファイルを、「classes」ディレクトリの中にはクラスファイルを配置します。
次にコンテキストファイルを作成します。Webアプリケーションのパスが「webxmltest」ですのでコンテキストファイル名は「webxmltest.xml」とします。中身は下記のようになります。
<Context path="/webxmltest" docBase="d:/servlet-sample/webxmltest"/>
「path」には今回のWebアプリケーションのパス名を、「docBase」にはWebアプリケーションが置かれるディレクトリを指定します。作成したコンテキストファイルは「d:\tomcat\Tomcat 5.5\conf\Catalina\localhost\」に設置します(ご自分の環境に合わせて変更して下さい)。
次に今回利用するサンプルプログラムを作成します。下記のようなメッセージを表示するだけのサンプルです。
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } }
ではプログラムをコンパイルします。コンパイルは下記のように行います(ご自分の環境に合わせて変更して下さい)。
javac -classpath "D:\tomcat\Tomcat 5.5\common\lib\servlet-api.jar" HelloWorld.java
コンパイルが終わりましたら作成された「HelloWorld.class」ファイルを「D:\servlet-sample\webxmltest\WEB-INF\classes\」の中へ移動します。
これで最低限の準備はできました。
invokerを使った呼び出し
Tomcat5より前のバージョンでは「invoker」という仕組みを使って個々のWebアプリケーション毎にweb.xmlを作成してサーブレットをどのように呼び出すかを記述しなくても一応呼び出すことが出来ました。
例えばWebアプリケーションのパスが「webxmltest」で呼び出したいクラスファイル名が「HelloWorld.class」であった場合には下記のようにして呼び出すことが可能でした。
http://localhost:8080/webxmltest/servlet/HelloWorld
この呼び出し方ですと実際のクラスファイル名やディレクトリ構成などが分かってしまうなどセキュリティ上の問題もあり、Tomcat5ではデフォルトでは使えなくなっています。実際この方法で呼び出しを行うと下記のようになります。
もしこの方法で呼び出しを行いたい場合には「(Tomcatをインストールしたディレクトリ)\conf\web.xml」を編集します。まず98行目付近にある下記のコメントを外します
<!-- <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> -->
上記のコメントを外して下記のようにします。
<servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet>
次に340行目付近にある下記のコメントを外します。
<!-- <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> -->
上記のコメントを外して下記のようにします。
<servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
これで個々にweb.xmlを作成しなくても、サーブレット名を「/servlet/」の後に続けて記述することで呼び出すことができるようになります。
ではTomcatを一度再起動してから、先ほどと同じように下記のようにサーブレットを呼び出してみます。
http://localhost:8080/webxmltest/servlet/HelloWorld
今度は下記のようにサーブレットを呼び出すことができます。
ただ「(Tomcatをインストールしたディレクトリ)\conf\web.xml」の設定を変えてしまうと、「web.xml」が個別に設定されていないWebアプリケーションは全てこの方式で呼び出しが出来てしまいます。セキュリティ的にも問題があるので現状はここの設定は変更しないほうがいいでしょう。
個別のweb.xmlにinvokerを設定
例えばテストの期間だけ、特定のWebアプリケーションだけ先ほどのような呼び出しを行えるようにしたい場合もあると思います。その場合は、個々のWebアプリケーションに「web.xml」を作成し、そのファイル内に次のような記述を行います。
※上記は同じ名前のファイルを使う関係でリンク先には「web1.xml」というファイルがリンクされています。実際に使う時には「web.xml」に名前を変更してご利用下さい。
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> </web-app>
作成した「web.xml」をWebアプリケーションのディレクトリの中の「WEB-INF」ディレクトリに配置します。
これでこのWebアプリケーションに関しては、個別のクラスファイルの呼び出し方をweb.xmlに定義していかなくても呼び出すことができます。では次のように呼び出してみて下さい。
http://localhost:8080/webxmltest/servlet/HelloWorld
すると下記のようにサーブレットを呼び出すことができます。
ただし、これもテスト中などに限定した方が望ましいため、実際には次のページで見ていく<servlet-mapping>要素を使って個々のクラスファイルをどのように呼び出すかを定義するようにして下さい。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。