2007 年 3 月 3 日 23 時 45 分

web.xml: 配備記述子 #3


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


主要な要素だけといいながら、3 回もかかっとるなぁ。

さて、あと少し。

・<welcome-page-list> 要素

Web アプリケーションに割り当てられている、
どの Servlet にも対応しない要求があった場合、
既定の Servlet によって処理され、
URL のパスに対応するファイルがそのまま公開される。

その際、ディレクトリに対する要求があった場合は、
既定の Servlet はディレクトリの一覧を表示したり、
404 等のエラーを返したりする。

<welcome-page-list> 要素を使うと、
末尾が / で終わるディレクトリに対する要求を、
そのディレクトリ内のファイルに転送することができる。

これは、Apache HTTPD の設定ファイルにおける、
DirectoryIndex ディレクティブに役割が似ている。

    <welcome-page-list>
        <welcome-page>index.html</welcome-page>
        <welcome-page>index.jsp</welcome-page>
    </welcome-page-list>

上記の場合、index.html が存在すれば index.html、
index.html がなくとも、index.jsp が存在すれば、
index.jsp への要求として転送され、
再度 Servlet のマッピングに従って処理される。

ポイントは「転送」ということだ。
例えば、*.jsp が Servlet にマッピングされていれば、
index.jsp へ転送されたとしても、ファイル内容が
そのまま返される訳ではなく Servlet で処理される。

例えば、Struts をメインで使っている場合、
通常、Struts の Servlet を *.do にマッピングする。
この場合、ディレクトリに対する要求は処理できない。

しかし、以下のような welcome-page を記述しておくと、
この要求を Struts で処理することができる。

    <welcome-page-list>
        <welcome-page>index.do</welcome-page>
    </welcome-page-list>

ただし、welcome-page の検索は、
ファイルが存在するかどうかで行われるので、
ディレクトリ内に「index.do」というファイルが必要だ。
index.do という URL は Servlet で処理されるので、
ファイル index.do の内容は空でも構わない。

・<error-page> 要素

HTTP でエラーが発生した場合は、
通常 Servlet コンテナによってエラーページが表示される。
<error-page> 要素を使うと、
このエラーページを好きなものに置き換えることができる。

これは、Apache HTTPD の設定ファイルにおける、
ErrorDocument ディレクティブに役割が似ている。

<error-page> 要素には 2 種類あり、
1 つは HTTP ステータスに対応するもの。
もう 1 つは、Java 例外に対応するものである。

まずは、HTTP ステータスに対するものを見てみよう。

    <error-page>
        <error-code>404</error-code>
        <location>/notfound.html</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error.html</location>
    </error-page>

上記の例では、上が HTTP 404 (Not Found) を処理するもの、
下が HTTP 500 (Internal Server Error) を処理するものだ。

この場合、もし存在しない URL に要求があると、
既定のページの代わりに /notfound.html に転送される。
また、Web アプリケーション自身に問題があったり、
Servlet で例外がが発生した場合は、
/error.html に転送される。

次に、Java 例外に対するものを見てみよう。

通常、Web アプリケーションでの例外は、
HTTP 500 ステータスコードに割り当てられるので、
<error-code>500</error-code> で処理することができる。

その際、エラーについての情報は、
以下のリクエスト属性に設定されるので、
エラー用の JSP や Servlet では、
その内容を参照することができる。

・javax.servlet.error.status_code (java.lang.Integer)
・javax.servlet.error.exception_type (java.lang.Class)
・javax.servlet.error.message (java.lang.String)
・javax.servlet.error.exception (java.lang.Throwable)
・javax.servlet.error.request_uri (java.lang.String)
・javax.servlet.error.servlet_name (java.lang.String)

しかし、状況によっては、発生した例外の種類によって、
ページ自体を分けた方が楽な場合がある。

    <error-page>
        <exception-type>jp.loafer.CustomException</exception-type>
        <location>/myerror.jsp</location>
    </error-page>

上記の設定では、例外のクラス型が、
jp.loafer.CustomException 派生クラスの場合のみ、
/myerror.jsp に転送されるように設定できるのだ。

なので、Web アプリケーションを作る際には、
ビジネスロジックで発生したエラーは、
独自の例外型で発生させるようにしておけば好ましい。

HTTP コード型と Java 例外型の設定は混在可能であり、
Java 例外型の設定のほうが優先されるようになっている。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.