サーブレット例外処理


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

Web では error-page 要素を使用する必要があります。

web.xml 設定

は、定義された例外またはエラーが発生したときに呼び出される Servelt の ErrorHandler があることを前提としています。 web.xmlに作成される項目は以下となります。

<!-- servlet 定义 -->
<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet 映射 -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<!-- error-code 相关的错误页面 -->
<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 相关的错误页面 -->
<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 例外についてです。処理上の注意点:

  • Servelt ErrorHandler は他の Servelt と同じ方法で定義され、web.xml で設定されます。

  • エラーステータスコードが発生した場合、404 (Not Found) または 403 (Forbidden) に関わらず、ErrorHandler のサーブレットが呼び出されます。

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

  • さまざまなタイプのエラーまたは例外を処理するために、さまざまなエラー ハンドラーを定義できます。上記の例は非常に一般的なものですが、例を通して基本的な概念を理解していただければ幸いです。

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

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

シリアル番号属性と説明
1javax.servlet.error.status_code
この属性はステータスコードを与え、ステータスコードはjava.lang.Integerとして保存および保存できます。その後、データ型を分析できます。
2javax.servlet.error.Exception_type
この属性は、例外タイプに関する情報を提供します。例外タイプは java.lang.Class データ型として保存でき、保存後に分析できます。
3javax.servlet.error.message
このプロパティは、正確なエラー メッセージに関する情報を提供します。この情報は、java.lang.String データ型として保存した後、保存および分析できます。
4javax.servlet.error.request_uri
この属性は、サーブレットを呼び出す URL に関する情報を提供し、その情報は java.lang.String データ型として保存でき、保存後に分析できます。
5javax.servlet.error.Exception
この属性は、例外によって生成された情報を提供します。情報は java.lang.Throwable データ型として保存でき、保存後に分析できます。
6javax.servlet.error.servlet_name
この属性はサーブレットの名前を与え、java.lang.String データ型として保存した後に保存および分析できます。

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

以下は、定義したエラーまたは例外が発生したときにエラー ハンドラーを処理するサーブレット インスタンスです。

この例では、サーブレットでの例外処理の基本を理解できます。同じ概念を使用して、より複雑な例外処理アプリケーションを作成できます。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// 扩展 HttpServlet 类
public class ErrorHandler extends HttpServlet {
 
  // 处理 GET 方法请求的方法
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 分析 Servlet 异常       
      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";
      }

      // 设置响应内容类型
      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>");
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

通常の方法で ErrorHandler.java をコンパイルし、クラス ファイルを配置します。 <Tomcat のインストール ディレクトリ>/webapps/ROOT/WEB-INF/classes。

Web に次の設定を追加して、適切なメッセージを表示しましょう。たとえば、間違った URL を入力すると、次の結果が表示されます:

<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>

上記のコードは、一部の Web ブラウザでは正しく動作しない可能性があります。したがって、Mozilla ブラウザと Safari ブラウザを使用してみてください。どちらのブラウザでも問題なく動作するはずです。