Servlets - Gestion des exceptions

Lorsqu'un servlet lève une exception, le conteneur Web recherche les configurations dans web.xml qui utilisent l'élément de type exception pour une correspondance avec le type d'exception levé.

Vous devrez utiliser le error-page élément dans web.xml pour spécifier l'appel des servlets en réponse à certains exceptions ou HTTP status codes.

Configuration web.xml

Considérez, vous avez un servlet ErrorHandler qui serait appelé chaque fois qu'il y a une exception ou une erreur définie. Voici l'entrée créée dans web.xml.

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

Si vous voulez avoir un gestionnaire d'erreur générique pour toutes les exceptions, vous devez définir la page d'erreur suivante au lieu de définir des éléments de page d'erreur séparés pour chaque exception -

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

Voici les points à noter sur le fichier web.xml ci-dessus pour la gestion des exceptions -

  • Le servlet ErrorHandler est défini de la manière habituelle comme n'importe quel autre servlet et configuré dans web.xml.

  • S'il y a une erreur avec le code d'état 404 (non trouvé) ou 403 (interdit), le servlet ErrorHandler est appelé.

  • Si l'application Web lève ServletException ou IOException, le conteneur Web appelle le servlet / ErrorHandler.

  • Vous pouvez définir différents gestionnaires d'erreurs pour gérer différents types d'erreurs ou d'exceptions. L'exemple ci-dessus est très générique et j'espère qu'il servira à vous expliquer le concept de base.

Attributs de demande - Erreurs / exceptions

Voici la liste des attributs de requête auxquels un servlet de gestion des erreurs peut accéder pour analyser la nature de l'erreur / exception.

N ° Sr. Attribut et description
1

javax.servlet.error.status_code

Cet attribut donne un code d'état qui peut être stocké et analysé après stockage dans un type de données java.lang.Integer.

2

javax.servlet.error.exception_type

Cet attribut donne des informations sur le type d'exception qui peut être stocké et analysé après stockage dans un type de données java.lang.Class.

3

javax.servlet.error.message

Cet attribut donne des informations de message d'erreur exact qui peuvent être stockées et analysées après stockage dans un type de données java.lang.String.

4

javax.servlet.error.request_uri

Cet attribut donne des informations sur l'URL appelant le servlet et il peut être stocké et analysé après stockage dans un type de données java.lang.String.

5

javax.servlet.error.exception

Cet attribut donne des informations sur l'exception déclenchée, qui peuvent être stockées et analysées.

6

javax.servlet.error.servlet_name

Cet attribut donne le nom du servlet qui peut être stocké et analysé après stockage dans un type de données java.lang.String.

Exemple de servlet de gestionnaire d'erreurs

Cet exemple vous donnerait une compréhension de base de la gestion des exceptions dans Servlet, mais vous pouvez écrire des applications de filtrage plus sophistiquées en utilisant le même concept -

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

Compiler ErrorHandler.java de la manière habituelle et mettez votre fichier de classe dans / webapps / ROOT / WEB-INF / classes.

Ajoutons la configuration suivante dans web.xml pour gérer les exceptions -

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

Essayez maintenant d'utiliser un servlet qui lève une exception ou saisit une URL incorrecte, cela déclencherait l'appel de Web Container ErrorHandlerservlet et afficher un message approprié tel que programmé. Par exemple, si vous tapez une URL incorrecte, le résultat suivant s'affiche:

The status code : 404

Le code ci-dessus peut ne pas fonctionner avec certains navigateurs Web. Alors essayez avec Mozilla et Safari et cela devrait fonctionner.