サーブレット例外処理
サーブレットが例外をスローすると、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 のサーブレットを呼び出します。
さまざまなタイプのエラーまたは例外を処理するために、さまざまなエラー ハンドラーを定義できます。上記の例は非常に一般的なものですが、例を通して基本的な概念を理解していただければ幸いです。
リクエスト属性 - エラー/例外
以下は、エラー/例外の性質を分析するためにエラー処理サーブレットによってアクセスできるリクエスト属性のリストです。
シリアル番号 | 属性と説明 |
---|---|
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 この属性は、例外によって生成された情報を提供します。情報は java.lang.Throwable データ型として保存でき、保存後に分析できます。 |
6 | javax.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 ブラウザを使用してみてください。どちらのブラウザでも問題なく動作するはずです。