2009-06-15 17 views
24

In JSP, è possibile utilizzare response.sendError(int code, String message) per restituire un particolare codice di errore (ad esempio 404 per non trovato) e un messaggio. Questi messaggi vengono visualizzati correttamente, a condizione che vengano utilizzate le brutte pagine di errore di Tomcat. Tuttavia, se si crea una pagina di errore personalizzata, come si ottiene quel messaggio? Ho provato exception.getMessage() o pageContext.getErrorData() ma non ci sono riuscito. Ho cercato questo per ore simili e nessuno sembra nemmeno chiedersi la stessa cosa! : SCome ottenere il messaggio in una pagina di errore personalizzata (Tomcat)?

ho dimenticato di dire che ho provato solo con 404 finora, dato che è quello che mi serve più ... L'eccezione è nullo per qualche ragione, in modo da cercare nulla su di esso getta una NullPointerException. La pagina di errore è una pagina di errore 404, impostata via web.xml (poiché voglio che venga visualizzata per OGNI singolo errore 404) e per chiunque si chieda, sì ha la direttiva isErrorPage impostata su true ...

+0

La tua pagina 404 personalizzata mai funzionano? Come controllate se funziona? Hai verificato se gli attributi di richiesta menzionati qui sotto esistono? Ultimo ricorso prova questo tutorial http://playground.greyscale.se/wiki/en/Custom_404_page_in_Tomcat – jitter

+0

No, funziona bene. Non so come ottenere il messaggio, se impostato tramite response.sendError(). –

+0

response.sendError() invierà un errore al browser dei tuoi clienti. Non andrà alla tua pagina di errore dopo quella, a meno che non lo farai tu stesso, penso. –

risposta

9

Hmm exception.getMessage() dovrebbe funzionare

provare ad aggiungere exception.getClass().getName()

  1. potrebbe essere un NullPointerException che non ha alcun messaggio
  2. o l'eccezione non viene dal Sole e il messaggio non è impostato correttamente

Ovviamente questo funziona solo, se non ricordo male, se l'errore viene generato da un jsp con <%@ page errorPage="/yourerrorpage.jsp" %> in alto.

Se l'errore viene da un servlet i dettagli dell'eccezione vengono passati come richiesta attributi

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 

Controllare la sezione Servlet Specification 9,9

+0

Vedere la mia modifica, mi dispiace di aver dimenticato di aggiungere altro dettagli ... –

+1

Invece di utilizzare direttamente le stringhe fornite per gli attributi di richiesta, si dovrebbero usare le [costanti] (http://docs.oracle.com/javaee/6/api/constant-values.html#javax.servlet .RequestDispatcher.INCLUDE_QUERY_STRING) definito in [RequestDispatcher] (http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html), ad es. [RequestDispatcher.ERROR_EXCEPTION] (http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html#ERROR_EXCEPTION). –

0

La cosa che vuoi sembra strano per me :). Detto questo, vorrei fare quanto segue:

  1. Implementare HttpResponseWrapper per avvolgere qualsiasi altro HttpResponse in questo modo:

    public class HttpResponseWrapper implements HttpResponse { 
        private String errorMessage; 
    ... 
    
        @Override 
        public void sendError(...) { 
         <save error message here> 
        } 
    ... 
    } 
    
  2. Creazione di un filtro e avvolgere qualsiasi risposta in questo

  3. Put filtra su tutte le richieste e prima nella catena

  4. Nella tua pagina di errore controlla se la risposta è istanc eof HttpResponseWrapper

  5. ottenere il vostro messaggio

+0

Grazie per il tuo tempo, ma hai effettivamente letto il mio post? Ho impostato isErrorPage su true e il mio 404 funziona correttamente (il che significa che l'ho già fatto nel web.xml, quindi non c'è bisogno di menzionare il tag error-page). Ho anche detto che la mia domanda è circa 404s, non eccezioni. –

+0

Sì, colpa mia.In qualche modo ha mancato il punto della domanda. Accade. Aggiornamento della mia risposta –

0

verrà impostata la exception parte del ErrorData solo se la pagina di errore è stato caricato a causa di un'eccezione e non un codice di errore di risposta.

Vedere javadoc per sendError su HttpServletResponse.Viene indicato il motivo per cui non visualizzi il messaggio passato a

Invia una risposta di errore al client utilizzando lo stato specificato. Il server imposta automaticamente la risposta come una pagina di errore del server in formato HTML contenente il messaggio specificato, impostando il tipo di contenuto su "text/html", lasciando inalterati i cookie e le altre intestazioni. Se è stata eseguita una dichiarazione della pagina di errore per l'applicazione Web corrispondente al codice di stato inoltrato, verrà restituita in base al parametro msg suggerito.

Se la risposta è già stata confermata, questo metodo genera un IllegalStateException. Dopo aver usato questo metodo, la risposta dovrebbe essere considerata come impegnata e non dovrebbe essere scritta.

+0

Grazie. L'avevo già letto in precedenza, ma non avevo notato la parte che hai enfatizzato. Quindi, per farla breve, non è affatto possibile? :-( –

12

Il messaggio di errore è disponibile tramite l'attributo javax.servlet.error.message dell'oggetto richiesta nella pagina di errore jsp.

Ecco la sintassi jsp per accedervi:

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

si potrebbe cercare altre informazioni relative errore disponibili nella pagina di errore here sotto nuovo errore Attributi.

+0

Grazie ma ... no. Non funziona: -/ –

+0

Dovrebbe essere conforme alle specifiche e in effetti funziona con la nostra applicazione basata su Tomcat. Potresti avere qualche strano problema di configurazione. e sarebbe bello conoscere la soluzione alla fine –

+2

@Lea Verou: Funziona. Probabilmente non hai jstl abilitato nella tua applicazione, quindi il tag c: out è stato stampato su HTML che non hai mai visto come output renderizzato . – cherouvim

3

Mi dispiace per aver risposto così tardi, ma ho affrontato questo problema solo una settimana fa, ho sfogliato molti siti diversi ma nessuno ha davvero risposto a questo problema nel modo che volevo sentire. In questo post ho scoperto alcune soluzioni interessanti e poi sono arrivato al mio. Basta includere questa fonte nella tua pagina:

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

Ha funzionato perfettamente con me.

0

È possibile utilizzare

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

se non si dispone di JSTL sulla pagina

Problemi correlati