Web アプリケーションとサーブレットのマッピング

Web アプリケーションコンポーネントをリクエストの URL にマッピングする方法によって、ユーザーのエントリポイントが定義されます。マッピングをどのように設定するかによって、ユーザーのブラウザのアドレスバーの表示や JRun によるリクエストの処理方法が変わります。このセクションでは、暗黙の JRun マッピングを説明し、サーブレットや JSP などの Web アプリケーションや Web コンポーネントに独自のマッピングを確立する方法を説明します。

Web アプリケーションのマッピングを確立するには、そのアプリケーションのアセンブルとデプロイの方法を理解する必要があります。運用環境では、モジュールを適切なアーカイブファイルにパッケージしてデプロイすることをお勧めします。詳細については、『JRun アセンブルとデプロイガイド』を参照してください。

マッピングのクイックスタート

すばやくスタートするには、次の表の情報を使用します。
マッピングの
トピック

説明
デフォルトの
サーブレット
マッピング
各 JRun サーバの default-web.xml ファイルには、次の
デフォルトのサーブレットマッピングが含まれています。
FileServlet /
classes ディレクトリ内のサーブレット /servlet
JSP ページ *.jsp
JST *.jst
Axis サーブレット *.jws
Axis サーブレット /services
デフォルトの
アプリケーションマッピングの設定
次の例に示すように、/META-INF/application.xml ファイルに、Web モジュール用に / に設定したコンテキストルートを追加します。
<application>
  <display-name>MyApp</display-name>
  <module>
    <web>
      <web-uri>default-war</web-uri>
      <context-root>/</context-root>
    </web>
  </module>
</application>
デフォルトの
サーブレット
マッピングの設定
次の例に示すように、web.xml ファイルや default-web.xml ファイルでservlet を定義し、servlet-mapping の url-pattern を / に設定します。
<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>MyServlet</servlet-class>
</servlet>
...
<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

URL の理解

クライアントは、他の Web リソースと同様に、URL をリクエストすることによってサーブレットを呼び出します。次の図で示すように、URL はプロトコル、ホスト、ポート (オプション)、リクエスト URI で構成されています。

この図では、URL をプロトコル、ホスト、リクエスト URI の部分に分けて示しています。

リクエスト URL を分解するサンプルサーブレットを表示するには、Samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

JRun 4.0 は、サーブレット API バージョン 2.3 の仕様書に記述されている Web アプリケーションアーキテクチャを完全に実装しています。この実装には、仕様に準拠したサーブレットへのリクエストのマッピングが含まれています。

アプリケーションマッピングとサーブレットマッピングは、リクエスト URI をいくつかのコンポーネントに分割し、その URI の異なる部分を使用して、呼び出すリソースを決定します。次の表でこれらのコンポーネントを説明します。
URI コンポーネント
説明
コンテキストパス
Web アプリケーションマッピングに関連付けられたパス接頭辞を指定します。Web サーバの URL ネーム空間のルートディレクトリにあるデフォルトのアプリケーションの場合、コンテキストパスは空の文字列になります。デフォルト以外のアプリケーションの場合、コンテキストパスは、スラッシュ (/) で始まりますが、スラッシュで終了しません。たとえば、/techniques は、/techniques を含んでいるリクエストを techniques アプリケーションへマッピングします。
request.getContextPath メソッドは、コンテキストパスを示す文字列を返します。
サーブレットパス
サーブレットマッピングと一致する URL の部分を指定します。このパスはスラッシュ (/) で始まります。
request.getServletPath メソッドは、サーブレットパスを示す文字列を返します。
パス情報
クエリ文字列パラメータの前にあるリクエストパスの残りの部分です。
request.getPathInfo メソッドは、パスの残りの部分を示す文字列を返します。

マッピングのタイプ

JRun では、リクエストに応えてサービスするファイルを決定するときに、次のタイプのマッピングを使用します。

JRun サーバで実行される各 Web アプリケーションは、1 つのアプリケーションマッピングと複数のサーブレットマッピングを定義できます。Web アプリケーションを最適な方法で使用するには、HTML ファイル、JSP、およびサーブレットに対するリクエストを処理するために、JRun がどのようにアプリケーションマッピングとサーブレットマッピングを使用するかを理解する必要があります。

次の表は、JRun 設定ファイルが定義するマッピングをリストします。
設定ファイル
マッピング
default-web.xml
サーブレットマッピングとウェルカムファイルマッピング。
default-web.xml ファイルの設定は、JRun サーバのすべての Web アプリケーションに適用されます。
web.xml
サーブレットマッピングとフィルタマッピング。
jrun-web.xml
Web アプリケーションのための仮想パスマッピングとオプションのコンテキストルート (WARファイル)。
application.xml
エンタープライズアプリケーションのためのコンテキストルート (EAR ファイル)。

アプリケーションマッピングは、コンテキストパスを Web アプリケーションの名前とディレクトリパスに関連付けます。これらのマッピングは、JRun 管理コンソール (JMC) を使用して管理します。JRun は、アプリケーションマッピングを META-INF/application.xml ファイルで維持します。

このマッピングは、Web サーバのファイルシステム内の Web アプリケーションの物理的位置と一致する必要はありません。たとえば、myapp が Web アプリケーションのドキュメントルートディレクトリの場合に、Web アプリケーションをサーバのディレクトリ c:/apps/myapp に配置しているものとします。Web アプリケーションのディレクトリ構造は、myapp の下です。

この場合、Web アプリケーションが http://www.mycomp.com/myapp の形式で URL に応答するように、/myapp に対してアプリケーションの URL マッピングを作成できます。このマッピングを設定すると、/myapp コンテキストパスを含むすべての URL が Web アプリケーションにマッピングされます。

アプリケーションマッピングの理解

アプリケーションアセンブル担当者は、すべての Web モジュールのコンテキストルートを定義します。アプリケーションアセンブル担当者は、このコンテキストルートがアプリケーション内の他のどのモジュールのコンテキストルートとも重複しないようにします。

リクエストが到着すると、JRun はそのリクエストをできるだけ最長のマッピングにマッピングしようと試みます。つまり、リクエスト URI に /foo/bar が含まれている場合は、JRun は最初に /foo/bar のマッピングを見つけようとします。これに失敗すると、JRun は /foo のマッピングを見つけようとします。一致するものを見つけられない場合、JRun は、このリクエストを / にマッピングします。サーブレットが / にマッピングされると、JRun は サーブレットパス情報として foo/bar を割り当てます。

ルートへの Web モジュールのマッピング

JRun サーバでルートにマッピングできる Web モジュールは 1 つだけであり、すべての Web モジュールに固有のマッピングが必要です。JRun サーバに到着したリクエストに明示的なマッピングがない場合、リクエストはルートにマッピングされた Web アプリケーションに送信されます。

Web アプリケーションに application.xml ファイルがない場合は、このアプリケーションを EAR ファイルとしてパッケージし、このファイルを定義する必要があります。詳細については、『JRun アセンブルとデプロイガイド』を参照してください。

ルートへのサーブレットのマッピング

Web アプリケーションのルートへのすべてのリクエストを 1 つのサーブレットでキャッチする場合は、このサーブレットが / に一致するように URL パターンを設定する必要があります。これは、モデル - ビュー - コントローラなどのデザインパターンを実装するときの一般的なタスクであり、この場合は、1 つのサーブレットがコントローラまたはディスパッチャとして機能する必要があります。

たとえば、techniques-ear ファイルには Web モジュール techniques-war が含まれています。このモジュールのコンテキストルートは /techniques です。JRun が http://www.yourhost.com/techniques などのリクエストを受け取った場合、このリクエストは techniques-war モジュールにマッピングされます。次に JRun は、サーブレットマッピングについて techniques モジュールの web.xml ファイルをチェックします。

マッピングのないリクエスト処理

アプリケーションアセンブル担当者が、コンテキストルートにルート (/) マッピングを与えておらず、リクエストが他のマッピングと一致しない場合は、JRun は、リクエストしているユーザーに Web サーバのルートディレクトリからインデックスファイルを返します。利用可能なインデックスファイルがない場合、JRun はディレクトリリストを返します。ディレクトリリストがオフになっている場合、JRun はエラーをユーザーに返します。

アプリケーションマッピングの定義

デプロイするアプリケーションのタイプによっても異なりますが、Web アプリケーションのコンテキストルートを定義する方法は複数あります。このセクションでは、EAR ファイルと WAR ファイルのためにコンテキストルートを定義する方法を説明します。

EAR ファイル

EAR ファイルをデプロイする場合は、次のシンタックスを使用して、/META-INF/application.xml ファイルで各 Web モジュール用にコンテキストルートを定義します。

<module><web>
  <web-uri>module-name</web-uri>
  <context-root>mapping</context-root>
</web></module>

次の例では、techniques-war Web モジュールを /techniques にマッピングします。

<module><web>
  <web-uri>techniques-war</web-uri>
  <context-root>/techniques</context-root>
</web></module>

application.xml ファイル内で各 Web モジュール用に context-root 要素を設定する必要があります。コンテキストルートを指定しないと、Web モジュールはエンタープライズアプリケーションからアクセスできません。

WAR ファイル

Web モジュールを WAR ファイルとしてホットデプロイする場合は、jrun-web.xml ファイルでコンテキストルートを定義するか、JRun に定義させることができます。

JRun は次の順序でコンテキストルートを判断します。

  1. /WEB-INF/jrun-web.xml ファイルでコンテキストルートのマッピングをチェックします。
  2. WAR ファイルが未圧縮の場合は、JRun は WAR ファイルのルートディレクトリ名を使用します。たとえば、WAR ファイルが <JRun のルートディレクトリ>/servers/samples/worldmusic-war/ ディレクトリにデプロイされている場合は、JRun は worldmusic-war をコンテキストルートとして使用します。
  3. WAR ファイルが圧縮されている場合は、JRun は WAR ファイルの名前から ".war" を取り除いたものを使用します。たとえば Web モジュールが techniques.war に含まれている場合は、JRun は "techniques" をコンテキストルートとして使用します。

サーブレットマッピングの理解

次の表で、サーブレットをリクエスト URI にマッピングするためのいくつかのテクニックを説明します。
テクニック
説明
デフォルトサーブレットマッピング
JRun サーバ上のサーブレットにアクセスするには、サーブレットを /WEB-INF/classes ディレクトリに保管しているかぎり暗黙の /servlet マッピングを使用できます。たとえば、MyServlet.class ファイルを /WEB-INF/classes に保管している
場合は、http://yourhost/servlet/MyServlet をリクエストすることにより、このサーブレットをリクエストできます。
次の例に示すように、このマッピングは default-web.xml ファイルであらかじめ定義されています。
<servlet-mapping>
  <servlet-name>ServletInvoker</servlet-name>
  <url-pattern>/servlet/</url-pattern>
</servlet-mapping>
web.xml
url-pattern 要素を使用すると、web.xml ファイルでサーブレットのマッピングを定義できます。次の例では、AxisServlet を /services にマッピングします。
<servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>/services</url-pattern>
</servlet-mapping>

http://www.yourhost.com/services などのリクエストは、AxisServlet にマッピングされます。
default-web.xml
web.xml ファイルの場合と同じシンタックスを使用して、default-web.xml ファイルでサーブレットや JSP のマッピングを定義できます。ただし、次の例のように、default-web.xml で定義されたサーブレットや JSP は、この JRun サーバ内のすべてのアプリケーションで利用可能です。
<servlet>
   <servlet-name>JRunStatistics</servlet-name>
   <jsp-file>/jrunx/instrument/Results.jsp</
jsp-file>
 </servlet>

サーブレットマッピングは、サーブレットを URL パターンに関連付けます。URL パターンには、/MyServlet などの接頭辞、または *.jsp などの接尾辞を使用できます。指定された URL パターンに一致するサーブレットパスがリクエスト URI に含まれる場合、JRun は関連付けられたサーブレットを呼び出します。サーブレットを明示的に定義しない場合は、/servlet 暗黙マッピングを使用して WEB-INF/classes ディレクトリに保管してあるサーブレットをリクエストできます。詳細については、 「暗黙のサーブレットマッピング」 を参照してください。

default-web.xml ファイルの次の行で、*.jsp のパターンを JSPServlet にマッピングし、AxisServlet を /services にマッピングします。

<servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>/services</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>JSPServlet</servlet-name>
  <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

Web サーバがページやサーブレットに対するリクエストを受信すると、JRun は、まずリクエスト URI のコンテキストパスを、JRun に定義されているアプリケーション URL マッピングと比較して、Web アプリケーションを検索します。Web アプリケーションが見つかると、JRun はその Web アプリケーションのサーブレットマッピングを使用して、指定されたリソースを検索します。コンテキストパスに一致するアプリケーションマッピングが見つからないと、JRun はその Web サーバのデフォルトのアプリケーションのサーブレットマッピングを使用してリソースを検索します。

明示的サーブレットマッピングは、web.xml ファイルで定義および管理できます。セキュリティを最大にするには、運用アプリケーションで、Web アプリケーションの各サーブレットごとに明示的サーブレットマッピングを定義する必要があります。

サーブレットマッピングの url-pattern には、先頭のスラッシュは必要ありません。

暗黙のサーブレットマッピング

web.xml ファイルでの明示的サーブレットマッピングだけでなく、JRun は各 JRun サーバの default-web.xml ファイルでの一連の暗黙のサーブレットマッピングを維持します。これらのマッピングは JRun サーバ内のすべてのアプリケーションによって共有されます。次の表で、これらのマッピングについて説明します。
サーブレット
クラス
URL マッピング
FileServlet
jrun.servlet.file.FileServlet
/
ServletInvoker
jrun.servlet.ServletInvoker
/servlet/
JSPServlet
jrun.jsp.JSPServlet
*.jsp
JSTServlet
jrun.jsp.JSTServlet
*.jst
AxisServlet
org.apache.axis.transport.http.
AxisServlet
*.jws
/services

Web アプリケーションの web.xml ファイルで新しいマッピングを定義することにより、その Web アプリケーションの暗黙のサーブレットマッピングをオーバーライドできます。つまり、default-web.xml ファイルのすべてのアプリケーションのマッピングを変更できます。たとえば、/servlet を LoginServlet または 404Servlet に関連付けることで、ServletInvoker サーブレットのデフォルトサーブレットマッピングを変更できます。

ServletInvoker の使用

JRun には、/servlet を ServletInvoker サーブレットに関連付けるサーブレットマッピングが含まれています。このサーブレットマッピングにより、サーブレットパス /servlet を含むリクエスト URI は、ServletInvoker サーブレットによって処理されるようになります。ServletInvoker サーブレットには、web.xml ファイルや default-web.xml ファイルでは明示的に定義されていないサーブレットのための汎用呼び出しメカニズムが用意されています。

次の部分では、default-web.xml ファイルの ServletInvoker のマッピングを示しています。

<servlet-mapping>
  <servlet-name>ServletInvoker</servlet-name>
  <url-pattern>/servlet/</url-pattern>
</servlet-mapping>

このマッピングは、開発フェーズやテストフェーズで役立ちます。これにより、サーブレットマッピングを明示的に定義する必要がなくなります。ServletInvoker サーブレットが、クラス名を使用して仮のサーブレット登録を自動的に作成するからです。

セキュリティとパフォーマンス上の理由から、すべてのサーブレットに対して明示的マッピングを定義して、運用システムのデフォルトの ServletInvoker マッピングをオーバーライドする必要があります。運用アプリケーションでは、カスタマイズしたサーブレットが常にエラーを返す場合に、たとえば次のように、そのサーブレットに /servlet のマッピングを関連付ける方法も考えられます。

/servlet = 404servlet

JRun は次の方法で ServletInvoker サーブレットを使用します。

  1. リクエスト URI にアクセスします (例:/app1/servlet/SnoopServlet)。
  2. コンテキストパスを抽出します (例:/app1)。
  3. サーブレットパスを抽出します (例:/servlet)。
  4. パス情報からサーブレット名を抽出します (例:/SnoopServlet)。
  5. ServletContext.getNamedDispatcher(servletname) を呼び出して、サーブレットを呼び出します。

JRun は最初に Web アプリケーションの web.xml ファイルと default-web.xml ファイルを調べて、このサーブレットが定義されているかどうかを判断します。一致するサーブレットが見つからない場合、JRun は アプリケーションのクラスパスにリストされたディレクトリ内でサーブレットを検索し、サーブレットのクラス名を使用してインスタンスを作成します。

ウェルカムファイルマッピングの理解

JRun では、サーブレット仕様に従って web.xml で指定されるウェルカムファイルをサポートしています。次の例に示すように、web.xml ファイルでウェルカムファイルを定義します。

<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>welcome.html</welcome-file>
</welcome-file-list>

welcome-file は、前後のスラッシュがない URI の一部分です。クライアントがディレクトリへのリクエストを行ったときに、JRun は welcome-file エントリをリクエストされたディレクトリに追加し、一致するものが見つかった場合は、そのリクエストを転送します。一致する welcome-file が見つからない場合やサービスできない場合は、リスト内の次の welcome-file を使用しようとします。また、welcome-file エントリがないと、JRun はクライアントにディレクトリリストを返します。ディレクトリリストがオフになっていると、JRun はエラーを返します。

ディレクトリ表示をオフにする方法については、『JRun 管理者ガイド』を参照してください。

URI の例

JRun は、アプリケーションマッピングとサーブレットマッピングに従って、URL の URI 部分をコンテキストパス、サーブレットパス、追加パス情報に分割します。

たとえば、/hrapp のアプリケーションマッピングが application.xml ファイルにあり、/NewEmpServlet のサーブレットマッピングが web.xml ファイルにあり、リクエスト URI が /hrapp/NewEmpServlet/login?empid=61355 の場合、JRun は次のように判断します。
URI コンポーネント
定義
/hrapp
コンテキストパス
/NewAppServlet
サーブレットパス
/login
パス情報
empid=61355
クエリ文字列パラメータ

アプリケーションマッピングがなく URI が同じ場合、結果は次のようになります。
URL コンポーネント
定義
(空)
コンテキストパス
/hrapp/NewEmpServlet
サーブレットパス
/login
パス情報
empid=6139
クエリ文字列パラメータ

メモ:  リクエスト URI とパス部分の URL エンコードが異なる場合を除き、次のステートメントは常に true になります。
RequestURI = contextpath + servletpath + pathinfo

コンテキストとパス情報へのアクセス

サーブレット内からコンテキストとパス情報にアクセスできます。次の例は、リクエストから ServletContext 情報を取得するメソッドの使用方法を示しています。

...
ServletContext context = getServletContext();
out.println("コンテキストパス:" + req.getContextPath());
out.println("<BR>サーブレットパス:" + req.getServletPath());
out.println("<BR>パス情報:" + req.getPathInfo());
out.println("<BR>実際のパス:" + 
context.getRealPath(req.getServletPath()));
...

次の例では、Referer HTTP ヘッダーも使用して、「Back」リンクを構築します。

String referer = req.getHeader("Referer");
out.println("<BR><A HREF=¥"" + referer + "¥">Back</A>");

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。