jsp taglib - Comment faire pour afficher la page d'erreur conviviale dans le navigateur lorsque l'exception d'exécution est levée par servlet?




exemple java (4)

Je développe une application web avec JSF. Je l'ai testé comme je le pouvais mais de temps en temps des exceptions d'exécution sont lancées.

Donc, comment rediriger l'utilisateur vers une page d'erreur spéciale chaque fois qu'une exception est levée (au lieu d'afficher 500 Erreur avec les logs Tomcat complets)?


Answers

    If you use java config in spring, you can follow,

   @Configuration
   public class ExcpConfig {

    @Bean(name = "simpleMappingExceptionResolver")
    public SimpleMappingExceptionResolver simpleMappingExceptionResolver() {
        SimpleMappingExceptionResolver resolver= new SimpleMappingExceptionResolver();

        Properties mappings = new Properties();
        resolver.setExceptionMappings(mappings); // None by default
        resolver.setExceptionAttribute("ErrorOccurred"); // Default is "exception"
        resolver.setDefaultErrorView("500"); // 500.jsp
        return r;
    }

}

Dans votre fichier web.xml:

<error-page>
  <error-code>500</error-code>
  <location>/errorpages/500.jsp</location>
</error-page>

Vous pouvez également intercepter des exceptions ou des exceptions spécifiques qui s'étendent Throwable :

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/errorpages/500.jsp</location>
</error-page>

Déclarez juste une <error-page> dans le web.xml dans laquelle vous pouvez spécifier la page qui doit être affichée sur un certain Throwable (ou l'une de ses sous-classes) ou un code d'état HTTP . Par exemple

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

qui affichera la page d'erreur sur n'importe quelle sous-classe de java.lang.Exception , mais pas java.lang.Throwable ou java.lang.Error . De cette façon, vous pouvez avoir votre propre page d'erreur pour tout type de Throwable . Par exemple java.sql.SQLException , java.io.IOException et ainsi de suite.

Ou,

<error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
</error-page>

qui affichera la page d'erreur sur une erreur HTTP 500, mais vous pouvez également en spécifier d'autres pour 404 (Page Not Found), 403 (Forbidden), etcetera.

Si vous déclarez <%@page isErrorPage="true" %> en haut de error.jsp , alors vous avez accès à l' Exception levée (et donc à tous ses getters) par ${exception} dans EL.

<p>Message: ${exception.message}</p>

Voir aussi le tutoriel Java EE 5 sur le sujet .


Techniquement, peu importe où vous déclarez la <f:metadata> dans la vue tant qu'elle est dans la vue de niveau supérieur (donc, lorsque vous utilisez la modélisation, dans le client de modèle et donc pas dans le modèle maître). Lorsque la vue est créée, les métadonnées ne font pas partie de l'arborescence des composants JSF, mais de la racine de la vue (que ViewDeclarationLanguage#getViewMetadata() ) permet d'obtenir pour chaque vue.

La plupart des documents auto-documentés consisteraient à placer le <f:metadata> en haut de la vue, de sorte que vous puissiez voir les métadonnées au premier coup d’œil sans avoir à faire défiler le code source de la vue vers le

Lorsque vous utilisez une page simple, placez-la juste avant <h:head> .

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
>
    <f:metadata>
        <f:viewParam name="userId" value="#{bean.userId}" />
        <f:viewParam name="startRecord" value="#{bean.startRecord}" />
        <f:viewParam name="pageSize" value="#{bean.pageSize}" />
        <f:viewParam name="sort" value="#{bean.sort}" />
    </f:metadata>

    <h:head>
        ...
    </h:head>

    <h:body>
        ...
    </h:body>
</html>

Lors de l'utilisation de la modélisation, l'approche recommandée, comme indiqué dans la documentation de la balise <f:metadata> , consisterait à déclarer un <ui:insert name="metadata"> distinct dans le modèle maître et à laisser le client définir les <f:metadata> dans un <ui:define name="metadata"> .

<ui:composition template="/WEB-INF/pattern.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
>
    <ui:define name="metadata">
        <f:metadata>
            <f:viewParam name="userId" value="#{bean.userId}" />
            <f:viewParam name="startRecord" value="#{bean.startRecord}" />
            <f:viewParam name="pageSize" value="#{bean.pageSize}" />
            <f:viewParam name="sort" value="#{bean.sort}" />
        </f:metadata>
    </ui:define>

    <ui:define name="content">
        <h1>Data Table</h1>
        ...
    </ui:define>
</ui:composition>




jsp jsf facelets custom-error-pages