Исключение сервера 500 произошло. Если он обрабатывается по умолчанию, он поймает исключение и прыгнет на страницу исключений по умолчанию Tomcat, как показано на рисунке ниже.
Независимо от того же веб -сайта, поэтому Tomcat также позволяет пользовательским стилям удовлетворять пользовательские потребности. То есть настроить его в файле web.xml:
<mirrer-page> <cerry-code> 500 </error-code> <location>/error.jsp </location> </error-page>
Во -первых, давайте поговорим о логике, которая идет с ней. Если ошибка возникает во время выполнения страницы JSP, двигатель JSP автоматически генерирует объект исключения. Если страница JSP определяет другую страницу JSP в качестве обработчика ошибок, двигатель JSP помещает этот объект исключения в объект запроса и передает его в обработчик ошибок. Если у вас есть впечатление написания сервлетов, это та же идея, что и javax.servlet.forward.request_uri, которая превращается в шаблон JSP, сохраняет исходный путь запроса вместо пути страницы JSP. В обработчике ошибок, поскольку значение свойства IserRorpage директивы по компиляции страницы устанавливается на TRUE, двигатель JSP автоматически объявляет объект исключения, который получен из параметров HTTP, содержащегося в объекте запроса.
Информация об исключении, содержащуюся в объекте запроса, очень богата, как показано ниже:
Вы можете использовать java reffer.getattribute ("javax.servlet.error.status_code") или вы можете использовать EL Expressions на странице JSP, такие как $ {requestScope ["javax.servlet.error.status_code"]}.
Хотя эта пользовательская страница ошибки проста, сам JSP имеет хорошие результаты инкапсуляции. Я также видел много ресурсов других людей, но после тщательного изучения также есть много «обучения», поэтому я хочу снова «размолоть это колесо» - во -первых, местоположение - это страница JSP или сервлет, но если сервлет не может быть запущен, просто используйте простую страницу JSP. Мы определяем методы внутренних классов с помощью страниц JSP для достижения разделения страницы и логики (нет необходимости писать сервлеты). Остальные идеи следующие:
Заполните класс ErrorHandler в JSP. Другая страница называет этот класс ошибки. Он может не только принимать ошибки со страницы JSP, но и принять ошибки, передаваемые контроллером сервлета. Он извлекает как можно больше информации и сначала записывает все содержимое памяти, а затем выводит информацию об ошибке из двух выходных потоков на страницу и файл. В то же время, добавив несколько простых предложений, вы также можете написать копию информации на веб -странице в базу данных или текст, чтобы вернуть HTML/JSON/XML
Код реализации выглядит следующим образом:
/ *** Класс обработки исключений*/ Class errorHandler {// Все содержимое сначала записывается в память, а затем выводит из двух выходных потоков на страницу и файл соответственно. BytearRayOutputStream BytearRayOutputStream = new BytearRayOutputStream (); Private PrintStream PrintStream = New PrintStream (BytearRayoutputStream); / ** * Соберите информацию об ошибке * @param запрос * @param Exception * @param out */ public errorhandler (httpservletrequest, брось исключение, Jspwriter Out) {setRequest (request); SetException (Exception); if (out! = null) {try {out.print (bytearrayoutputstream); // вывод на веб -страницу} catch (ioException e) {e.printstacktrace (); }} log (запрос); if (bytearrayoutputstream! = null) попробуйте {bytearrayoutputstream.close (); } catch (ioException e) {e.printstackTrace (); } if (printStream! = null) printStream.close (); } / ** * * * @param запрос * / private void setRequest (httpservlectrequest) {printstream.println (); printstream.println ("Учетная запись пользователя:" + request.getSession (). getattribute ("username")); printstream.println ("Доступный путь:" + getInfo (запрос, "javax.servlet.forward.request_uri", String.class)); printstream.println ("Адрес страницы ошибки:" + getInfo (запрос, "javax.servlet.error.request_uri", string.class)); printstream.println ("Код ошибки:" + getInfo (запрос ", javax.servlet.error.status_code", int.class)); printstream.println ("Тип исключения:" + getInfo (запрос, "javax.servlet.error.exception_type", class.class)); printstream.println ("Информация об исключении:" + getInfo (запрос, "javax.servlet.error.message", string.class)); printstream.println ("Исключение Сервлет:" + getInfo (запрос, "javax.servlet.error.servlet_name", string.class)); printsstream.println (); // Два других объекта getInfo (запрос, "javax.servlet.jspexception", throwable.class); getInfo (запрос, "javax.servlet.forward.jspexception", throwable.class); getInfo (запрос, "javax.servlet.forward.jspexception", throwable.class); Map <string, string []> map = request.getParameterMap (); for (String Key: map.keyset ()) {printstream.println ("Параметр в запросе включает в себя:"); printstream.println (key + "=" + request.getParameter (key)); printsstream.println (); } для (cookie cookie: request.getcookies ()) {// cookie.getvalue () printstream.println ("cookie в запросе включает:"); printstream.println (cookie.getName () + "=" + cookie.getValue ()); printsstream.println (); }} / ** * * @param Exception * / private void setException (throwable Exception) {if (Exception! = null) {printStream.println ("exclive Information"); printstream.println (exception.getClass () + ":" + exection.getMessage ()); printsstream.println (); printsstream.println ("Stackinformation"); exception.printstacktrace (PrintStream); printsstream.println (); }}/** * * @param запрос */private void log (httpservletrequest) {file dir = new File (request.getSession (). getServletContext (). getRealPath ("/errorlog")); if (! dir.exists ()) {dir.mkdir (); } String timeStamp = new java.text.simpledateformat ("yyyymmddhmmmsss"). 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)) {// Записать в файл // ps.print (bytearRayoutputStream); //} catch (filenotfoundexception e) {// e.printstacktrace (); //} catch (ioException e) {// e.printstacktrace (); //} catch (Exception e) {// e.printstacktrace (); //}}/ ** * * * @param запрос * @param key * @param type * @return */ @suppresswarnings ("unchecked") private <t> t getInfo (httpservletrequest, запрос String, класс <t> type) {object obj = request.getTtribute (keie); вернуть obj == null? null: (t) obj; }} Это позволит контролировать исключения. Следующее определяет web.xml, чтобы позволить ошибке Tomcat привести к ошибке страницы. JSP мы только что указали
<!-404 В странице нет ошибки-> <ошибка PAGE> <Rirmor-code> 404 </error-code> <location>/web-inf/jsp/common/default/error.jsp </location> </error-page> <!-//-> <!-500 Сервер. <местоположение> /web-inf/jsp/common/default/error.jsp </location> </error-page> <!-//->
Мы организуем страницу по умолчанию следующим образом
Исходный код заключается в следующем:
<%@ page pageencoding = "utf-8" iserrorpage = "true"%> <%@ include file = "/web-inf/jsp/common/classicjsp/util.jsp"%> <! doctype html> <html> <head> <title> ошибка страница </title> <style> body {max-width: 600px; Мин-ширина: 320px; Поле: 0 Авто; надоеволок: 2%; } textarea {ширина: 100%; Мин-высот: 300px; } h1 {text-align: right; Цвет: Lightgray; } div {margin-top: 1%; } </style> </head> <body> <h1> Извините! </h1> <div style = "Padding: 2% 0; Text-indent: 2em;"> Дорогие пользователи: мы стремимся предоставлять лучшие услуги, но человеческие расчеты не так хороши, как Божьи расчеты. Произошли некоторые ошибки, и я надеюсь, что они находятся в рамках управления ... если проблема возникает неоднократно, пожалуйста, обратная связь с системным администратором. </div> <Textarea> <% new ErrorHandler (запрос, исключение, Out); %> </textarea> <div> <center> <a href = "$ {pagecontext.request.contextPath}"> Вернуться на главную страницу </a> | <a href = "javascript: vistory.go (-1);"> предыдущая страница </a> </center> </div> </body> </html>Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.