Tutorials  /  JavaScript

Servlet Exception und Error Handling Beispiel

Ccentron Redaktion · Februar 2024 ·5 Min. Lesezeit ·JavaScript, Tutorial

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.

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

VM

Passende Infrastruktur bei centron

Node-Anwendungen wollen deployt werden: ccloud³ VMs mit vollem Root-Zugriff ab 3,12 € im Monat – oder gleich als Managed Server, wenn der Betrieb nicht bei Ihnen liegen soll. Cloud Server mieten →

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

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

Code
<?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.

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

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie JavaScript
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren