Se produjo una excepción del servidor 500. Si se maneja de forma predeterminada, captará la excepción y saltará a la página de excepción predeterminada de Tomcat, como se muestra en la figura a continuación.
No importa qué sitio web sea el mismo, por lo que Tomcat también permite que los estilos personalizados satisfagan las necesidades personalizadas. Es decir, configelo en el archivo web.xml:
<Enma-Page> <En Error-Code> 500 </Error-Code> <ocation> /Error.jsp </location> </fret-Page>
Primero, hablemos de la lógica que viene con ella. Si se produce un error durante la ejecución de una página JSP, el motor JSP generará automáticamente un objeto de excepción. Si la página JSP especifica otra página JSP como un controlador de errores, el motor JSP pondrá este objeto de excepción en el objeto de solicitud y lo pasará al controlador de errores. Si tiene la impresión de escribir servlets, esta es la misma idea que javax.servlet.forward.request_uri, que recurre a la plantilla JSP, conserva la ruta de solicitud original en lugar de la ruta de la página JSP. En el controlador de errores, debido a que el valor de la propiedad ISERRORPAGE de la Directiva de compilación de página se establece en True, el motor JSP declarará automáticamente un objeto de excepción, que se obtiene de los parámetros HTTP contenidos en el objeto de solicitud.
La información de excepción contenida en el objeto de solicitud es muy rica, como se muestra a continuación:
Puede usar la declaración Java request.getAttribute ("javax.servlet.error.status_code") o puede usar EL expresiones en la página JSP, como $ {requestscope ["javax.servlet.error.status_code"]}.
Aunque esta página de error personalizada es simple, JSP en sí tiene buenos resultados de encapsulación. También he visto muchos recursos de otras personas, pero después de un estudio cuidadoso, también hay mucho "aprendizaje", por lo que quiero "moler esta rueda" nuevamente; en primer lugar, la ubicación es una página JSP o un servlet, pero si el servlet no puede iniciarse, solo use una página JSP simple. Definimos los métodos de clase interna a través de las páginas JSP para lograr la separación de la página y la lógica (no es necesario escribir servlets). Las ideas restantes son las siguientes:
Complete la clase ErrorHandler en JSP. Otra página llama a esta clase ErrorHandler. No solo puede aceptar errores de la página JSP, sino también aceptar errores aprobados por el controlador Servlet. Extrae la mayor cantidad de información posible y escribe todo el contenido de la memoria primero, y luego genera la información de error de dos flujos de salida a la página y el archivo. Al mismo tiempo, al agregar algunas oraciones simples, también puede escribir una copia de la información en la página web a la base de datos o texto para devolver HTML/JSON/XML
El código de implementación es el siguiente:
/ *** Class de manejo de excepciones*/ clase ErrorHandler {// Todos los contenidos se escriben primero en la memoria, y luego salen de dos transmisiones de salida a la página y archivo respectivamente. ByteArRayOutputStream byteArRAyOutputStream = new ByteArRaReOutputStream (); Private PrintStream PrintStream = new PrintStream (bytearRayOutputStream); / ** * recopilar información de error * @param Solicitud * @param Exception * @param out */ public errorhandler (solicitud httpservletRequest, excepción lanzable, jspwriter out) {setRequest (request); setException (excepción); if (out! = null) {try {out.print (byteArRaRyOutputStream); // Salida a la página web} Catch (IOException e) {E.PrintStackTrace (); }} log (solicitud); if (bytearRayOutputStream! = NULL) intente {byteArRayOutputStream.close (); } catch (ioException e) {E.PrintStackTrace (); } if (printstream! = null) printStream.close (); } / ** * * @param solicitud * / private void setRequest (httpservletrequest request) {printStream.println (); printstream.println ("Cuenta de usuario:" + request.getSession (). getAttribute ("username")); printStream.println ("Path Accessed:" + getInfo (solicitud, "javax.servlet.forward.request_uri", string.class)); printstream.println ("Dirección de la página de error:" + getInfo (request ", javax.servlet.error.request_uri", string.class)); printstream.println ("Código de error:" + getInfo (request ", javax.servlet.error.status_code", int.class)); printstream.println ("Tipo de excepción:" + getInfo (request ", javax.servlet.error.exception_type", class.class)); printstream.println ("Información de excepción:" + getInfo (solicitud, "javax.servlet.error.message", string.class)); printstream.println ("Exception Servlet:" + getInfo (request, "javax.servlet.error.servlet_name", string.class)); printStream.println (); // Los otros dos objetos getInfo (solicitud, "javax.servlet.jspexception", showleable.class); getInfo (solicitud, "javax.servlet.forward.jspexception", shrowable.class); getInfo (solicitud, "javax.servlet.forward.jspexception", shrowable.class); Map <string, string []> map = request.getParametermap (); for (clave de cadena: map.keySet ()) {printStream.println ("El parámetro en la solicitud incluye:"); printstream.println (key + "=" + request.getParameter (key)); printStream.println (); } para (cookie cookie: request.getcookies ()) {// cookie.getValue () printstream.println ("Las cookies en la solicitud incluyen:"); printstream.println (cookie.getName () + "=" + cookie.getValue ()); printStream.println (); }} / ** * * @param Exception * / private void setException (excepción de lanzamiento) {if (excepción! = null) {printstream.println ("información de excepción"); printstream.println (excepcion.getclass () + ":" + excepción.getMessage ()); printStream.println (); printstream.println ("stackInformation"); excepción.printstacktrace (printstream); printStream.println (); }}/** * * @param request */private void log (httpservletRequest request) {file dir = new File (request.getSession (). GetServletContext (). GetRealPath ("/ErrorLog")); if (! dir.exists ()) {dir.mkdir (); } String timestamp = new java.text.simpledateFormat ("yyyymmddhmmsss"). Format (nueva fecha ()); Archivo archivo = nuevo archivo (dir.getabsolutePath () + file.separatorchar + "error-" + timestamp + ".txt"); // Prueba (FileOutputStream FileOutputStream = new FileOutputStream (archivo); // printStream PS = new PrintStream (FileOutputStream)) {// Escribir en File // Ps.Psint (ByTearRaReOutputStream); //} Catch (FileNotFoundException e) {// E.PrintStackTrace (); //} Catch (ioException e) {// E.PrintStackTrace (); //} Catch (Exception E) {// E.PrintStackTrace (); //}}/ ** * * @Param Key * @param * @param type * @return */ @suppresswarnings ("no verchado") privado <t> t getinfo (httpservletrequest request, string key, class <t> type) {objeto obj = request.getTrute (key); regresar obj == nulo? nulo: (t) obj; }} Esto habilitará el control de excepciones. Lo siguiente define Web.xml para permitir que el error de TomCat conduzca al error de la página. JSP Acabamos de especificar
< <Location> /web-inf/jsp/common/default/error.jsp </location> </etring-page> <!-//->
Organizamos una página predeterminada de la siguiente manera
El código fuente es el siguiente:
<%@ página PageEncoding = "UTF-8" iserRorPage = "true"%> <%@ include file = "/web-inf/jsp/común/clásicojsp/util.jsp"%> <! DocType html> <html> <Head> <title> Error Page </title> <Style> Body {max-width: 600px; Min-Width: 320px; margen: 0 auto; Top de relleno: 2%; } textAREA {ancho: 100%; Min-altura: 300px; } h1 {text-align: right; Color: LightGray; } div {margen-top: 1%; } </style> </head> <body> <h1> ¡Lo siento! </h1> <div style = "relleno: 2% 0; texto-indente: 2em;"> Estimados usuarios: estamos comprometidos a proporcionar mejores servicios, pero los cálculos humanos no son tan buenos como los cálculos de Dios. Se han producido algunos errores, y espero que estén dentro del alcance de control ... si el problema ocurre repetidamente, por favor comenta al administrador del sistema. </div> <xtexarea> <% new ErrgeHandler (solicitud, excepción, out); %> </textarea> <div> <center> <a href = "$ {pageContext.Request.ContextPath}"> Volver a la página de inicio </a> | <a href = "javaScript: History.go (-1);"> Página anterior </a> </Center> </div> </body> </html>Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.