Section4 - サーバーサイドの例外を扱うためのサーブレットのデザインと開発

4.1 下記それぞれのケースにおいて、ビジネスロジックの例外を処理するために 正確に構造化されたコードを識別し、そのコードの振る舞いについて、コードと合致させる。

・sendErrorレスポンスを用いてHTTPエラーを返す

HttpServletResponse#sendError(int sc)
HttpServletResponse#sendError(int sc, String msg)
//ステータスコードをつけてHTTPエラーをおくる
response.sendError(response.SC_NOT_FOUND);

・setStatusメソッドを用いてHTTPエラーを返す

HttpServletResponse#setStatus(int sc)
//レスポンスにステータスコードを付ける
response.setStatus(response.SC_NOT_FOUND);

4.2 与えられたビジネスロジックの例外セットに関して、以下を説明

それぞれの例外を処理するためのweb.xml使用法の特徴

error-pageタグを使います。 エラーには、ステータスコード(error-code)か、例外タイプ(exception-type)の どちらかを指定できます。
  <!--
    HTTPカスタマイズエラーページの表示
    IEの場合、"HTTPエラーメッセージを簡易表示する"のチェックをはずす必要があります。
  -->
  <error-page>
    <error-code>404</error-code>
    <location>/jsp/errors/NotFound.jsp</location>
  </error-page>

  <!--
    Exceptionタイプによるエラーページの表示
  -->
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/jsp/errors/Exception.jsp</location>
  </error-page>

error-page要素のDTD

<!ELEMENT error-page ((error-code | exception-type), location)>

エラーページにリクエストを転送するRequestDispatcherの使用法

web.xmlに上記の記述をすれば、doGet()などから例外がthrowされたとき、 指定したページに遷移します。

同じことをRequestDispatcherを使って、
RequestDispacher dispacher;

try{
  //何かの処理を行い通常のページ遷移
  dispacher = request.getRequestDispacher("/result.jsp");
}catch(HogeException){
  dispacher = request.getRequestDispacher("/hoge_error.jsp");
}catch(Throwable){
  dispacher = request.getRequestDispacher("/system_error.jsp");
}

if(dispacher == null){
  response.sendError(response.SC_NOT_FOUND);
}

dispacher.forward(request, response);
のようにも記述できます。

web.xmlにおける宣誓処理の指定

※2つ上に書いてるようなこと?

4.3.以下で使用されているメソッドを記述

Webアプリケーションのログへのメッセージの記述

javax.servlet.log(String msg)

Webアプリケーションのログへのメッセージと例外の記述

javax.servlet.log(String message, Throwable t) ログにはメッセージの他にスタックトレースも記録されます。

補足

基本的なHTTPステータスコードと起こりうる場面
ServletResponse
での定数
ステータス
コード
説明
SC_OK 200 リクエストが正常に成功したことを示す
SC_MOVED_PERMANENTLY 301 リソースが新しい場所に永続的に移動した
SC_MOVED_TEMPORARILY 302 リソースが一時的に他の場所に移動したこと。
相対URIには元々のURLを利用。
HttpServletResponse#sendRedirect(1)のとき?
301との違いがわからん。
SC_BAD_REQUEST 400 リクエストが文法的に間違っている
SC_NOT_FOUND 404 リクエストされたリソースが利用可能でない。
普通に存在しないJSPやサーブレットを読んだ場合。
RequestDispacher.forward(2)で飛ばす先のリソースが 存在しなかった場合もこのコードになる。
SC_METHOD_NOT_ALLOWED 405 Request-Lineで指定されたメソッドが Request-URIで識別されるリソースに対して許可されていない。
HttpServletを継承したサーブレットで、 doPostしか定義していないのにGETメソッドを読んだ場合。 HTTP 1.1以外だと400?

Statusコードの詳細