Gestion des exceptions des servlets


Lorsqu'un servlet lève une exception, le conteneur Web recherche dans web.xml à l'aide de l'élément exception-type une configuration qui correspond au type d'exception levée.

Vous devez utiliser l'élément error-page dans web.xml pour spécifier l'appel de servlet approprié à effectuer pour une Exception ou HTTP Code d'état .

La configuration

web.xml

suppose qu'il existe un ErrorHandler pour le Servelt qui est appelé lorsqu'une exception ou une erreur définie se produit. Voici les éléments créés dans web.xml.

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

Si vous souhaitez avoir un gestionnaire d'erreurs commun pour toutes les exceptions, alors au lieu de définir un élément de page d'erreur distinct pour chaque exception, vous devez définir la page d'erreur suivante :

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

Voici les points à noter concernant la gestion des exceptions web.xml ci-dessus :

  • Servelt ErrorHandler est défini de la même manière que les autres Servelts et est configuré dans web.xml.

  • Si un code d'état d'erreur apparaît, qu'il s'agisse de 404 (Introuvable) ou 403 (Interdit), la Servlet de ErrorHandler sera appelée.

  • Si l'application Web génère ServletException ou IOException, alors le conteneur Web appellera le servlet du ErrorHandler.

  • Vous pouvez définir différents gestionnaires d'erreurs pour gérer différents types d'erreurs ou d'exceptions. Les exemples ci-dessus sont très généraux et j'espère que vous pourrez comprendre les concepts de base à travers des exemples.

Attributs de requête - Erreur/Exception

Ce qui suit est une liste d'attributs de requête accessibles par le servlet de gestion des erreurs pour analyser la nature de l'erreur/exception .

序号属性 & 描述
1javax.servlet.error.status_code
该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。
2javax.servlet.error.exception_type
该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。
3javax.servlet.error.message
该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。
4javax.servlet.error.request_uri
该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。
5javax.servlet.error.exception
该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。
6javax.servlet.error.servlet_name
该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。

Exemple de gestionnaire d'erreurs de servlet

Ce qui suit est une instance de servlet qui gérera toute erreur ou exception que vous définissez.

Cet exemple vous donne une compréhension de base de la gestion des exceptions dans les servlets, et vous pouvez utiliser les mêmes concepts pour écrire des applications de gestion des exceptions plus complexes :

// 导入必需的 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
  {
      // 分析 Servlet 异常       
      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");
 
      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>");
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

Compilez de la manière habituelleErrorHandler .java, placez vos fichiers de classe dans <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Ajoutons la configuration suivante dans le web. Le conteneur appelle le Servlet de

ErrorHandler

et affiche le message approprié. Par exemple, si vous entrez une mauvaise URL, le résultat suivant s'affichera :

<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>
Le code ci-dessus peut ne pas fonctionner correctement dans certains navigateurs Web. Essayez donc d'utiliser les navigateurs Mozilla et Safari, ils devraient fonctionner correctement dans les deux navigateurs.