このアーカイブは同期化されません。 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 例外型の設定のほうが優先されるようになっている。