Eine Server 500 -Ausnahme trat auf. Wenn es standardmäßig behandelt wird, wird die Ausnahme erfasst und zur Tomcat -Standardausnahmeseite springen, wie in der Abbildung unten gezeigt.
Unabhängig davon, welche Website gleich ist, ermöglicht Tomcat auch benutzerdefinierte Stile, benutzerdefinierte Anforderungen zu erfüllen. Konfigurieren Sie es in der Datei web.xml:
<Fehlerpage> <Fehlercode> 500 </Fehler-Code> <position> /Error.jsp </location> </fehlerpage>
Lassen Sie uns zunächst über die damit verbundene Logik sprechen. Wenn während der Ausführung einer JSP -Seite ein Fehler auftritt, generiert die JSP -Engine automatisch ein Ausnahmungsobjekt. Wenn die JSP -Seite eine andere JSP -Seite als Fehlerhandler angibt, stellt die JSP -Engine dieses Ausnahmeobjekt in das Anforderungsobjekt ein und übergibt es an den Fehlerhandler. Wenn Sie den Eindruck haben, Servlets zu schreiben, ist dies die gleiche Idee wie javax.servlet.forward.request_uri, das sich an die Vorlage JSP wendet, behält den ursprünglichen Anforderungsweg anstelle des Pfads der JSP -Seite. Im Fehlerhandler deklariert die JSP -Engine automatisch ein Ausnahmungsobjekt, das aus den im Anforderungsobjekt enthaltenen HTTP -Parameter erhalten wird, da der Wert der ISERRorPage -Eigenschaft der Seitenkompilierungsanweisung auf TRUE festgelegt ist.
Die im Anforderungsobjekt enthaltenen Ausnahmeinformationen sind sehr reich, wie unten gezeigt:
Sie können die Java -Anweisung Request.GetAtTribute ("javax.servlet.Error.status_code") verwenden oder Sie können EL -Ausdrücke auf der JSP -Seite verwenden, wie z.
Obwohl diese benutzerdefinierte Fehlerseite einfach ist, hat JSP selbst gute Kapselungsergebnisse. Ich habe auch viele Ressourcen anderer Menschen gesehen, aber nach sorgfältigem Studium gibt es auch viel "Lernen", also möchte ich dieses Rad wieder "mahlen" - zuerst ist der Ort eine JSP -Seite oder ein Servlet, aber wenn das Servlet möglicherweise nicht gestartet wird, verwenden Sie einfach eine einfache JSP -Seite. Wir definieren interne Klassenmethoden über JSP -Seiten, um die Trennung von Seite und Logik zu erreichen (keine Notwendigkeit, Servlets zu schreiben). Die verbleibenden Ideen sind wie folgt:
Vervollständigen Sie die Fehlerhandlerklasse in JSP. Eine andere Seite nennt diese Fehlerhandlerklasse. Es kann nicht nur Fehler von der JSP -Seite akzeptieren, sondern auch Fehler akzeptieren, die vom Servlet Controller übergeben wurden. Es extrahiert so viele Informationen wie möglich und schreibt zuerst alle Inhalte in den Speicher und gibt dann die Fehlerinformationen von zwei Ausgabestreams in die Seite und Datei aus. Gleichzeitig können Sie beim Hinzufügen einiger einfacher Sätze auch eine Kopie der Informationen auf der Webseite in die Datenbank oder Text schreiben, um HTML/JSON/XML zurückzugeben
Der Implementierungscode lautet wie folgt:
/ *** Ausnahmebehandlungsklasse*/ Klasse ERRAGEHANDLER {// Alle Inhalte werden zuerst in den Speicher geschrieben und dann von zwei Ausgabestreams auf die Seite bzw. die Datei ausgegeben. BytearrayoutputStream bytearrayoutputStream = new bytearrayoutputStream (); private printstream printstream = neuer printstream (bytearrayoutputStream); / ** * Fehlerinformationen sammeln * @Param Anfrage * @param -Ausnahme * @param out */ public errorHandler (httpServletRequest -Anforderung, Throwable Exception, JspWriter Out) {setRequest (Anfrage); setException (Ausnahme); if (out! = null) {try {out.print (bytearrayoutputStream); // Ausgabe zur Webseite} catch (ioException e) {e.printstacktrace (); }} log (request); if (bytearrayoutputStream! } catch (ioException e) {e.printstacktrace (); } if (printstream! = null) printStream.close (); } / ** * * @param request * / private void setRequest (httpServletRequest Request) {printStream.println (); printStream.println ("Benutzerkonto:" + Request.GetSession (). getAtTribute ("Benutzername")); printStream.println ("Zugriff auf Pfad:" + getInfo (Anfrage, "javax.servlet.forward.request_uri", string.class)); printStream.println ("Fehlerseitenadresse:" + getInfo (Anfrage, "javax.servlet.Error.request_uri", string.class)); printStream.println ("Fehlercode:" + getInfo (Anfrage, "javax.servlet.Error.status_code", int.class)); printStream.println ("Ausnahmetyp:" + getInfo (Anfrage, "javax.servlet.Error.exception_type", class.class)); printstream.println ("Ausnahmeinformationen:" + getInfo (Anfrage, "javax.servlet.Error.message", String.class)); printStream.println ("Ausnahme -Servlet:" + getInfo (Anfrage, "javax.servlet.Error.servlet_name", string.class)); printStream.println (); // Die anderen beiden Objekte erhalten (Anfrage, "javax.servlet.jspexception", throwable.class); getInfo (Anfrage, "javax.servlet.forward.jspexception", throwable.class); getInfo (Anfrage, "javax.servlet.forward.jspexception", throwable.class); Karte <String, String []> map = request.getParametermap (); für (String -Schlüssel: map.keyset ()) {printStream.println ("Parameter in der Anforderung enthält:"); printStream.println (Schlüssel + "=" + request.getParameter (Schlüssel)); printStream.println (); } für (Cookie Cookie: Request.GetCookies ()) {// cookie.getValue () printStream.println ("Cookies in der Anfrage inklusive:"); printStream.println (cookie.getName () + "=" + cookie.getValue ()); printStream.println (); }} / ** * * @Param Exception * / private void setException (Throwable Exception) {if (exception! = null) {printstream.println ("Ausnahmeinformationen"); printStream.println (exception.getClass () + ":" + exception.getMessage ()); printStream.println (); printStream.println ("Stackinformation"); AUCECT.printstackTrace (printstream); printStream.println (); }}/** * * @param request */private void log (httpServletRequest Request) {Datei DIR = new Datei (request.getSession (). if (! Dir.Exists ()) {dir.mkdir (); } String timestamp = new java.text.SimpledateFormat ("yyyymmdhhmmsss"). Format (neuer Datum ()); Datei Datei = neue Datei (DIR.GetabSolutepath () + Datei.SeParatorChar + "Fehler-" + TimestAMP + ".txt"); // try (FileOutputStream FileOutputStream = new FileOutputStream (Datei); // printstream ps = new printStream (FileOutputStream)) {// in Datei schreiben // ps.print (bytearrayoutputStream); //} catch (FilenotFoundException e) {// e.printstacktrace (); //} catch (ioException e) {// e.printstacktrace (); //} catch (Ausnahme e) {// e.printstacktrace (); //}}/ ** * * @param request * @param key * @param type * @return */ @SuppressWarnings ("deaktiviert") private <t> T getInfo (httpServletRequest, String -Taste, Klasse <T> Typ) {Object OBJ = Request.GetatTribute (Schlüssel); Return obj == NULL? NULL: (t) obj; }} Dies ermöglicht die Ausnahmekontrolle. Das Folgende definiert web.xml, damit der Tomcat -Fehler auf den Seitenfehler führt.jsp, den wir gerade angegeben haben
<!-404 Es gibt keinen Fehler auf der Seite-> <Fehlerpage> <fehlercodes> 404 </Fehler-code> <position> /web-inf/jsp/common/default/Error.jsp </location> </fehler-page> <!-//-> <! <position> /web-inf/jsp/common/default/error.jsp </location> </fehler-page> <!-//->
Wir arrangieren eine Standardseite wie folgt
Der Quellcode lautet wie folgt:
<%@ pageSencoding = "utf-8" iSerrorpage = "true"%> <%@ include File = "/web-inf/jsp/Common/klassischjsp/util.jsp"%> <! docType html> <html> <Kits> Fehler Seite </title> <stil> body {max-wid: 600px; Min-Width: 320px; Rand: 0 Auto; Padding-Top: 2%; } textArea {Breite: 100%; min-hohe: 300px; } H1 {text-align: rechts; Farbe: LightGray; } div {margin-top: 1%; } </style> </head> <body> <h1> Entschuldigung! </h1> <div style = "padding: 2% 0; textindent: 2em;"> Liebe Benutzer: Wir sind bestrebt, bessere Dienstleistungen zu erbringen, aber menschliche Berechnungen sind nicht so gut wie die Berechnungen Gottes. Es sind einige Fehler aufgetreten, und ich hoffe, dass sie sich im Kontrollbereich befinden. Wenn das Problem wiederholt auftritt, feedback an den Systemadministrator. </div> <textArea> <% NEUER ERRAGEHANDLER (Anfrage, Ausnahme, out); %> </textarea> <div> <center> <a href = "$ {pageContext.request.contextPath}"> Zurück zur Startseite </a> | <a href = "javaScript: history.go (-1);"> vorherige Seite </a> </center> </div> </body> </html>Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.