Servlet Exception und Error Handling Beispiel

Heute werden wir uns die Servlet Exception und Fehlerbehandlung ansehen.

Servlet Exception

Wenn Sie bemerken, werfen die Methoden doGet() und doPost() javax.servlet.ServletException und IOException. Lassen Sie uns sehen, was passiert, wenn wir diese Ausnahmen von unserer Anwendung werfen. Ich werde ein einfaches Servlet schreiben, das die ServletException wirft.

package com.journaldev.servlet.exception;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MyExceptionServlet")
public class MyExceptionServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        throw new ServletException("GET method is not supported.");
    }
}

Da Browser nur HTML verstehen, verarbeitet der Servlet-Container die Ausnahme, wenn unsere Anwendung eine Ausnahme auslöst, und generiert eine HTML-Antwort. Diese Logik ist spezifisch für den Servlet-Container. Ich verwende Tomcat und erhalte diese Fehlerseite. Wenn Sie andere Server wie JBoss oder Glassfish verwenden, erhalten Sie möglicherweise eine andere HTML-Fehlerantwort. Das Problem mit dieser Antwort ist, dass sie für den Benutzer keinen Wert hat. Außerdem zeigt sie unsere Anwendungsklassen und Serverdetails dem Benutzer an, was für den Benutzer keinen Sinn macht und aus Sicherheitsgründen nicht gut ist.

Servlet-Fehler

Ich bin mir sicher, dass Sie schon einmal einen 404-Fehler gesehen haben, wenn Sie versuchen, eine URL zu erreichen, die nicht existiert. Lassen Sie uns sehen, wie unser Servlet-Container auf den 404-Fehler reagiert. Wieder ist es eine generische HTML-Antwort, die vom Server im Namen unserer Anwendung generiert wird und für den Benutzer wenig bis keinen Wert hat.

Servlet Exception und Error Handling

Die Servlet API unterstützt benutzerdefinierte Exception- und Error-Handler-Servlets, die wir im Deployment-Descriptor konfigurieren können. Der gesamte Zweck dieser Servlets besteht darin, die von der Anwendung ausgelösten Ausnahmen oder Fehler zu behandeln und dem Benutzer eine nützliche HTML-Antwort zu senden. Wir können einen Link zur Startseite der Anwendung oder einige Details bereitstellen, um dem Benutzer zu zeigen, was schiefgelaufen ist. Zunächst müssen wir also ein benutzerdefiniertes Exception- und Error-Handler-Servlet erstellen. Wir können mehrere Exception- und Error-Handler-Servlets für die Anwendung haben, aber der Einfachheit halber werde ich ein einzelnes Servlet erstellen und es für beide Ausnahmen und Fehler verwenden.

AppExceptionHandler.java

package com.journaldev.servlet.exception;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/AppExceptionHandler")
public class AppExceptionHandler extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        processError(request, response);
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        processError(request, response);
    }

    private void processError(HttpServletRequest request,
            HttpServletResponse response) throws 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();
        out.write("<html><head><title>Exception/Error Details</title></head><body>");
        if(statusCode != 500){
            out.write("<h3>Error Details</h3>");
            out.write("<strong>Status Code</strong>:"+statusCode+"<br>");
            out.write("<strong>Requested URI</strong>:"+requestUri);
        }else{
            out.write("<h3>Exception Details</h3>");
            out.write("<ul><li>Servlet Name:"+servletName+"</li>");
            out.write("<li>Exception Name:"+throwable.getClass().getName()+"</li>");
            out.write("<li>Requested URI:"+requestUri+"</li>");
            out.write("<li>Exception Message:"+throwable.getMessage()+"</li>");
            out.write("</ul>");
        }
        
        out.write("<br><br>");
        out.write("<a href=\"index.html\">Home Page</a>");
        out.write("</body></html>");
    }
}

Lassen Sie uns sehen, wie wir es im Deployment-Descriptor konfigurieren können und dann werden wir verstehen, wie es implementiert ist und wie es funktioniert.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>ServletExceptionHandling</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <error-page>
    <error-code>404</error-code>
    <location>/AppExceptionHandler</location>
  </error-page>
  
  <error-page>
  <exception-type>javax.servlet.ServletException</exception-type>
  <location>/AppExceptionHandler</location>
  </error-page>
</web-app>


Wie Sie sehen können, ist es sehr einfach, Exception-Handler-Servlets für die Anwendung mit dem Element error-page zu spezifizieren. Jedes error-page-Element sollte entweder ein error-code- oder ein exception-type-Element enthalten. Wir definieren das Exception-Handler-Servlet im location-Element. Basierend auf der obigen Konfiguration, wenn die Anwendung einen 404-Fehler oder ServletException auslöst, wird dies vom AppExceptionHandler-Servlet behandelt. Wenn ein solches Ausnahme- und Fehler-Szenario auftritt, ruft der Servlet-Container die entsprechende HTTP-Methode des Exception-Handler-Servlets auf und übergibt das Request- und Response-Objekt. Beachten Sie, dass ich die Implementierung sowohl der doGet()- als auch der doPost()-Methoden bereitgestellt habe, damit sie GET- und POST-Anfragen verarbeiten und mit einer gemeinsamen Methode bearbeiten können. Bevor der Servlet-Container das Servlet aufruft, um die Ausnahme zu behandeln, setzt er einige Attribute in der Anfrage, um nützliche Informationen über die Ausnahme zu erhalten, einige davon sind javax.servlet.error.exception, javax.servlet.error.status_code, javax.servlet.error.servlet_name und javax.servlet.error.request_uri. Bei einer Ausnahme ist der Statuscode immer 500, was dem „Internal Server Error“ entspricht, für andere Arten von Fehlern erhalten wir unterschiedliche Fehlercodes wie 404, 403 usw. Mit dem Statuscode präsentiert unsere Implementierung dem Benutzer verschiedene Arten von HTML-Antworten. Es bietet auch einen Hyperlink zur Startseite der Anwendung. Wenn wir jetzt unser Servlet aufrufen, das ServletException auslöst, erhalten wir eine Antwort wie im untenstehenden Bild.

Servlet Exception, Servlet 500 Internal Server Error

If we try to access an invalid URL that will result in 404 response, we will get response like below image.

Servlet Error, Servlet Error Handling, servlet 404

Sieht das nicht gut aus und hilft dem Benutzer, leicht zu verstehen, was passiert ist, und bietet ihm einen Weg, zur richtigen Stelle zu gelangen. Es vermeidet auch, sensible Informationen der Anwendung an den Benutzer zu senden. Wir sollten immer Ausnahmebehandler für unsere Webanwendung bereithalten. Wenn Sie Laufzeitausnahmen und alle anderen Ausnahmen in einem einzigen Ausnahmebehandler behandeln möchten, können Sie den Ausnahmetyp als Throwable angeben.

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

Wenn es mehrere Einträge für Fehlerseiten gibt, sagen wir einen für Throwable und einen für IOException, und die Anwendung wirft eine FileNotFoundException aus, dann wird sie vom Fehlerbehandler von IOException behandelt. Sie können auch eine JSP-Seite als Ausnahmebehandler verwenden, geben Sie einfach den Speicherort der JSP-Datei anstatt der Servlet-Zuordnung an. Das ist alles zur Behandlung von Servlet-Ausnahmen in Webanwendungen, ich hoffe, es hat Ihnen gefallen.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren:

centron Managed Cloud Hosting in Deutschland

Java-Array: So prüfst du Werte effizient

JavaScript
Wie prüft man, ob ein Java Array einen Wert enthält? Es gibt viele Möglichkeiten, um zu überprüfen, ob ein Java Array einen bestimmten Wert enthält. Einfache Iteration mit einer for-Schleife…