Une exception de serveur 500 s'est produite. S'il est géré par défaut, il captera l'exception et sautera sur la page Exception par défaut de Tomcat, comme illustré dans la figure ci-dessous.
Quel que soit le site Web le même, Tomcat permet également aux styles personnalisés de répondre aux besoins personnalisés. Autrement dit, configurez-le dans le fichier web.xml:
<rorror-page> <error-code> 500 </ error-code> <location> /error.jsp </lanc> </ error-page>
Tout d'abord, parlons de la logique qui l'accompagne. Si une erreur se produit lors de l'exécution d'une page JSP, le moteur JSP générera automatiquement un objet d'exception. Si la page JSP spécifie une autre page JSP en tant que gestionnaire d'erreurs, le moteur JSP mettra cet objet à exception dans l'objet de demande et le transmettra au gestionnaire d'erreurs. Si vous avez l'impression d'écrire des servlets, c'est la même idée que javax.servlet.forward.request_uri, qui se tourne vers le modèle JSP, conserve le chemin de demande d'origine au lieu du chemin de la page JSP. Dans le gestionnaire d'erreurs, parce que la valeur de la propriété iSerrorPage de la directive de compilation de page est définie sur true, le moteur JSP déclare automatiquement un objet d'exception, qui est obtenu à partir des paramètres HTTP contenus dans l'objet de demande.
Les informations d'exception contenues dans l'objet de demande sont très riches, comme indiqué ci-dessous:
Vous pouvez utiliser l'instruction java request.getAttribute ("javax.servlet.error.status_code") ou vous pouvez utiliser les expressions EL dans la page jsp, telles que $ {requestCcope ["javax.servlet.error.status_code"]}.
Bien que cette page d'erreur personnalisée soit simple, JSP lui-même a de bons résultats d'encapsulation. J'ai également vu beaucoup de ressources des autres, mais après une étude minutieuse, il y a aussi beaucoup d'apprentissage "donc je veux" moudre cette roue "- tout d'abord, l'emplacement est une page JSP ou un servlet, mais si le servlet peut ne pas être démarré, utilisez simplement une page JSP simple. Nous définissons les méthodes de classe interne via des pages JSP pour réaliser la séparation de la page et de la logique (pas besoin d'écrire des servlets). Les idées restantes sont les suivantes:
Terminez la classe ErrorHandler dans JSP. Une autre page appelle cette classe ErrorHandler. Il peut non seulement accepter les erreurs de la page JSP, mais également accepter les erreurs transmises par le contrôleur de servlet. Il extrait autant d'informations que possible et écrit tout le contenu à la mémoire d'abord, puis publie les informations d'erreur de deux flux de sortie vers la page et le fichier. En même temps, lors de l'ajout de quelques phrases simples, vous pouvez également écrire une copie des informations sur la page Web à la base de données ou au texte pour retourner HTML / JSON / XML
Le code d'implémentation est le suivant:
/ ** * Exception Gestion de classe * / class ErrorHandler {// Tous les contenus sont d'abord écrits à la mémoire, puis la sortie de deux flux de sortie vers la page et le fichier respectivement. ByteArrayOutputStream byteArrayOutputStream = new bytearrayoutputStream (); private PrintStream PrintStream = new PrintStream (byteArrayOutputStream); / ** * Collectez les informations d'erreur * @param demande * @param exception * @param out * / public errorHandler (httpServLetRequest, exception throwable, jspwriter out) {setRequest (request); setException (exception); if (out! = null) {try {out.print (bytearrayoutputStream); // sortie vers la page Web} catch (ioException e) {e.printStackTrace (); }} log (demande); if (bytearrayoutputStream! = null) try {bytearrayoutputStream.close (); } catch (ioException e) {e.printStackTrace (); } if (printStream! = null) printStream.close (); } / ** * * @param request * / private void setRequest (httpsservletRequest request) {printStream.println (); printStream.println ("Compte utilisateur:" + request.getSession (). getAttribute ("nom d'utilisateur")); printStream.println ("Path accessible:" + getInfo (demande, "javax.servlet.forward.request_uri", string.class)); printStream.println ("Adresse de la page d'erreur:" + getInfo (demande, "javax.servlet.error.request_uri", string.class)); printStream.println ("Code d'erreur:" + getInfo (demande, "javax.servlet.error.status_code", int.class)); printStream.println ("Type d'exception:" + getInfo (demande, "javax.servlet.error.exception_type", class.class)); printStream.println ("Informations d'exception:" + getInfo (demande, "javax.servlet.error.mesage", string.class)); printStream.println ("Exception servlet:" + getInfo (request, "javax.servlet.error.servlet_name", string.class)); printStream.println (); // les deux autres objets getInfo (demande, "javax.servlet.jspexception", throwable.class); getInfo (demande, "javax.servlet.forward.jspexception", throwable.class); getInfo (demande, "javax.servlet.forward.jspexception", throwable.class); Map <string, string []> map = request.getParameTermap (); for (String Key: map.KeySet ()) {printStream.println ("Le paramètre dans la demande comprend:"); printStream.println (key + "=" + request.getParameter (key)); printStream.println (); } pour (cookie cookie: request.getcookies ()) {// cookie.getValue () printStream.println ("Les cookies dans la demande incluent:"); printStream.println (cookie.getName () + "=" + cookie.getValue ()); printStream.println (); }} / ** * * @param exception * / private void setException (exception throwable) {if (exception! = null) {printStream.println ("Informations d'exception"); printStream.println (exception.getClass () + ":" + exception.getMessage ()); printStream.println (); printStream.println ("stackInformation"); exception.printStackTrace (printStream); printStream.println (); }} / ** * * @param request * / private void log (httpsservletRequest request) {file dir = new file (request.getSession (). getServletContext (). getRealPath ("/ errorLog")); if (! dir.exists ()) {dir.mkdir (); } String timestamp = new java.text.simpledateFormat ("yyyymmddhhmmsss"). Format (new Date ()); File file = new File (dir.getabsolutepath () + file.separatorchar + "error-" + timestamp + ".txt"); // try (fileOutputStream fileoutputStream = new FileOutputStream (file); // printStream ps = new printStream (fileoutputStream)) {// écrire dans file // ps.print (bytearrayoutputStream); //} catch (filenotFoundException e) {// e.printStackTrace (); //} catch (ioException e) {// e.printStackTrace (); //} catch (exception e) {// e.printStackTrace (); //}} / ** * * @param request * @param key * @param type * @return * / @suppresswarnings ("Unchecked") private <t> t getInfo (httpservletRequest request, string key, class <t> type) {object obj = request.getAttribute (key); retour obj == null? null: (t) obj; }} Cela permettra le contrôle des exceptions. Ce qui suit définit web.xml pour laisser l'erreur Tomcat mener à l'erreur de page.jsp que nous venons de spécifier
<!-- 404 There is no error in the page --> <error-page> <error-code>404</error-code> <location>/WEB-INF/jsp/common/default/error.jsp</location> </error-page> <!-- // --> <!-- 500 Server internal error--> <error-page> <error-code>500</error-code> <llancier> /web-inf/jsp/common/default/error.jsp </ location> </ error-page> <! - // ->
Nous organisons une page par défaut comme suit
Le code source est le suivant:
<% @ page Pageencoding = "UTF-8" iSerrorPage = "true"%> <% @ include file = "/ web-inf / jsp / commun / classicjsp / util.jsp"%> <! doctype html> <html> <adread> <t titre> Page d'erreur </ title> <ystyle> body {max-width: 600px; largeur min: 320px; marge: 0 auto; Tapon de rembourrage: 2%; } textarea {largeur: 100%; Min-Height: 300px; } H1 {Text-Align: à droite; Couleur: Lightgray; } div {margin-top: 1%; } </ style> </ head> <body> <h1> Désolé! </h1> <div style = "padding: 2% 0; text-indent: 2em;"> Chers utilisateurs: Nous nous engageons à fournir de meilleurs services, mais les calculs humains ne sont pas aussi bons que les calculs de Dieu. Certaines erreurs se sont produites, et j'espère qu'elles sont dans la portée du contrôle ... si le problème se produit à plusieurs reprises, veuillez commentaire à l'administrateur système. </div> <TextArea> <% Nouveau ErrorHandler (demande, exception, out); %> </ textarea> <div> <enter> <a href = "$ {pagecontext.request.contextPath}"> Back to Home Page </a> | <a href = "JavaScript: History.go (-1);"> Page précédente </a> </ Center> </div> </ Body> </html>Ce qui précède concerne cet article, j'espère qu'il sera utile à l'apprentissage de tout le monde.