2009-06-15 8 views
24

In JSPs können Sie response.sendError(int code, String message) verwenden, um einen bestimmten Fehlercode (z. B. 404 für nicht gefunden) und eine Nachricht zurückzugeben. Diese Meldungen werden angezeigt, solange Sie die standardmäßigen hässlichen Tomcat-Fehlerseiten verwenden. Wenn Sie jedoch eine benutzerdefinierte Fehlerseite erstellen, wie erhalten Sie diese Nachricht? Ich habe versucht exception.getMessage() oder pageContext.getErrorData() aber keinen Nutzen. Ich habe stundenlang nach dem gesucht und niemand scheint sich über dasselbe zu wundern! : SWie erhalte ich die Nachricht in einer benutzerdefinierten Fehlerseite (Tomcat)?

Ich habe vergessen zu erwähnen, ich habe es nur mit 404s bisher versucht, da das ist, was ich am meisten brauche ... Die Ausnahme ist aus irgendeinem Grund Null, also versucht etwas darauf wirft eine NullPointerException. Die Fehlerseite ist eine 404-Fehlerseite, die über web.xml gesetzt wird (da ich sie für JEDEN einzelnen 404-Fehler anzeigen möchte) und für alle, die sich wundern, ja die isErrorPage-Direktive auf true gesetzt hat ...

+0

Hat nie arbeiten, um Ihre benutzerdefinierte 404-Seite? Wie überprüfen Sie, ob es funktioniert? Haben Sie überprüft, ob die von mir genannten Anforderungsattribute existieren? Last Resort versuchen Sie dieses Tutorial http://playground.greyscale.se/wiki/en/Custom_404_page_in_Tomcat – jitter

+0

Nein, es funktioniert gut. Ich weiß nur nicht, wie ich die Nachricht bekommen soll, wenn sie über response.sendError() gesetzt wird. –

+0

response.sendError() sendet einen Fehler an den Browser Ihres Clients. Es wird danach nicht auf deine Fehlerseite gehen, außer du machst es selbst, denke ich. –

Antwort

9

Hmm exception.getMessage() sollte funktionieren

Versuchen Zugabe exception.getClass().getName()

  1. Es könnte ein NullPointerException sein, die keine Nachricht hat
  2. oder die Ausnahme nicht von Sun ist und die Nachricht nicht gesetzt ist richtig

Natürlich funktioniert das nur, wenn ich mich richtig erinnere, wenn der Fehler von einem JSP mit <%@ page errorPage="/yourerrorpage.jsp" %> an der Spitze geworfen wird.

Wenn der Fehler von einem Servlet kommt die Ausnahmedetails als Anforderung übergeben werden Attribute

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 

prüfen die Servlet Specification Abschnitt 9.9

+0

Siehe meine Bearbeitung, tut mir leid, dass ich vergessen habe, mehr hinzuzufügen Details ... –

+1

Anstatt die angegebenen Strings für Anforderungsattribute direkt zu verwenden, sollte man die [Konstanten] (http://docs.oracle.com/javaee/6/api/constant-values.html#javax.servlet .RequestDispatcher.INCLUDE_QUERY_STRING) definiert in [RequestDispatcher] (http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html), z [RequestDispatcher.ERROR_EXCEPTION] (http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html#ERROR_EXCEPTION). –

0

Das, was Sie sieht mir :) seltsam wollen. Das heißt, ich würde folgendes tun:

  1. HttpResponseWrapper Implementieren andere HttpResponse auf diese Weise zu wickeln:

    public class HttpResponseWrapper implements HttpResponse { 
        private String errorMessage; 
    ... 
    
        @Override 
        public void sendError(...) { 
         <save error message here> 
        } 
    ... 
    } 
    
  2. einen Filter erstellen und wickeln Sie eine Antwort in diesem

  3. Put Filter auf alle Anfragen und zuerst in der Kette

  4. In Ihrer Fehlerseite überprüfen, ob die Antwort instanc ist eof HttpResponseWrapper

  5. Ihre Nachricht erhalten

+0

Danke für deine Zeit, aber hast du meinen Beitrag gelesen? Ich habe isErrorPage auf true gesetzt, und mein 404 funktioniert gut (was bedeutet, dass ich es bereits in web.xml getan habe, so dass das error-side-Tag nicht erwähnt werden muss). Ich habe auch erwähnt, dass es sich bei meiner Frage um 404 handelt, nicht um Ausnahmen. –

+0

Ja, meine Schuld.Irgendwie hat der Punkt der Frage verpasst. Das passiert. Aktualisierung meiner Antwort –

0

Der exception Teil des ErrorData nur dann eingestellt werden, wenn die Fehlerseite als Folge einer Ausnahme und kein Antwortfehlercode geladen wurde.

Siehe javadoc für sendError unter HttpServletResponse.Er erwähnt, warum Sie die Nachricht nicht sehen Sie sendError (Hervorhebung von mir) übergeben:

Sendet eine Fehlermeldung an den Client den angegebenen Status verwenden. Der Server erstellt standardmäßig die Antwort so, dass sie wie eine HTML-formatierte Serverfehlerseite aussieht, die die angegebene Nachricht enthält, und legt den Inhaltstyp auf "text/html" fest, wobei Cookies und andere Header unverändert bleiben. Wenn eine Fehlerseitenerklärung für die Webanwendung entsprechend dem übergebenen Statuscode erfolgt ist, wird sie anstelle des vorgeschlagenen msg-Parameters zurückgeliefert.

Wenn die Antwort bereits festgeschrieben wurde, löst diese Methode eine IllegalStateException aus. Nach der Verwendung dieser Methode sollte die Antwort als festgeschrieben gelten und nicht in geschrieben werden.

+0

Danke. Ich hatte das vorher gelesen, aber den Teil, den du betont hast, nicht bemerkt. Um es kurz zu machen: Es ist überhaupt nicht möglich. :-( –

12

Die Fehlermeldung ist über das Attribut javax.servlet.error.message des Anfrageobjekts in der Fehlerseite jsp verfügbar. Hier

ist die jsp Syntax darauf zugreifen:

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

Sie für andere Fehler bezogenen Informationen here unter New Fehler in der Fehlerseite Attribute aussehen könnte.

+0

Danke, aber ... nein. Funktioniert nicht: -/ –

+0

Es sollte nach der Spezifikation und es tatsächlich in unserer Tomcat-basierten Anwendung. Sie können einige seltsame Konfiguration Problem haben. Wie auch immer, viel Glück auf diesem , und es wäre großartig, am Ende die Lösung zu kennen –

+2

@Lea Verou: Es funktioniert Wahrscheinlich haben Sie in Ihrer Anwendung jstl nicht aktiviert, daher wurde das c: out-Tag auf HTML gedruckt, das Sie nie als gerenderte Ausgabe gesehen haben . – cherouvim

3

Es tut mir leid, so spät zu antworten, aber ich konfrontiert mit diesem Problem vor einer Woche, ich habe viele verschiedene Seiten durchsucht, aber niemand wirklich dieses Problem so, wie ich hören wollte. In diesem Post habe ich ein paar interessante Lösungen gefunden und bin dann zu meinem eigenen gekommen. Fügen Sie diese Quelle einfach in Ihre Seite ein:

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

Es funktionierte vollkommen in Ordnung mit mir.

0

können Sie

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

verwenden, wenn Sie auf der Seite nicht jstl haben

Verwandte Themen