検索
連載

拡張パスの利用と注意JavaTips 〜JSP/サーブレット編

Share
Tweet
LINE
Hatena

 「サーブレットパスの構成要素を取得する」では、HttpServletRequestクラスを介して取得できる、リクエストURLのさまざまなパス要素について紹介しました。しかし、1つだけ紹介しなかった要素があります。それは、getPathInfoメソッドによって取得できる「拡張パス」情報です。

 拡張パスは、サーブレットの位置を表すコンテキストパスやサーブレットパスのような情報とは異なり、「付随的な入力パラメータ」というべき情報です。プログラムから利用できる引数情報という意味ではクエリ情報とも似ていますが、クエリ情報が「?key=value」のような特殊なフォーマットで記述しなければならないのに対し、拡張パスは(その名のとおり)あたかもパスの一部であるかのように、パラメータ情報を記述できるという点が異なります。

 拡張パスはキー名を持たないパラメータなので、複数の情報の受け渡しが必要な場合には不向きです。しかし、共通サーブレットから処理を分岐する(例えば、実処理用のクラスを特定する)場合などは便利に利用することができます。そのような場合、拡張パスまでが処理するクラスを特定する情報となるため、処理上で必要なパラメータと区分することで、URLをより分かりやすく(見やすく)することができます。

 さて、この「拡張パス」情報、必ずしもすべてのURLに付加できるわけではありません。拡張パスが使えるかどうかは、デプロイメント・ディスクリプタ(web.xml)の設定によって決まります。

 例えば、以下のようにurl-pattern要素がワイルドカードを含まない完全一致で指定されている場合、URLには拡張パス情報を付加することはできません。

web.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<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 web-app_2_4.xsd"
  version="2.4">
  <servlet>
    <servlet-name>ServletPath</servlet-name>
    <servlet-class>javatips.ServletPath</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletPath</servlet-name>
    <url-pattern>/ServletPath</url-pattern>
  </servlet-mapping>
</web-app>

 つまり、「http://localhost:8080/javatips/ServletPath/sample_param/」のように拡張パスを付加してしまうと、URLがurl-pattern要素とマッチングしなくなってしまうのです。この場合、ブラウザには「404 Not Found」のエラーが返されてしまいます。

 そこで、以下のようにurl-pattern要素を書き換えると、拡張パスが認識できるようになります。

<url-pattern>/ServletPath/*</url-pattern>

 拡張パス情報を利用したい場合は、url-pattern要素の末尾に必ず「*」(アスタリスク)を付加する必要があることを覚えておいてください。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る