Catturare gli errori delle pagine jsp

di il
3 risposte

Catturare gli errori delle pagine jsp

Ho creato una pagina di errore in jsp ma ho due domande:
1.C’è modo di andare a capo come nella pagina di cortesia prodotte in automatico dal server?
Ecco lo schifo che leggo io:
java.lang.NullPointerException at org.apache.jsp.error_jsp._jspService(error_jsp.java:165) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:458) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:844)
Gli ‘a capo’ sono andati a farsi friggere!
Qui il codice della pagina:
<%
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setHeader("Expires", "0"); // Proxies.
%>
<%-- Con queste direttive non e' piu' necessario usare i codici HTML per scrivere i caratteri speciali. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="it">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="description" content="Applicazione web per la gestione di coordinate spaziotemporali">
    <meta name="keywords" content="HTML,CSS,Java,Maven,JavaScript">
    <meta name="author" content="Nome Cognome">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Esercitazione 1</title>
    <!-- Librerie JS & CSS -->
    <!-- assenti... -->
    <!-- CSS -->
    <link rel="stylesheet" type="text/css" href="/css/tema.css">
    <!-- JS -->
    <script src="/js/client_code.js"></script>
</head>
<body>
<h1>Errore</h1>
<div>
    <img src="/immagini/errore.jpg" alt="Errore" class="imgResponsive">
    <p>Siamo spiacenti, si &egrave; verificato un errore durante l'esecuzione:</p>
    <p>
        <%@ page isErrorPage="true"%>
        <%@ page import="java.io.StringWriter" %>
        <%@ page import="java.io.PrintWriter" %>
        <i>Messaggio:</i><br><br>
        <strong class="rosso-porpora"><%=exception.getMessage()%></strong>
        <br><br><i>StackTrace:</i><br><br>
        <%
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter);
            exception.printStackTrace(printWriter);
            out.println(stringWriter);
            printWriter.close();
            stringWriter.close();
        %>
    </p>
    <p>Puoi ricollegarti alla home del sito <a href="/index.jsp">premendo qui</a>.</p>
</div>
<%@ include file="/copyright.jsp" %>
</body>
</html>
2.Nelle servlet al posto di:
Cosa dovrei scrivere nelle servlet al posto del codice seguente?
<%@ page errorPage=”error.jsp” %>

3 Risposte

  • Re: Catturare gli errori delle pagine jsp

    Ho risolto parzialmente in questo modo:
            <br><br><i>StackTrace:</i><br><br>
            <%
    
                StackTraceElement[] elements = Thread.currentThread().getStackTrace();
                for (int i = 0; i < elements.length; i++) {
                    StackTraceElement s = elements[i];
                    out.println(".....at " + s.getClassName() + "." + s.getMethodName()
                            + "(" + s.getFileName() + ":" + s.getLineNumber() + ")<br>");
                }
            %>
            <br><br><i>StackTrace:</i><br><br>
            <%
                StringWriter stringWriter = new StringWriter();
                PrintWriter printWriter = new PrintWriter(stringWriter);
                exception.printStackTrace(printWriter);
                out.println(stringWriter);
                printWriter.close();
                stringWriter.close();
            %>
    1.Nel primo codice manca la stringa java.lang.NullPointerException, come posso aggiungerla?
    2.Inoltre è prudente stampare lo StackTrace anche in fase di pubblicazione?
    grazie


    <!DOCTYPE html>
    <html lang="it">
    <head>
    <!-- Meta -->
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="description" content="Applicazione web per la gestione di coordinate spaziotemporali">
    <meta name="keywords" content="HTML,CSS,Java,Maven,JavaScript">
    <meta name="author" content="Nome Cognome">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Esercitazione 1</title>
    <!-- Librerie JS & CSS -->
    <!-- assenti... -->
    <!-- CSS -->
    <link rel="stylesheet" type="text/css" href="/css/tema.css">
    <!-- JS -->
    <script src="/js/client_code.js"></script>
    </head>
    <body>
    <h1 class="blu-cobaldo-scurito">Esercitazione 1</h1>
    <h2 class="blu-cobaldo">Applicazione web per la gestione di coordinate spaziotemporali</h2>
    <h3 class="blu-cobaldo-schiarito">
    Progetto Maven (linguaggio lato server: Java | linguaggio lato client: Javascript)
    </h3>
    <h4>Errore</h4>
    <div>
    <img src="/immagini/errore.jpg" alt="Errore" class="imgResponsive">
    <p>Siamo spiacenti, si &egrave; verificato un errore durante l'esecuzione:</p>
    <p>



    <i>Messaggio:</i><br><br>
    <strong class="rosso-porpora">null</strong>
    <br><br><i>StackTrace:</i><br><br>
    .....at java.lang.Thread.getStackTrace(Thread.java:1654)<br>
    .....at org.apache.jsp.error_jsp._jspService(error_jsp.java:170)<br>
    .....at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)<br>
    .....at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)<br>
    .....at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:458)<br>
    .....at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)<br>
    .....at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)<br>
    .....at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)<br>
    .....at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)<br>
    .....at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)<br>
    .....at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)<br>
    .....at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)<br>
    .....at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)<br>
    .....at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)<br>
    .....at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394)<br>
    .....at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:331)<br>
    .....at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173)<br>
    .....at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)<br>
    .....at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)<br>
    .....at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)<br>
    .....at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)<br>
    .....at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)<br>
    .....at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)<br>
    .....at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)<br>
    .....at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)<br>
    .....at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)<br>
    .....at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)<br>
    .....at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)<br>
    .....at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)<br>
    .....at java.lang.Thread.run(Thread.java:844)<br>

    <br><br><i>StackTrace:</i><br><br>
    java.lang.NullPointerException
    at org.apache.jsp.error_jsp._jspService(error_jsp.java:165)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:458)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:844)


    </p>
    <p>Puoi ricollegarti alla home del sito <a href="/index.jsp">premendo qui</a>.</p>
    </div>






    <div>
    <p>Nome Cognome &#124; &copy; 2018, <a target="_blank" href="/policy_privacy.pdf">Policy Privacy</a>
    , il tuo IP: 192.168.56.1</p>
    </div>
    </body>
    </html>
  • Re: Catturare gli errori delle pagine jsp

    giannino1995 ha scritto:


    Gli ‘a capo’ sono andati a farsi friggere!
    Lo sapevi che in HTML i newline (e in generale i whitespace) NON sono significativi? (in HTML il "newline" è <br> non la sequenza di caratteri del newline, CR, LF o CR+LF che sia)

    Whitespace e newline sono significativi solo in un contesto "preformatted", ovvero dentro <pre> o dentro un blocco che ha lo stile CSS white-space:pre (e altri valori del white-space).

    giannino1995 ha scritto:


    Cosa dovrei scrivere nelle servlet al posto del codice seguente?
    <%@ page errorPage=”error.jsp” %>
    In realtà non c'è un "vero" equivalente. Nelle servlet si può fare un po' come si vuole. Es. il doGet che contiene un try-catch e qualunque eccezione catturata fa andare ad una pagina particolare o causa altro.

    Se si vuole gestire le eccezioni che escono FUORI dai doXXX e nelle JSP, allora si può sfruttare il meccanismo generale degli error-page dichiarabile nel web.xml, ovvero <error-page> con dentro <exception-type> e <location>


    P.S. perché continui a darti zappate sui piedi con cose tipo
                StackTraceElement[] elements = Thread.currentThread().getStackTrace();
                for (int i = 0; i < elements.length; i++) {
                    StackTraceElement s = elements[i];
                    out.println(".....at " + s.getClassName() + "." + s.getMethodName()
                            + "(" + s.getFileName() + ":" + s.getLineNumber() + ")<br>");
                }
    ?
  • Re: Catturare gli errori delle pagine jsp

    Ho corretto il codice in questo modo:
    <%
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        response.setHeader("Expires", "0"); // Proxies.
    %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!DOCTYPE html>
    <html lang="it">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="description" content="Applicazione web per la gestione di coordinate spaziotemporali">
        <meta name="keywords" content="HTML,CSS,Java,Maven,JavaScript">
        <meta name="author" content="Nome Cognome">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Esercitazione 1</title>
        <link rel="stylesheet" type="text/css" href="/css/tema.css">
        <script src="/js/client_code.js"></script>
    </head>
    <body>
    <h1 class="blu-cobaldo-scurito">Esercitazione 1</h1>
    <h2 class="blu-cobaldo">Applicazione web per la gestione di coordinate spaziotemporali</h2>
    <h3 class="blu-cobaldo-schiarito">
        Progetto Maven (linguaggio lato server: Java | linguaggio lato client: Javascript)
    </h3>
    <h4>Errore</h4>
    <div>
        <img src="/immagini/errore.jpg" alt="Errore" class="imgResponsive">
        <p>Siamo spiacenti, si &egrave; verificato un errore durante l'esecuzione:</p>
        <p>
            <%@ page isErrorPage="true"%>
            <%@ page import="java.io.StringWriter" %>
            <%@ page import="java.io.PrintWriter" %>
            <i>Messaggio:</i>
        </p>
        <p><strong class="rosso-porpora"><%=exception.getMessage()%></strong></p>
        <p><i>StackTrace:</i></p>
        <p class="grigio-40">
            <%
                StackTraceElement[] elements = Thread.currentThread().getStackTrace();
                for (int i = 0; i < elements.length; i++) {
                    StackTraceElement s = elements[i];
                    out.println(s + ")<br>");
                }
            %>
        </p>
        <p>Puoi ricollegarti alla home del sito <a href="/index.jsp">premendo qui</a>.</p>
    </div>
    <%@ include file="/copyright.jsp" %>
    </body>
    </html>
    che ne pensi?
    Comunque, in fase di pubblicazione, sui tuoi siti dinamici che pubblichi metti anche una pagina di questo tipo oppure no? E' prudente farlo? Cosa fa un buon programmatore?
    Io al momento ho questa configurazione:
    <error-page>
            <error-code>404</error-code>
            <location>/404.jsp</location>
        </error-page>
        <error-page>
            <error-code>403</error-code>
            <location>/403.jsp</location>
        </error-page>
        <error-page>
            <error-code>401</error-code>
            <location>/401.jsp</location>
        </error-page>
        <error-page>
            <error-code>500</error-code>
            <location>/500.jsp</location>
        </error-page>
        <error-page>
            <error-code>503</error-code>
            <location>/503.jsp</location>
        </error-page>
        <error-page>
            <exception-type>java.lang.Throwable</exception-type>
            <location>/error.jsp</location>
        </error-page>
    con 6 pagine di errore.
    A presto
Devi accedere o registrarti per scrivere nel forum
3 risposte