Servlets-exception-handling

提供:Dev Guides
移動先:案内検索

サーブレット-例外処理

サーブレットが例外をスローすると、Webコンテナーは、スローされた例外タイプと一致する例外タイプ要素を使用する web.xml 内の構成を検索します。

web.xmlの error-page 要素を使用して、特定の*例外*またはHTTP *ステータスコード*に応じてサーブレットの呼び出しを指定する必要があります。

web.xmlの構成

定義された例外またはエラーがあるたびに呼び出される_ErrorHandler_サーブレットがあるとします。 web.xmlで作成されるエントリは次のとおりです。

<!-- servlet definition -->
<servlet>
   <servlet-name>ErrorHandler</servlet-name>
   <servlet-class>ErrorHandler</servlet-class>
</servlet>

<!-- servlet mappings -->
<servlet-mapping>
   <servlet-name>ErrorHandler</servlet-name>
   <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<!-- error-code related error pages -->
<error-page>
   <error-code>404</error-code>
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <error-code>403</error-code>
   <location>/ErrorHandler</location>
</error-page>

<!-- exception-type related error pages -->
<error-page>
   <exception-type>
      javax.servlet.ServletException
   </exception-type >
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <exception-type>java.io.IOException</exception-type >
   <location>/ErrorHandler</location>
</error-page>

すべての例外に対して汎用エラーハンドラを使用する場合は、例外ごとに個別のエラーページ要素を定義するのではなく、次のエラーページを定義する必要があります-

<error-page>
   <exception-type>java.lang.Throwable</exception-type >
   <location>/ErrorHandler</location>
</error-page>

以下は、例外処理のための上記のweb.xmlに関する注意点です-

  • サーブレットErrorHandlerは、他のサーブレットと同様に通常の方法で定義され、web.xmlで構成されます。
  • ステータスコードに404(Not Found)または403(Forbidden)のエラーがある場合、ErrorHandlerサーブレットが呼び出されます。
  • WebアプリケーションがServletExceptionまたはIOExceptionをスローすると、Webコンテナは/ErrorHandlerサーブレットを呼び出します。 *さまざまなタイプのエラーまたは例外を処理するために、さまざまなエラーハンドラを定義できます。 上記の例は非常に一般的であり、基本概念を説明する目的に役立つことを願っています。

リクエスト属性-エラー/例外

以下は、エラー/例外の性質を分析するためにエラー処理サーブレットがアクセスできるリクエスト属性のリストです。

Sr.No. Attribute & Description
1
  • javax.servlet.error.status_code*

この属性は、java.lang.Integerデータ型に格納した後に格納および分析できるステータスコードを提供します。

2

javax.servlet.error.exception_type

この属性は、java.lang.Classデータ型に格納した後に格納および分析できる例外タイプに関する情報を提供します。

3

javax.servlet.error.message

この属性は、java.lang.Stringデータ型に保存した後に保存および分析できる正確なエラーメッセージを提供します。

4

javax.servlet.error.request_uri

この属性は、サーブレットを呼び出すURLに関する情報を提供し、java.lang.Stringデータ型に格納した後に格納および分析できます。

5

javax.servlet.error.exception

この属性は、発生した例外に関する情報を提供し、保存および分析できます。

6

javax.servlet.error.servlet_name

この属性は、java.lang.Stringデータ型に格納した後に格納および分析できるサーブレット名を提供します。

エラーハンドラサーブレットの例

この例では、サーブレットでの例外処理の基本的な理解が得られますが、同じ概念を使用してより高度なフィルタアプリケーションを作成できます-

//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

//Extend HttpServlet class
public class ErrorHandler extends HttpServlet {

  //Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

     //Analyze the servlet exception
      Throwable throwable = (Throwable)
      request.getAttribute("javax.servlet.error.exception");
      Integer statusCode = (Integer)
      request.getAttribute("javax.servlet.error.status_code");
      String servletName = (String)
      request.getAttribute("javax.servlet.error.servlet_name");

      if (servletName == null) {
         servletName = "Unknown";
      }
      String requestUri = (String)
      request.getAttribute("javax.servlet.error.request_uri");

      if (requestUri == null) {
         requestUri = "Unknown";
      }

     //Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Error/Exception Information";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n");

      if (throwable == null && statusCode == null) {
         out.println("<h2>Error information is missing</h2>");
         out.println("Please return to the <a href=\"" +
            response.encodeURL("http://localhost:8080/") +
            "\">Home Page</a>.");
      } else if (statusCode != null) {
         out.println("The status code : " + statusCode);
      } else {
         out.println("<h2>Error information</h2>");
         out.println("Servlet Name : " + servletName + "</br></br>");
         out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>");
         out.println("The request URI: " + requestUri + "<br><br>");
         out.println("The exception message: " + throwable.getMessage( ));
      }
      out.println("</body>");
      out.println("</html>");
   }

  //Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      doGet(request, response);
   }
}

通常の方法で ErrorHandler.java をコンパイルし、クラスファイルを/webapps/ROOT/WEB-INF/classesに配置します。

例外を処理するためにweb.xmlに次の構成を追加しましょう-

<servlet>
   <servlet-name>ErrorHandler</servlet-name>
   <servlet-class>ErrorHandler</servlet-class>
</servlet>

<!-- servlet mappings -->
<servlet-mapping>
   <servlet-name>ErrorHandler</servlet-name>
   <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<error-page>
   <error-code>404</error-code>
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <exception-type>java.lang.Throwable</exception-type >
   <location>/ErrorHandler</location>
</error-page>

次に、例外を発生させるか、間違ったURLを入力するサーブレットを使用してみてください。これにより、Webコンテナが ErrorHandler サーブレットを呼び出し、プログラムに従って適切なメッセージを表示します。 たとえば、間違ったURLを入力すると、次の結果が表示されます-

The status code : 404

上記のコードは、一部のWebブラウザーでは機能しない場合があります。 したがって、MozillaとSafariを試してみてください。