English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet 異常処理

Servletが例外を投げたとき、Webコンテナはexceptionを使用して-type要素の web.xml 中で、投げられた例外のタイプに一致する設定を検索します。

web.xml内で使用する必要があります。 error-page 要素を使用して特定の例外 またはHTTP ステータスコード 対応するServlet呼び出しを行います。

web.xml設定

仮に、以下の ErrorHandler のServletは、定義された例外やエラーが発生したときに呼び出されます。以下は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 を指定するのではなく、各例外ごとに error を定義する必要があります。-page エレメント:

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

以下は、上記の web.xml エラーハンドリングに注意すべきポイントです:

  • Servlet ErrorHandler は他の Servlet と同様に定義され、web.xml で設定されます。

  • エラーステータスコードが発生した場合、どちらであれ 404(Not Found 未找到)または 403(Forbidden 禁止)の場合、ErrorHandler の Servlet が呼び出されます。

  • Web アプリケーションが以下をスローした場合 ServletException または IOExceptionそれでは、Web コンテナは ErrorHandler の Servlet を呼び出します。

  • 異なるタイプのエラーまたは例外を処理するために、異なるエラーハンドリングプログラムを定義することができます。上の例は非常に一般的であり、例を通じて基本的な概念を理解していただければ幸いです。

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

以下は、エラーハンドリングの Servlet がアクセスできるリクエスト属性のリストで、エラーを分析するために使用されます。/例外の性質。

順序番号属性 & 説明
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 が Servlet を呼び出すに関する情報を提供し、情報は保存され、java.lang.String データ型として保存された後、分析することができます。
5javax.servlet.error.exception
この属性は、例外が発生した情報を提供し、情報は保存され、java.lang.Throwable データ型として保存された後、分析することができます。
6javax.servlet.error.servlet_name
この属性は、Servletの名前を示し、名前は保存され、java.lang.Stringデータ型として保存され、解析されます。

Servletエラーハンドリングプログラムの例

以下は、定義したエラーまたは例外が発生した場合のエラーハンドリングプログラムを提供するServletの例です。

このサンプルでは、Servlet内の例外処理について基本的な理解を得ることができます。同じ概念を使って、より複雑な例外処理アプリケーションを書くことができます:

//必要な 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
    {
        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;charset=UTF-8");
    
        PrintWriter out = response.getWriter();
        String title = "基本チュートリアルウェブ Error/Exception 情報";
       
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
            "<html>\n" +
             "<head><title>" + title + "</title></head>\n" +
             "<body bgcolor=\"#f0f0f0\">\n");
           out.println("<h1>基本チュートリアルウェブ例外情報の例デモ</h1>");
           if (throwable == null && statusCode == null){
              out.println("<h2>エラーメッセージが失われた</h2>");
              out.println("戻るには<a href=\"" + 
            response.encodeURL("http://localhost:8080/)") + 
                "\">ホームページ</a>。");
           }else if (statusCode != null) {
              out.println("エラーコード: " + statusCode);
        }else{
               out.println("<h2>エラーメッセージ</h2>");
              out.println("Servlet Name : " + servletName + 
                              "</br></br>");
              out.println("例外の種類: " + 
                              throwable.getClass( ).getName( ) + 
                              "</br></br>");
              out.println("リクエスト URI: " + requestUri + 
                              "<br><br>");
              out.println("例外情報: " + 
                                  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-installation-directory>/webapps/ROOT/WEB-INF/classes 中。

让我们在 web.xml ファイルに以下の設定を追加して例外を処理します:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>com.w3codebox.test.ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/TomcatTest/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
    <error-code>404</error-code>
    <location>/TomcatTest/ErrorHandler</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
</error-page>
</web-app>

現在、例外を発生させる Servletを使用するか、誤った URLを入力して、Web コンテナが呼び出されることを試みます。 ErrorHandler の Servlet、適切なメッセージを表示します。例えば、誤った URL(例:http:)を入力した場合、//localhost:8080/TomcatTest/UnKonwPage)のとき、以下の結果が表示されます:

エラーコード:404