jsp jsf exception-handling jsf-1.2

jsp - JSF 1.x manejo de excepción genérico



exception-handling jsf-1.2 (6)

Si tengo una excepción en mi capa empresarial (por ejemplo, una excepción SQL en mi bean de conexión JDBC), ¿cómo puedo propagarla con un mensaje personalizado a una página global error.jsp ?


JSF 1.x no proporciona ningún tipo de tratamiento de errores implícito de este tipo, aunque puede redirigir a una página de error utilizando reglas de navegación (suponiendo una publicación de formulario) ...

<navigation-case> <description> Handle a generic error outcome that might be returned by any application Action. </description> <display-name>Generic Error Outcome</display-name> <from-outcome>loginRequired</from-outcome> <to-view-id>/must-login-first.jsp</to-view-id> </navigation-case>

... o usando un redireccionamiento ...

FacesContext context = FacesContext.getCurrentInstance(); ExternalContext extContext = context.getExternalContext(); String url = extContext.encodeActionURL(extContext .getRequestContextPath() + "/messages.faces"); extContext.redirect(url);

Recomiendo mirar la especificación JSF para más detalles.

Los mensajes de error se pueden colocar en el alcance de la solicitud / parámetros de ámbito de sesión / url, como desee.

Suponiendo un contenedor Servlet, puede usar la configuración de página de error web.xml habitual.

<error-page> <exception-type>java.lang.Exception</exception-type> <location>/errorPage.faces</location> </error-page>

En su bean de respaldo, puede envolver y lanzar sus excepciones marcadas en RuntimeException s.

Algunas implementaciones / marcos de JSF detectarán estos errores (Apache MyFaces / Facelets), por lo que deberá configurarlos para que no lo hagan.



La forma general de mostrar un mensaje de error al usuario en JSF es usar FacesMessage:

En el lado de Java:

... if (errorOccurred) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("An error occurred blabla...")); }

y en la página JSF (JSP o XHTML), simplemente use el componente <h:messages/> en su página para mostrar el error.


Puedes poner

<%@ page errorPage="error.jsp" %>

en la página jour jsp / jsf. En error.jsp, jou tendrías:

<%@ page isErrorPage="true" %>

isErrorPage = "true" le dará a su página otro objeto implícito: excepción (de la misma manera que ya tiene solicitud y respuesta en la página jsp). A continuación, puede extraer el mensaje de la excepción.

Detalles adicionales



Hice una página de error en las caras del sitio y puse la pila de registro del error Este código primero lo puse en el web.xml

<error-page> <error-code>500</error-code> <location>/errorpage.jsf</location> </error-page>

Mientras que la página jsf tenía este código

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" > <h:head> <h:outputStylesheet name="EstilosOV.css" library="css" /> <!-- <h:outputScript name="sincontext.js" library="scripts"/> --> </h:head> <h:body > <table width="338" border="0" align="center" bordercolor="#FFFFFF"> <tr bgcolor="#1D2F68"> <td colspan="4" height="35" class="TablaHeader2"> PLAN SEGURO</td> </tr> <tr bgcolor="#FDF2AA"> <td colspan="4" class="HeaderExcepcion"> <h:graphicImage library="images" name="errormark.jpg"/> <font size="5px" color="#CC0000" >Error de ejecución</font> </td> </tr> <tr > <td colspan="3" class="anuncioWarning2">Ocurrio un error al realizar la operación, favor de intentarlo nuevamente, si el error aún se presenta, favor de notificarlo a soporte técnico al 5147-31-00 extensión 6893</td> </tr> <tr> <td height="17" colspan="3" class="TablaHeader2"></td> </tr> </table> <h:form id="formerror"> <h:inputHidden id="valuestack" value="#{errorDisplay.stackTrace}"></h:inputHidden> </h:form> </h:body> </html>

Tenga en cuenta que motivo le permite depurar la pila para un conocimiento de reazon que es la excepción en el campo oculto. Veamos cómo se define la clase recupera StackTrace

public class ErrorDisplay implements Serializable{ private static final long serialVersionUID = 6032693999191928654L; public static Logger LOG=Logger.getLogger(ErrorDisplay.class); public String getContacto() { return ""; } public String getStackTrace() { FacesContext context = FacesContext.getCurrentInstance(); Map requestMap = context.getExternalContext().getRequestMap(); Throwable ex = (Throwable) requestMap.get("javax.servlet.error.exception"); StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); fillStackTrace(ex, pw); LOG.fatal(writer.toString()); return writer.toString(); } private void fillStackTrace(Throwable ex, PrintWriter pw) { if (null == ex) { return; } ex.printStackTrace(pw); if (ex instanceof ServletException) { Throwable cause = ((ServletException) ex).getRootCause(); if (null != cause) { pw.println("Root Cause:"); fillStackTrace(cause, pw); } } else { Throwable cause = ex.getCause(); if (null != cause) { pw.println("Cause:"); fillStackTrace(cause, pw); } } } }

y ya está adjunto al terminar esta definición de frijol en el archivo facesconfig

<managed-bean> <description> Bean que sirve para llenar la especificacion de un error. Stacktrace </description> <managed-bean-name>errorDisplay</managed-bean-name> <managed-bean-class>mx.com.tdc.datos.page.bean.ErrorDisplay</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

Y espero que esto sirva