Servlets - Ausnahmebehandlung

Wenn ein Servlet eine Ausnahme auslöst, durchsucht der Webcontainer die Konfigurationen in web.xml die das Element vom Ausnahmetyp für eine Übereinstimmung mit dem ausgelösten Ausnahmetyp verwenden.

Sie müssten die verwenden error-page Element in web.xml, um den Aufruf von Servlets als Antwort auf bestimmte zu spezifizieren exceptions oder HTTP status codes.

web.xml Konfiguration

Angenommen , Sie haben ein ErrorHandler- Servlet, das aufgerufen wird, wenn eine Ausnahme oder ein Fehler definiert ist. Es folgt der in web.xml erstellte Eintrag.

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

Wenn Sie einen generischen Fehlerbehandler für alle Ausnahmen haben möchten, sollten Sie die folgende Fehlerseite definieren, anstatt für jede Ausnahme separate Fehlerseitenelemente zu definieren.

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

Im Folgenden sind die Punkte aufgeführt, die in der obigen Datei web.xml für die Ausnahmebehandlung zu beachten sind:

  • Das Servlet ErrorHandler wird wie gewohnt wie jedes andere Servlet definiert und in der Datei web.xml konfiguriert.

  • Wenn ein Fehler mit dem Statuscode 404 (Nicht gefunden) oder 403 (Verboten) auftritt, wird das Servlet ErrorHandler aufgerufen.

  • Wenn die Webanwendung entweder ServletException oder IOException auslöst, ruft der Webcontainer das Servlet / ErrorHandler auf.

  • Sie können verschiedene Fehlerbehandlungsroutinen definieren, um verschiedene Arten von Fehlern oder Ausnahmen zu behandeln. Das obige Beispiel ist sehr allgemein gehalten und hofft, dass es dem Zweck dient, Ihnen das Grundkonzept zu erklären.

Anforderungsattribute - Fehler / Ausnahmen

Im Folgenden finden Sie eine Liste der Anforderungsattribute, auf die ein Servlet zur Fehlerbehandlung zugreifen kann, um die Art des Fehlers / der Ausnahme zu analysieren.

Sr.Nr. Attribut & Beschreibung
1

javax.servlet.error.status_code

Dieses Attribut gibt den Statuscode an, der nach dem Speichern in einem Datentyp java.lang.Integer gespeichert und analysiert werden kann.

2

javax.servlet.error.exception_type

Dieses Attribut enthält Informationen zum Ausnahmetyp, die nach dem Speichern in einem Datentyp java.lang.Class gespeichert und analysiert werden können.

3

javax.servlet.error.message

Dieses Attribut gibt eine genaue Fehlermeldung an, die nach dem Speichern in einem java.lang.String-Datentyp gespeichert und analysiert werden kann.

4

javax.servlet.error.request_uri

Dieses Attribut enthält Informationen zur URL, die das Servlet aufruft, und kann nach dem Speichern in einem Datentyp java.lang.String gespeichert und analysiert werden.

5

javax.servlet.error.exception

Dieses Attribut gibt Informationen über die ausgelöste Ausnahme, die gespeichert und analysiert werden können.

6

javax.servlet.error.servlet_name

Dieses Attribut gibt den Servlet-Namen an, der nach dem Speichern in einem java.lang.String-Datentyp gespeichert und analysiert werden kann.

Beispiel für ein Fehlerbehandlungs-Servlet

Dieses Beispiel vermittelt Ihnen ein grundlegendes Verständnis der Ausnahmebehandlung in Servlet. Sie können jedoch komplexere Filteranwendungen mit demselben Konzept schreiben.

// 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);
   }
}

Kompilieren ErrorHandler.java in gewohnter Weise und legen Sie Ihre Klassendatei in / webapps / ROOT / WEB-INF / classes.

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

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

Versuchen Sie nun, ein Servlet zu verwenden, das eine Ausnahme auslöst oder eine falsche URL eingibt. Dies würde den Aufruf von Web Container auslösen ErrorHandlerServlet und zeigen eine entsprechende Meldung wie programmiert an. Wenn Sie beispielsweise eine falsche URL eingeben, wird das folgende Ergebnis angezeigt:

The status code : 404

Der obige Code funktioniert möglicherweise nicht mit einigen Webbrowsern. Versuchen Sie es mit Mozilla und Safari und es sollte funktionieren.