tag lib etiquetas jsp tomcat custom-error-pages

jsp - etiquetas - taglib



¿Cómo obtener el mensaje en una página de error personalizada(Tomcat)? (6)

En JSP, puede usar response.sendError(int code, String message) para devolver un código de error en particular (p. Ej. 404 para no encontrado) y un mensaje también. Estos mensajes se muestran bien, siempre que use las páginas de error de Tomcat feos por defecto. Sin embargo, si crea una página de error personalizada, ¿cómo obtiene ese mensaje? Intenté exception.getMessage() o pageContext.getErrorData() pero no sirvió para nada. He estado buscando esto durante horas y nadie parece preguntarse sobre lo mismo. : S

Me olvidé de mencionar que hasta ahora solo lo he probado con los 404, ya que eso es lo que más necesito ... La excepción es nula por alguna razón, así que al intentar cualquier cosa, se lanza una NullPointerException. La página de error es una página de error 404, establecida a través de web.xml (ya que quiero que se muestre para CADA error único de 404) y para cualquiera que se pregunte, sí, tiene la directiva isErrorPage establecida en verdadero ...


El mensaje de error está disponible mediante el atributo javax.servlet.error.message del objeto de solicitud en la página de error jsp.

Aquí está la sintaxis jsp para acceder a ella:

<c:out value="${requestScope[''javax.servlet.error.message'']}"/>

Puede buscar otra información relacionada con el error disponible en la página de error here bajo Atributos de nuevo error .


Hmm exception.getMessage() debería funcionar

Intente agregar exception.getClass().getName()

  1. Podría ser una NullPointerException que no tiene ningún mensaje
  2. o la excepción no es de Sun y el mensaje no está configurado correctamente

Por supuesto, esto solo funciona, si no recuerdo mal, si el error es arrojado por un jsp con <%@ page errorPage="/yourerrorpage.jsp" %> en la parte superior.

Si el error proviene de un servlet, los detalles de la excepción se pasan como atributos de solicitud

javax.servlet.error.status_code java.lang.Integer javax.servlet.error.exception_type java.lang.Class javax.servlet.error.message java.lang.String javax.servlet.error.exception java.lang.Throwable javax.servlet.error.request_uri java.lang.String javax.servlet.error.servlet_name java.lang.String

Verifique la sección de especificación del servlet 9.9


La parte de exception de ErrorData solo se establecerá si la página de error se cargó como resultado de una excepción y no de un código de error de respuesta.

Vea el javadoc para sendError en HttpServletResponse . Menciona por qué no estás viendo el mensaje que sendError a sendError (el énfasis es mío):

Envía una respuesta de error al cliente utilizando el estado especificado. El servidor establece por defecto la creación de la respuesta para que parezca una página de error del servidor con formato HTML que contiene el mensaje especificado, estableciendo el tipo de contenido en "text / html", dejando las cookies y otros encabezados sin modificar. Si se ha realizado una declaración de página de error para la aplicación web correspondiente al código de estado transferido, se devolverá con preferencia al parámetro msg sugerido.

Si la respuesta ya se ha confirmado, este método arroja una IllegalStateException. Después de usar este método, la respuesta debe considerarse comprometida y no debe escribirse.


Lamento haber respondido tan tarde, pero hace solo una semana me enfrenté a este problema. He navegado por muchos sitios diferentes, pero nadie realmente resolvió este problema como yo quería. En este post descubrí algunas soluciones interesantes y luego me acerqué a las mías. Simplemente incluya esta fuente en su página:

<% out.println(pageContext.getErrorData().getRequestURI()); out.println("<br/>"); out.println(pageContext.getErrorData().getStatusCode()); out.println("<br/>"); out.println(pageContext.getException()); out.println("<br/>"); %>

Funcionó perfectamente bien conmigo.


Lo que quieres me parece raro :). Dicho eso, haría lo siguiente:

  1. Implemente HttpResponseWrapper para envolver cualquier otra HttpResponse de esta manera:

    public class HttpResponseWrapper implements HttpResponse { private String errorMessage; ... @Override public void sendError(...) { <save error message here> } ... }

  2. Crea un filtro y ajusta cualquier respuesta en este

  3. Poner filtro en todas las solicitudes y primero en la cadena

  4. En su página de error, compruebe si la respuesta es instancia de HttpResponseWrapper

  5. Recibe tu mensaje


Puedes usar

${requestScope[''javax.servlet.error.message'']}

si no tienes jstl en la página