서버 500 예외가 발생했습니다. 기본적으로 처리되는 경우 아래 그림과 같이 예외를 포착하고 Tomcat 기본 예외 페이지로 이동합니다.
웹 사이트가 동일하더라도 Tomcat은 사용자 정의 스타일이 사용자 정의 요구 사항을 충족시킬 수 있도록합니다. 즉, web.xml 파일에서 구성합니다.
<Error-Page> <Error-Code> 500 </error-code> <location> /error.jsp </location> </error-page>
먼저, 그것과 함께 제공되는 논리에 대해 이야기합시다. JSP 페이지를 실행하는 동안 오류가 발생하면 JSP 엔진이 자동으로 예외 객체를 생성합니다. JSP 페이지가 다른 JSP 페이지를 오류 핸들러로 지정하면 JSP 엔진 이이 예외 객체를 요청 객체에 넣고 오류 핸들러로 전달합니다. 서블릿 작성에 대한 인상이있는 경우 템플릿 JSP로 전환되는 javax.servlet.forward.request_uri와 동일한 아이디어는 JSP 페이지의 경로 대신 원래 요청 경로를 유지합니다. 오류 핸들러에서 페이지 컴파일 지침의 iserrorpage 속성 값이 true로 설정되므로 JSP 엔진은 예외 객체를 자동으로 선언합니다.
요청 객체에 포함 된 예외 정보는 다음과 같이 매우 풍부합니다.
java station request.getAttribute ( "javax.servlet.error.status_code")를 사용할 수 있거나 $ {requestScope [ "javax.servlet.error.status_code"]}와 같은 JSP 페이지에서 EL 표현식을 사용할 수 있습니다.
이 사용자 지정 오류 페이지는 간단하지만 JSP 자체는 캡슐화 결과가 양호합니다. 나는 또한 다른 사람들의 자원을 많이 보았지만,주의 깊은 연구 후에는 많은 "학습"이 있으므로 다시 "이 휠을 갈아"하고 싶습니다. 우선 위치는 JSP 페이지이거나 서블릿이지만 서블릿이 시작되지 않으면 간단한 JSP 페이지를 사용하십시오. 페이지와 논리의 분리를 달성하기 위해 JSP 페이지를 통해 내부 클래스 메소드를 정의합니다 (서블릿을 작성할 필요 없음). 나머지 아이디어는 다음과 같습니다.
JSP에서 ErrorHandler 클래스를 완료하십시오. 다른 페이지는이 ErrorHandler 클래스를 호출합니다. JSP 페이지에서 오류를 허용 할 수있을뿐만 아니라 서블릿 컨트롤러가 전달한 오류를 허용 할 수 있습니다. 가능한 한 많은 정보를 추출하고 모든 내용을 메모리에 먼저 쓰고 두 출력 스트림에서 페이지 및 파일로 오류 정보를 출력합니다. 동시에 몇 가지 간단한 문장을 추가 할 때 웹 페이지의 정보 사본을 데이터베이스 또는 텍스트에 html/json/xml을 반환 할 수도 있습니다.
구현 코드는 다음과 같습니다.
/ *** 예외 처리 클래스*/ 클래스 ErrorHandler {// 모든 내용은 먼저 메모리에 기록 된 다음 각각 두 개의 출력 스트림에서 페이지 및 파일로 출력됩니다. BYTEARRAYOUTPUTSTREAM BYTEARRAYOUTPUTSTREAM = NEW BYTEARRAYOUTPUTSTREAM (); Private PrintStream PrintStream = New PrintStream (BytearRayoutputStream); / ** * 오류 정보 수집 * @param request * @param Exception * @param out */ public errorhandler (httpservletrequest 요청, 던질 가능한 예외, jspwriter out) {setRequest (request); setException (예외); if (out! = null) {try {out.print (bytearrayoutputStream); // 웹 페이지로 출력} catch (ioexception e) {e.printstacktrace (); }} log (요청); if (bytearrayoutputStream! = null) try {bytearrayoutputStream.close (); } catch (ioexception e) {e.printstacktrace (); } if (printstream! = null) printstream.close (); } / ** * * @param request * / private void setRequest (httpservletrequest request) {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 (request, "javax.servlet.error.servlet_name", String.class)); printstream.println (); // 다른 두 객체 getInfo (요청, "javax.servlet.jspexception", strashable.class); getInfo (요청, "javax.servlet.forward.jspexception", strashable.class); getInfo (요청, "javax.servlet.forward.jspexception", strashable.class); map <string, string []> map = request.getParameterMap (); for (문자열 키 : map.keyset ()) {printstream.println ( "요청의 매개 변수는 다음과 같습니다."); printstream.println (key + "=" + request.getParameter (key)); printstream.println (); } for (쿠키 쿠키 : request.getCookies ()) {// cookie.getValue () printstream.println ( "요청의 쿠키는 다음과 같습니다."); printstream.println (cookie.getName () + "=" + coopie.getValue ()); printstream.println (); }} / ** * * @param Exception * / private void setException (Throwable Exception) {if (예외! = null) {printstream.println ( "예외 정보"); printstream.println (Exception.getClass () + ":" + Exception.getMessage ()); printstream.println (); printstream.println ( "stackinformation"); Exception.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 ( "yyyymmddhhmmss"). 형식 (new date ()); 파일 = 새 파일 (dir.getabsolutepath () + file.separatorchar + "error-" + timestamp + ".txt"); // try (fileoutputStream fileOutputStream = 새 FileOutputStream (file); // printstream ps = new PrintStream (fileoutputStream)) {// 파일에 쓰기 // ps.print (bytearRayoutputStream); //} catch (filenotfoundException e) {// e.printstacktrace (); //} catch (ioexception e) {// e.printstacktrace (); //} catch (예외 e) {// e.printstacktrace (); //}}/ ** * * @param request * @param key * @param type * @return */ @suppresswarnings ( "선택 취소") private <t> t getInfo (httpservletrequest 요청, 문자열 키, 클래스 <t> type) {object obj = request.getAttribute (key); return obj == null? 널 : (t) obj; }} 이것은 예외 제어를 가능하게합니다. 다음은 web.xml을 정의하여 Tomcat 오류가 페이지 오류로 이어지게합니다.
<!-404 페이지에 오류가 없습니다-> <오류-페이지> <Error-Code> 404 </error-code> <위치> /web-inf/jsp/common/default/error.jsp </location> </error-page> <!-//-> <!-500 서버 내부 오류-> <error-page> <Error-Code> 500 </error-code> <위치> /web-inf/jsp/common/default/error.jsp </location> </error-page> <!-//->
다음과 같이 기본 페이지를 정렬합니다
소스 코드는 다음과 같습니다.
<%@ pageencoding = "utf-8"iserrorpage = "true"%> <%@ conlude = "/web-inf/jsp/common/classicjsp/util.jsp"%> <! doctype html> <html> <head> <title> 오류 페이지 </title> style> body {max-width : 600px; 최소값 : 320px; 여백 : 0 Auto; 패딩 탑 : 2%; } textArea {너비 : 100%; Min-Height : 300px; } h1 {텍스트-정렬 : 오른쪽; 색상 : LightGray; } div {마진-탑 : 1%; } </style> </head> <hod> <h1> 죄송합니다! </h1> <div style = "패딩 : 2% 0; 텍스트-안정 : 2em;"> 친애하는 사용자 : 우리는 더 나은 서비스를 제공하기 위해 노력하고 있지만 인간의 계산은 하나님의 계산만큼 좋지 않습니다. 일부 오류가 발생했으며 제어 범위 내에 있기를 바랍니다. 문제가 반복적으로 발생하면 시스템 관리자에게 피드백을 피하십시오. </div> <TextRea> <% new ErrorHandler (요청, 예외, Out); %> </textarea> <div> <center> <a href = "$ {pagecontext.request.contextpath}"> 홈 페이지로 돌아 가기 </a> | <a href = "javaScript : history.go (-1);"> 이전 페이지 </a> </a> </center> </div> </body> </html>위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.