English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Manejo de excepciones Servlet

herramientas en línea-Cuando un Servlet lanza una excepción, el contenedor web utiliza exception elemento type web.xml

Debe usar web.xml para buscar la configuración que coincide con el tipo de excepción lanzada. error-página elemento para especificar el acceso a una página específicaExcepción o HTTP código de estado realizar la llamada de Servlet correspondiente.

configuración web.xml

Supongamos que hay una ErrorHandler El Servlet se llama en cualquier excepción o error definido. A continuación se muestra lo que se crea en web.xml.

<!-- definición de servlet -->
<servlet>
        <servlet-nombre>ErrorHandler</servlet-nombre>
        <servlet-class>ErrorHandler</servlet-clase>
</servlet>
<!-- mapeo de servlet -->
<servlet-mapeo>
        <servlet-nombre>ErrorHandler</servlet-nombre>
        <url-patrón>/ErrorHandler</url-patrón>
</servlet-mapeo>
<!-- error-página de error relacionada con el código -->
<error-page>
    <error-código>404</error-código>
    <ubicación>/ErrorHandler</ubicación>
</error-page>
<error-page>
    <error-código>403</error-código>
    <ubicación>/ErrorHandler</ubicación>
</error-page>
<!-- excepción-página de error relacionada con el tipo -->
<error-page>
    <excepción-type>
          javax.servlet.ServletException
    </excepción-tipo >
    <ubicación>/ErrorHandler</ubicación>
</error-page>
<error-page>
    <excepción-type>java.io.IOException</excepción-tipo >
    <ubicación>/ErrorHandler</ubicación>
</error-page>

si desea definir un programa de manejo de errores común para todas las excepciones, debe definir el siguiente error-página, en lugar de definir un error único para cada excepción-elemento de página:

<error-page>
    <excepción-tipo>java.lang.Throwable</excepción-tipo >
    <ubicación>/ErrorHandler</ubicación>
</error-page>

A continuación se presentan los puntos que deben tenerse en cuenta sobre el manejo de excepciones en web.xml mencionado anteriormente:

  • Servlet ErrorHandler se define de la misma manera que otros Servlet y se configura en web.xml.

  • si hay un código de estado de error, sin importar 404(No encontrado)o 403(Prohibido),se llamará al Servlet ErrorHandler.

  • Si la aplicación web arroja ServletException o IOExceptionentonces el contenedor web llamará al Servlet ErrorHandler.

  • Puede definir diferentes programas de manejo de errores para manejar diferentes tipos de errores o excepciones. El ejemplo proporcionado es muy genérico, esperamos que pueda comprender los conceptos básicos a través del ejemplo.

Atributo de solicitud - Error/Excepción

A continuación se muestra la lista de atributos de solicitud que pueden ser accedidos por el Servlet de manejo de errores para analizar los errores/La naturaleza de la excepción.

Número de serieAtributo & Descripción
1javax.servlet.error.status_code
Esta propiedad proporciona el código de estado, el código de estado puede ser almacenado y analizado después de almacenarse como tipo de datos java.lang.Integer.
2javax.servlet.error.exception_type
Esta propiedad proporciona información sobre el tipo de excepción, el tipo de excepción puede ser almacenado y analizado después de almacenarse como tipo de datos java.lang.Class.
3javax.servlet.error.message
Esta propiedad proporciona información específica del mensaje de error, la información puede ser almacenada y analizarse después de almacenarse como tipo de datos java.lang.String.
4javax.servlet.error.request_uri
Esta propiedad proporciona información sobre la llamada del URL al Servlet, la información puede ser almacenada y analizarse después de almacenarse como tipo de datos java.lang.String.
5javax.servlet.error.exception
Esta propiedad proporciona la información de la excepción generada, la información puede ser almacenada y analizarse después de almacenarse como tipo de datos java.lang.Throwable.
6javax.servlet.error.servlet_name
该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。

Servlet 错误处理程序示例

以下是 Servlet 示例,将应对任何您所定义的错误或异常发生时的错误处理程序。

本示例让您对 Servlet 中的异常处理有基本的了解,您可以使用相同的概念编写更复杂的异常处理应用程序:

//导入必需的 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
    {
        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; charset=UTF-8");}}
    
        PrintWriter out = response.getWriter();
        String título = "Base Tutorial Site Error/Información de excepción
       
        String tipoDoc = "<!DOCTYPE html>\n";
        out.println(tipoDoc) +
            "<html>\n" +
             "<head><title>" + título + "</título></cabecera>\n" +
             "<body bgcolor=\"#f0f0f0\">\n");
           out.println("<h1>Ejemplo de información de excepción en el sitio web de base de tutoriales</h1>
           if (throwable == null && codigoEstado == null) {
              out.println("<h2>Información de error perdida</h2>
              out.println("Por favor, regrese <a href=\ + 
            response.encodeURL("http://localhost:8080/) + 
                "\">Página principal</a>.");
           }
              out.println("Código de error: ", + codigoEstado);
        }
               out.println("<h2>Información de error</h2>
              out.println("Nombre de Servlet: ", + servletName + 
                              "</br></br>");
              out.println("Tipo de excepción: ", + 
                              throwable.getClass().getName() + 
                              "</br></br>");
              out.println("URI de solicitud: ", + requestUri + 
                              "<br><br>");
              out.println("Mensaje de excepción: ", + 
                                  throwable.getMessage(()));
           }
           out.println("</cuerpo>");
           out.println("</html>");
    }
    // método para manejar solicitudes del método POST
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
       lanza ServletException, IOException {
        doGet(request, response);
    }
}

compilar de manera habitual ErrorHandler.javacoloque sus archivos de clase en <Tomcat-instalación-directorio>/webapps/ROOT/WEB-INF/en la carpeta .

Añadamos la siguiente configuración en el archivo web.xml para manejar las excepciones:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<servlet>
        <servlet-nombre>ErrorHandler</servlet-nombre>
        <servlet-clase>com.w3codebox.test.ErrorHandler</servlet-clase>
</servlet>
<!-- mapeos servlet -->
<servlet-mapeo>
        <servlet-nombre>ErrorHandler</servlet-nombre>
        <url-patrón>/TomcatTest/ErrorHandler</url-patrón>
</servlet-mapeo>
<error-page>
    <error-código>404</error-código>
    <ubicación>/TomcatTest/ErrorHandler</ubicación>
</error-page>
<error-page>
    <excepción-tipo>java.lang.Throwable</excepción-tipo >
    <ubicación>/ErrorHandler</ubicación>
</error-page>
</web-app>

Ahora, intenta usar un Servlet que genere una excepción o ingrese una URL incorrecta, lo que desencadenará la llamada del contenedor web ErrorHandler Servlet y muestra el mensaje adecuado. Por ejemplo, si ingresa una URL incorrecta (como: http://localhost:8080/TomcatTest/Si la página no se conoce (UnKonwPage),se mostrará el siguiente resultado:

Código de error:404