例外とは、サーブレット内で検出されたエラーのことです。例外は、サーブレットがフォームデータを処理するときなどランタイムで発生することも、JSP をプリコンパイルするときなどコンパイル時に発生することもあります。Web アプリケーションを運用開始する前に、コンパイル時の例外をキャッチする必要があります。このセクションでは、サーブレットと JSP でランタイムの例外を処理する方法を説明します。
Java サーブレットでは、例外はクラス javax.servlet.ServletException
のインスタンスで表されます。
WEB-INF/web.xml ファイルの error-page
要素を使用すると、Web アプリケーションがエラーを処理する方法を定義できます。error-page
要素を SERVER-INF/default-web.xml ファイルに追加することで、JRun サーバのすべての Web アプリケーションに関してエラー処理を定義することもできます。
次のセクションで説明されているように、error-page
要素で、例外タイプ別やエラーコード別に例外を定義します。web.xml ファイル内のこれらの要素の順序によって、エラーハンドラが決まります。JRun は、error-code
や exception-type
と一致する最初の error-page 要素で指定された位置にエラー処理を転送します。
web.xml ファイルの error-page
の exception-type サブ要素によって、サーブレットの処理中に投げられた Java 例外を JRun が処理する方法が決まります。
exception-type に対して完全修飾の Java エラーを定義し、そのエラーを location 要素内で送信先にマッピングします。次の例では、FileNotFound 例外を 404.jsp ページにマッピングします。
<error-page>
<exception-type>java.io.FileNotFoundException</exception-type> <location>/error-pages/404.jsp</location> </error-page>
HttpServletRequest オブジェクトと HttpServletResponse オブジェクトによってエラー情報にアクセスできるので、役に立つデバッグ情報や目的の例外ハンドラを生成できます。詳細については、 「エラー属性へのアクセス」 を参照してください。
web.xml ファイルの error-page の error-code サブ要素によって、サーブレットの処理中に生成された HTTP エラーコードを JRun が処理する方法が決まります。
error-code 要素のために HTTP ステータスコードを定義し、そのコードを location 要素で転送先にマッピングします。次の例では、HTTP 500 (内部サーバエラー) ステータスコードを servererror.jsp ページにマッピングします。
<error-page>
<error-code>500</error-code> <location>/error-pages/servererror.jsp</location> </error-page>
次の表に、一般的なエラー関連 HTTP ステータスコードをリストします。
HTTP エラーコード |
説明 |
---|---|
400 |
不正なリクエスト |
401 |
無許可 |
403 |
禁止 |
404 |
発見できず |
408 |
リクエストタイムアウト |
500 |
内部サーバエラー |
エラーコードの完全なリストについては、HTTP 1.1 RFC (http://www.ietf.org/rfc/rfc2616.txt ) をご覧ください。
HttpServletRequest オブジェクトとHttpServletResponse オブジェクトによってエラー情報にアクセスできるので、役に立つデバッグ情報や目的の例外ハンドラを生成できます。詳細については、 「エラー属性へのアクセス」 を参照してください。
HttpServletRequest オブジェクトとHttpServletResponse オブジェクトによってエラー情報にアクセスできるので、役に立つデバッグ情報や目的の例外ハンドラを生成できます。
エラーが投げられると、JRun はいくつかの属性を request オブジェクトに設定します。次の表で、これらの属性を説明します。
次のコード例では、request オブジェクトからエラー属性を取得し、スタックトレースを含めてそれらをブラウザで表示します。
...
Object status_code = req.getAttribute("javax.servlet.error.status_code"); Object message = req.getAttribute("javax.servlet.error.message"); Object error_type = req.getAttribute("javax.servlet.error.exception_type"); Throwable throwable = (Throwable) req.getAttribute("javax.servlet.error.exception"); Object request_uri = req.getAttribute("javax.servlet.error.request_uri");
out.println("<HTML><BODY>");
out.println("<B>ステータスコード:</B> " + status_code.toString()); out.println("<BR><B> メッセージ</B>:" + message.toString()); out.println("<BR><B>エラータイプ</B>:" + error_type.toString()); out.println("<BR><B>リクエスト URI</B>:" + request_uri.toString()); out.println("<HR><PRE>"); if (throwable != null) { throwable.printStackTrace(out); } ...
次に示すように、web.xml ファイルでは、エラーハンドラの場所とエラーハンドラが処理するエラーのタイプが定義されます。
<error-page>
<exception-type>javax.servlet.ServletException</exception-type> <location>/servlet/ErrorHandler</location> </error-page>
エラーを生成してこの例をテストするために、次のように数を 0 で除算する式を含む JSP を作成します。
<%= 42/0 %>
サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。