Servlet Ausnahmebehandlung

Wenn ein Servlet eine Ausnahme auslöst, sucht der Web-Container in der [web.xml], die das exception-type-Element verwendet,web.xmlnach einer Konfiguration, die dem ausgelösten Ausnahmetyp entspricht.

Sie müssen in web.xml daserror-pageElement verwenden, um anzugeben, dass für eine bestimmteAusnahmeoder einen HTTPStatuscode,der entsprechende Servlet-Aufruf erfolgen sollte.

web.xml-Konfiguration

Angenommen, es gibt einErrorHandlerServlet, das aufgerufen wird, wenn eine definierte Ausnahme oder ein Fehler auftritt. Der folgende Eintrag wird in web.xml erstellt.

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

Wenn Sie einen generischen Fehlerhandler für alle Ausnahmen wünschen, sollten Sie das folgende error-page-Element definieren, anstatt für jede Ausnahme ein separates error-page-Element zu definieren:

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

Die folgenden Punkte sind zur obigen Ausnahmebehandlung in web.xml zu beachten:

  • Das ErrorHandler-Servlet wird genauso wie andere Servlets definiert und in web.xml konfiguriert.
  • Wenn ein beliebiger Fehlerstatuscode auftritt, ob es sich um 404 (Not Found) oder 403 (Forbidden) handelt, wird das ErrorHandler-Servlet aufgerufen.
  • Wenn die WebanwendungServletExceptionoderIOExceptionauslöst, ruft der Web-Container das ErrorHandler-Servlet auf.
  • Sie können verschiedene Fehlerhandler definieren, um unterschiedliche Arten von Fehlern oder Ausnahmen zu behandeln. Das obige Beispiel ist sehr generisch; wir hoffen, dass Sie die grundlegenden Konzepte anhand des Beispiels verstehen können.

Request-Attribute - Fehler/Ausnahme

Im Folgenden finden Sie eine Liste von Request-Attributen, auf die das fehlerbehandelnde Servlet zugreifen kann und die zur Analyse der Art des Fehlers/der Ausnahme verwendet werden.

Nein.Attribut & Beschreibung
1javax.servlet.error.status_code
Dieses Attribut gibt den Statuscode an, der als java.lang.Integer-Datentyp gespeichert und nach dem Speichern analysiert werden kann.
2javax.servlet.error.exception_type
Dieses Attribut gibt Informationen über den Ausnahmetyp, der gespeichert und analysiert werden kann, nachdem er als java.lang.Class-Datentyp gespeichert wurde.
3javax.servlet.error.message
Dieses Attribut gibt Informationen über die genaue Fehlermeldung, die gespeichert und analysiert werden kann, nachdem sie als java.lang.String-Datentyp gespeichert wurde.
4javax.servlet.error.request_uri
Dieses Attribut gibt Informationen über die URL, die das Servlet aufgerufen hat, die gespeichert und analysiert werden kann, nachdem sie als java.lang.String-Datentyp gespeichert wurde.
5javax.servlet.error.exception
Dieses Attribut gibt Informationen über die Ausnahme, die ausgelöst wurde, die gespeichert und analysiert werden kann, nachdem sie als java.lang.Throwable-Datentyp gespeichert wurde.
6javax.servlet.error.servlet_name
Dieses Attribut gibt den Namen des Servlets an, der gespeichert und analysiert werden kann, nachdem er als java.lang.String-Datentyp gespeichert wurde.

Beispiel für einen Servlet-Fehlerbehandler

Das Folgende ist eine Servlet-Instanz, die als Fehlerbehandler für alle Fehler oder Ausnahmen fungiert, die Sie definieren.

Dieses Beispiel vermittelt Ihnen ein grundlegendes Verständnis der Ausnahmebehandlung in Servlets, und Sie können dieselben Konzepte verwenden, um komplexere Anwendungen zur Ausnahmebehandlung zu schreiben:

//导入必需的 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 = "Example 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>Example异常信息实例演示</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);
    }
}

Kompilieren Sie auf die übliche WeiseErrorHandler.java, und legen Sie Ihre Klassendateien in <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes ab.

Fügen wir die folgende Konfiguration zu web.xml hinzu, um Ausnahmen zu behandeln:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>com.example.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>  

Versuchen Sie nun, ein Servlet zu verwenden, das eine Ausnahme auslöst, oder geben Sie eine falsche URL ein, wodurch der Web-Container dazu veranlasst wird, dasErrorHandler-Servlet aufzurufen und eine geeignete Meldung anzuzeigen. Wenn Sie beispielsweise eine falsche URL eingeben (z. B. http://localhost:8080/TomcatTest/UnKonwPage), wird das folgende Ergebnis angezeigt:

Andere Erweiterungen