The Ja-Jakarta ProjectTomcat Servlet/JSP コンテナ

リンク

ユーザガイド

リファレンス

Tomcat開発

Tomcat5 サーブレット/JSP コンテナ

デフォルトサーブレット リファレンス

Printer Friendly Version
印刷用
バージョン
はじめに
ここでは、デフォルトサーブレットの操作方法のいくつかについて説明します。 トピックは以下の通りです。
デフォルトサーブレットとは何か?

デフォルトサーブレットは、静的リソースや、(有効となっている場合に限り) ディレクトリの一覧表示を配信するサーブレットです。

どこで宣言するか?

$CATALINA_HOME/conf/web.xml にグローバルで宣言されています。 デフォルトでは、以下のような宣言になっています。

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

...

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

したがってデフォルトでデフォルトサーブレットはWeb アプリケーションの起動時にロードされ、 ディレクトリの一覧表示は有効、デバッギングはオフになっています。

どこを変更できるか?

デフォルトサーブレットでは以下の初期化パラメータ (init-param) を設定できます。

debug デバッギングレベル。Tomcat の開発者以外にはほとんど利用されません。 執筆時点では、 0/1/11/1000 が有効です。
listings ウェルカムファイルが存在しない場合に、 ディレクトリの一覧を表示するかどうかを指示します。 truefalse の値をとります。
ウェルカムファイルを扱う仕組みは Servlet 仕様の一部に含まれています。
readmeFile ディレクトリの一覧を表示する際に、 readme ファイルの内容を表示画面に含めることが可能です。 このファイルはそのままの状態で挿入されるので、 HTML が含まれていてもかまいません。デフォルト値は null です。
globalXsltFile ディレクトリの一覧表示をカスタマイズしたい場合には、 XSL 変換 (XSLT) が使えます。 この値は全てのディレクトリ表示で使うファイルの絶対パス名です。 ローカルの Web アプリケーションの web.xml で DefaultServlet を宣言すれば、Web アプリケーションごとにこの設定を無効にできます。 XML のフォーマットは後述します。
localXsltFile localXsltFile を設定することで、 ディレクトリの一覧表示のカスタマイズも可能です。 この値は一覧表示を行うディレクトリ名の相対パス形式で記されるファイル名でなければなりません。 この値は globalXsltFile をオーバーライドします。 この値が設定されているのにファイルが存在しない場合は、 globalXsltFile が使われます。 globalXsltFile が設定されていない場合は、 ディレクトリの一覧はデフォルトスタイルで表示されます。
input 提供するリソースを読み込む際の入力バッファサイズ (バイト単位)。 [デフォルトは 2048]
output 提供するリソースに書き出す際の出力バッファサイズ (バイト単位)。 [デフォルトは 2048]
readonly このコンテキストが「読み出し専用」かどうか、 つまり PUT や DELETE といった HTTP コマンドを拒否するかどうかを示します。 [デフォルトは true]
ディレクトリの一覧表示のカスタマイズ方法は?

デフォルトサーブレットを独自の実装でオーバーライドして、自分の web.xml にそれを宣言して使うことが可能です。この意味が理解できるなら、デフォルトサーブレット のコードを読んで適宜修正できるかと思います。 (理解できなければ、役に立つ方法ではありません)

localXsltFile または globalXsltFile かどちらかを使用できます。そうすると、デフォルトサーブレットが XML 文書を生成し、 localXsltFileglobalXsltFile で指定した値を元に、XML 文書に対して XSL 変換を実行できます。 localXsltFileglobalXsltFile の順にチェックされ、その上でデフォルトの動作が行われます。

フォーマットは以下の通りです。

    <listing>
     <entries>
      <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
        fileName1
      </entry>
      <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
        fileName2
      </entry>
      ...
     </entries>
     <readme></readme>
    </listing>
  • type='dir' の場合、size は無視されます
  • readme は CDATA エントリです

Tomcat のデフォルトの見栄えを真似たサンプル XSL ファイルを以下に示します。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="xhtml" encoding="utf-8" indent="no"/>

  <xsl:template match="listing">
   <html>
    <head>
      <title>
        Sample Directory Listing For
        <xsl:value-of select="@directory"/>
      </title>
      <style>
        h1{color : white;background-color : #0086b2;}
        h3{color : white;background-color : #0086b2;}
        body{font-family : sans-serif,Arial,Tahoma;
             color : black;background-color : white;}
        b{color : white;background-color : #0086b2;}
        a{color : black;} HR{color : #0086b2;}
      </style>
    </head>
    <body>
      <h1>Sample Directory Listing For
            <xsl:value-of select="@directory"/>
      </h1>
      <hr size="1" />
      <table cellspacing="0"
                  width="100%"
            cellpadding="5"
                  align="center">
        <tr>
          <th align="left">Filename</th>
          <th align="center">Size</th>
          <th align="right">Last Modified</th>
        </tr>
        <xsl:apply-templates select="entries"/>
        </table>
      <xsl:apply-templates select="readme"/>
      <hr size="1" />
      <h3>Apache Tomcat/5.0</h3>
    </body>
   </html>
  </xsl:template>


  <xsl:template match="entries">
    <xsl:apply-templates select="entry"/>
  </xsl:template>

  <xsl:template match="readme">
    <hr size="1" />
    <pre><xsl:apply-templates/></pre>
  </xsl:template>

  <xsl:template match="entry">
    <tr>
      <td align="left">
        <xsl:variable name="urlPath" select="@urlPath"/>
        <a href="{$urlPath}">
          <tt><xsl:apply-templates/></tt>
        </a>
      </td>
      <td align="right">
        <tt><xsl:value-of select="@size"/></tt>
      </td>
      <td align="right">
        <tt><xsl:value-of select="@date"/></tt>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>
ディレクトリの一覧表示をセキュアにする方法は?

個々の Web アプリケーションにある web.xml を使ってください。 詳しくはサーブレット仕様のセキュリティに関するセクションをご覧下さい。


[訳注: この文書は高橋達男が翻訳し、 小川 環が校正しました。 日本語訳に対するコメントがあれば、report@jajakarta.orgに送って下さい。]
Copyright © 1999-2003, Apache Software Foundation