サーブレット-例外処理

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

あなたは使用する必要があります error-page 特定の応答に応じてサーブレットの呼び出しを指定するweb.xmlの要素 exceptions またはHTTP status codes

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(見つかりません)または403(禁止)のエラーがある場合、ErrorHandlerサーブレットが呼び出されます。

  • WebアプリケーションがServletExceptionまたはIOExceptionのいずれかをスローした場合、Webコンテナは/ ErrorHandlerサーブレットを呼び出します。

  • さまざまなタイプのエラーまたは例外を処理するために、さまざまなエラーハンドラーを定義できます。上記の例は非常に一般的であり、基本的な概念を説明する目的に役立つことを願っています。

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

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

シニア番号 属性と説明
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を試してみると、うまくいくはずです。