Servlets: manejo de excepciones
Cuando un servlet lanza una excepción, el contenedor web busca las configuraciones en web.xml que utilizan el elemento de tipo de excepción para una coincidencia con el tipo de excepción lanzada.
Tendrías que usar el error-page elemento en web.xml para especificar la invocación de servlets en respuesta a ciertos exceptions o HTTP status codes.
Configuración web.xml
Considere que tiene un servlet ErrorHandler al que se llamaría siempre que hubiera una excepción o error definido. La siguiente sería la entrada creada en 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 desea tener un controlador de errores genérico para todas las excepciones, debe definir la siguiente página de error en lugar de definir elementos de página de error separados para cada excepción:
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
Los siguientes son los puntos que deben tenerse en cuenta sobre el web.xml anterior para el manejo de excepciones:
El servlet ErrorHandler se define de forma habitual como cualquier otro servlet y se configura en web.xml.
Si hay algún error con el código de estado 404 (No encontrado) o 403 (Prohibido), se llamará al servlet ErrorHandler.
Si la aplicación web lanza ServletException o IOException, el contenedor web invoca el servlet / ErrorHandler.
Puede definir diferentes controladores de errores para manejar diferentes tipos de errores o excepciones. El ejemplo anterior es muy genérico y espero que sirva para explicarle el concepto básico.
Solicitar atributos: errores / excepciones
A continuación se muestra la lista de atributos de solicitud a los que un servlet de manejo de errores puede acceder para analizar la naturaleza del error / excepción.
No Señor. | Atributo y descripción |
---|---|
1 | javax.servlet.error.status_code Este atributo proporciona un código de estado que se puede almacenar y analizar después de almacenarlo en un tipo de datos java.lang.Integer. |
2 | javax.servlet.error.exception_type Este atributo proporciona información sobre el tipo de excepción que se puede almacenar y analizar después de almacenar en un tipo de datos java.lang.Class. |
3 | javax.servlet.error.message Este atributo proporciona información sobre el mensaje de error exacto que se puede almacenar y analizar después de almacenar en un tipo de datos java.lang.String. |
4 | javax.servlet.error.request_uri Este atributo proporciona información sobre la URL que llama al servlet y se puede almacenar y analizar después de almacenar en un tipo de datos java.lang.String. |
5 | javax.servlet.error.exception Este atributo proporciona información sobre la excepción generada, que se puede almacenar y analizar. |
6 | javax.servlet.error.servlet_name Este atributo proporciona un nombre de servlet que se puede almacenar y analizar después de almacenar en un tipo de datos java.lang.String. |
Ejemplo de servlet de controlador de errores
Este ejemplo le brindaría una comprensión básica del manejo de excepciones en Servlet, pero puede escribir aplicaciones de filtro más sofisticadas usando el mismo concepto:
// 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);
}
}
Compilar ErrorHandler.java de la forma habitual y ponga su archivo de clase en
Agreguemos la siguiente configuración en web.xml para manejar excepciones:
<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>
Ahora intente usar un servlet que genere una excepción o escriba una URL incorrecta, esto haría que Web Container llame ErrorHandlerservlet y mostrar un mensaje apropiado según lo programado. Por ejemplo, si escribe una URL incorrecta, se mostrará el siguiente resultado:
The status code : 404
Es posible que el código anterior no funcione con algunos navegadores web. Así que prueba con Mozilla y Safari y debería funcionar.