10장. 에러 처리 제10장
1. page 지시문을 활용한 에러 처리 page 지시문의 errorPage와 isErrorPage 속성 이 속성이 지정된 JSP 페이지 내에서 Exception이 발생하는 경우 새롭게 실행할 페이지를 지정하기 위하여 사용 isErrorPage 속성 isErrorPage는 위와같은 방법으로 새롭게 실행되는 페이지에 지정할 속성으로 현재 페이지가 Exception 처리를 위한 페이지임을 지정하기 위하여 사용 errorPage와 isErrorPage 속성 사용 목적 1) 발생하는 오류를 조금 더 일관성 있고 체계적으로 처리하기 위함 2) 개발 당시의 Exception 처리와 서비스를 운영할 때의 Exception 처리 방법을 바꾸기 위함 실제 서비스를 운영할 때에는 일종의 안내 메시지를 보여주어 이용자가 사이트를 더욱 신뢰할 수 있도록 하는 것이 좋다. 제10장
1. page 지시문을 활용한 에러 처리 errorPage와 isErrorPage 속성 예제 [예제 10.1-1] jspbook\ch10\divide_form.html 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 <%@ page contentType="text/html;charset=utf-8" %> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title>나누기 폼</title> </head> <body> 정수만 입력하세요. <br/> <form action="divide.jsp" method="get"> <input type="text" name="num1" size="3" /> / <input type="text" name="num2" size="3" /> = <br/> <input type="submit" value="Submit" /> <form> </body> </html> 제10장
1. page 지시문을 활용한 에러 처리 errorPage와 isErrorPage 속성 예제 [예제 10.1-2] jspbook\ch10\divide.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 <%@ page contentType="text/html;charset=utf-8" %> <% int num1 = Integer.parseInt(request.getParameter("num1")); int num2 = Integer.parseInt(request.getParameter("num2")); %> <html> <head> <title>나누기 처리</title> </head> <body> <%= num1 %> / <%= num2 %> = <%= (double)num1 / (double)num2 %> <br/> <a href="divide_form.html">back</a> </body> </html> 제10장
1. page 지시문을 활용한 에러 처리 errorPage와 isErrorPage 속성 예제 정수를 입력하여야 할 텍스트 창에 문자, 예를 들어 "a"를 입력하였을 때 출력되는 Exception 정보 제10장
1. page 지시문을 활용한 에러 처리 errorPage와 isErrorPage 속성 예제 Exception Stack Trace (예외 스택 자취) 실제 서비스가 개시된 응용에서는 이러한 Exception Stack Trace 가 보이는 화면이 사용자에게 보여지면 서비스 신뢰성에 큰 타격을 준다. [Note] Exception Stack Trace (예외 스택 자취) Exception Stack Trace란 Exception이 발생한 메소드 호출을 발생한 순서의 역순으로 나열한다. 즉 가장 최근의 메소드 호출이 먼저 리스트 되고 그 다음 줄에 이전의 메소드 호출이 리스트 된다. 이 리스트를 사용해서 내부적으로 메소드들이 어떠한 과정으로 호출되었는지를 알 수 있으며 디버깅에 중요한 정보로 활용할 수 있다. 제10장
1. page 지시문을 활용한 에러 처리 errorPage와 isErrorPage 속성 [예제 10.1-3] jspbook\ch10\divide2.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 <%@ page contentType="text/html;charset=utf-8" %> <%@ page errorPage="error/errorHandler.jsp" %> // page 지시문의 errorPage를 "errorHandler.jsp"로 설정 <% int num1 = Integer.parseInt(request.getParameter("num1")); int num2 = Integer.parseInt(request.getParameter("num2")); %> <html> <body> <title>나누기 처리</title> </head> <%= num1 %> / <%= num2 %> = <%= (double)num1 / (double)num2 %> <br/> <a href="divide_form.jsp">back</a> <form> </body> </html> divide_form.html의 변경 내용 기존: <form action="divide.jsp" method="get"> ==> 수정: <form action="divide2.jsp" method="get"> 제10장
1. page 지시문을 활용한 에러 처리 errorPage와 isErrorPage 속성 [예제 10.1-4] jspbook\ch10\error\errorHandler.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 <%@ page contentType="text/html;charset=utf-8" %> <%@ page isErrorPage="true" %> // 현재 페이지가 error가 발생했을 때 출력되는 페이지임을 알려줌. <html> <head> <title>divide 에러 처리</title> </head> <body> <H2 align="center">나누기 처리 중 에러가 발생했습니다.</H2> <hr> <table align="center" width="80%"> <tr bgcolor="yellow"> <td>빠른 시일내에 올바르게 복구하겠습니다. 문의는 관리자에게 해주세요.</td> </tr> <td>관리자 E-MAIL: jspbook@jspbook.org</td> </table> </body> </html> 제10장
1. page 지시문을 활용한 에러 처리 사용자 입력 오류와 Javascript [Note] 사용자 입력 오류와 Javascript [그림 10-4]과 [그림 10-5]에서 보여주는 예제가 실제 서비스 되는 웹페이지에 적용될 때에 대개는 사용자가 잘못된 입력을 하지 못하도록 Javascript를 이용하여 클라이언트 측 스크립팅 코드를 함께 넣는다. 즉, a를 입력하고 Submit 버튼을 누르면 Javascript를 활용해서 대화창을 띄우고 입력이 잘못되었다는 경고 메시지를 보여주는 것이 좋다. 이로써 쓸데없이 서버로의 잘못된 트래픽을 유발하는 것을 방지하는 것이 올바른 개발방법이다. 제10장
printStackTrace(PrintWriter pw) 1. page 지시문을 활용한 에러 처리 exception 기본 객체 사용하기 exception 기본 객체 page 지시문에서 오류 페이지 (isErrorPage="true") 로 지정된 JSP 페이지에서 예외가 발생할 때 전달되는 java.lang.Throwable의 인스턴스에 대한 참조 변수 page 지시문에서 isErrorPage="true" 로 지정을 해야 exception 기본 객체를 활용할 수 있음 exception 기본 객체의 주요 메소드 메소드 리턴 타입 설명 getMessage() String 문자열로 된 오류 메시지를 리턴한다. printStackTrace() void 표준 출력 스트림으로 스택 추적 정보를 출력한다. printStackTrace(PrintWriter pw) PrintWriter 객체스트림으로 스택 추적 정보를 출력한다. toString() 예외 클래스 이름과 함께 오류 메시지를 리턴 한다. 제10장
1. page 지시문을 활용한 에러 처리 exception 기본 객체 사용하기 예제 [예제 10.2-1] jspbook\errform.html 01 02 03 04 05 06 07 08 09 10 11 12 13 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title>exception 기본 객체 활용</title> </head> <body> <form action="errformhandler.jsp" method="post"> 나이를 입력하세요 : <input type="text" name="age" /> <input type="submit" value="Submit" /> </form> </body> </html> 제10장
1. page 지시문을 활용한 에러 처리 exception 기본 객체 사용하기 예제 [예제 10.2-2] jspbook\ch10\errformhandler.jsp 01 02 - 03 04 05 06 07 08 09 10 11 12 <%@ page contentType="text/html;charset=utf-8"%> <%@ page errorPage="error/errorHandler2.jsp" %> // page 지시문의 errorPage를 // "errhandler2.jsp"로 설정 <html> <head><title>exception 기본 객체 활용</title></head> <body> <% int age = Integer.parseInt(request.getParameter("age")); %> <p>Your age is : <%= age %> years.</p> <p><a href="errform.html">Back</a>.</p> </body> </html> 제10장
1. page 지시문을 활용한 에러 처리 exception 기본 객체 사용하기 예제 [예제 10.2-3] jspbook\ch10\errorhandler2.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 <%@ page contentType="text/plain;charset=utf-8" %> <%@ page isErrorPage="true" import="java.io.*" %> // 현재 페이지가 error가 발생했을 때 출력되는 페이지임을 알려줌 <html> <head><title>exception 기본 객체 활용</title></head> <body> <%= exception.toString() %><br> // exception의 정보를 보여줌 <% out.println("<!--"); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); exception.printStackTrace(pw); out.print(sw.toString()); sw.close(); pw.close(); out.println("-->"); %> </body> </html> // 자세한 exception 정보를 주석으로만 출력함 제10장
1. page 지시문을 활용한 에러 처리 exception 기본 객체 사용하기 예제 errhandler.jsp의 동작과정 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 404 에러 발생 시 페이지 출력 예 디폴트 출력 화면 Time 지 웹 사이트의 출력 화면 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 HTTP 에러 발생 시 출력할 페이지의 URL 지정 web.xml 에 다음과 같이 지정 <?xml version="1.0" encoding="utf-8"?> <web-app ...> ... <error-page> <error-code>에러 코드</error-code> <location>에러 페이지의 URL</location> </error-page> </web-app> 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 404, 500 에러 발생 시 출력할 페이지 설정 예 [예제 10.3-1] jspbook\ch10\WEB-INF\web.xml <?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> ... <!-- 다음 내용을 삽입 --> <error-page> <error-code>404</error-code> <location>/ch10/error/404errorHandler.jsp</location> </error-page> <error-code>500</error-code> <location>/ch10/error/500errorHandler.jsp</location> <!-- 삽입 끝 --> </web-app> 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 404 에러 발생 시 출력할 페이지 구성 예 [예제 10.3-2] jspbook\ch10\error\404errorHandler.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 <%@ page contentType="text/html;charset=utf-8" %> <% response.setStatus(HttpServletResponse.SC_OK); %> <html> <head><title>404 에러 발생</title></head> <body> <b> <h1>에러 코드 404</h1> 요청한 페이지는 존재하지 않습니다. URL을 다시 살펴보시기 바랍니다. </b> </body> </html> 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 500 에러 발생 시 출력할 페이지 구성 예 [예제 10.3-3] jspbook\ch10\error\500errorHandler.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 <%@ page contentType="text/html;charset=utf-8" %> <% response.setStatus(HttpServletResponse.SC_OK); %> <html> <head><title>500 에러 발생</title></head> <body> <b> <h1>에러 코드 500</h1> 서비스 처리 과정에서 에러가 발생하였습니다. 조속한 시일 내로 해결하겠습니다. </b> </body> </html> 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 404 에러 발생 및 출력 화면 브라우저에서 URL 입력 예 출력 화면 http://localhost:8080/jspbook/ch10/11111.jsp 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 500 에러 발생 및 출력 화면 divide_form.html의 09라인 수정 기존: <form action="divide2.jsp" method="get"> ==> 수정: <form action="divide.jsp" method="get"> 제10장
2. HTTP 에러 코드별 에러 페이지 지정하기 500 에러 발생 및 출력 화면 500에러에 대한 출력 내용 제10장
3. Java 고유의 예외 종류별 에러 페이지 지정하기 [예제 10.4-1] jspbook\ch10\WEB-INF\web.xml <?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> ... <!-- 다음 내용을 삽입 --> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/ch10/error/nullPointerErrorHandler.jsp</location> </error-page> <!-- 삽입 끝 --> </web-app> 제10장
3. Java 고유의 예외 종류별 에러 페이지 지정하기 NullPointerException 에러 발생 시 출력할 페이지 구성 예 [예제 10.4-2] jspbook\ch10\error\nullPointerErrorHandler.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 <%@ page contentType="text/html;charset=utf-8" %> <% response.setStatus(HttpServletResponse.SC_OK); %> <html> <head><title>NullPointerException 예외 발생</title></head> <body> <h1>예외 타입 NullPointerException</h1> 서비스 처리 과정에서 예외가 발생하였습니다. 조속한 시일 내로 해결하겠습니다. </body> </html> 제10장
3. Java 고유의 예외 종류별 에러 페이지 지정하기 NullPointerException 에러 발생 및 출력 화면 [예제 10.4-3] jspbook\ch10\readID.jsp 01 02 03 04 05 06 07 08 09 <%@ page contentType="text/html;charset=utf-8" %> <html> <head><title>파라미터 출력 및 에러 처리 페이지 지정</title></head> <body> ID 파라미터 값에 대한 대문자 처리: <%= request.getParameter("ID").toUpperCase() %> </body> </html> 제10장
4. 에러 페이지 지정의 일반적인 방법 에러 페이지를 지정 및 구성하는 3가지 방법 page 지시문 및 errorPage와 isErrorPage 속성을 활용한 에러 페이지 지정하기 web.xml의 <error-code>태그를 활용한 HTTP 에러 코드별 에러 페이지 지정하기 web.xml을 <exception-type>태그를 활용한 Java 고유의 예외 종류별 에러 페이지 지정하기 위 방법을 중복하여 사용하였을 때 적용되는 우선순위 우선순위 ①: page 지시문의 errorPage 속성 활용 우선순위 ②: JSP 페이지에서 발생한 HTTP 에러 또는 예외 타입이 web.xml 파일의 <error-code>에서 지정한 에러 코드와 동일하거나 <exception-type>에서 지정한 예외 타입과 동일한 경우 지정한 에러 페이지를 보여준다. 우선순위 ③: 위의 순위 중 아무 것도 해당되지 않을 경우 Tomcat 엔진이 제공하는 기본 에러 페이지를 보여준다. 제1장
4. 에러 페이지 지정의 일반적인 방법 에러 페이지를 지정 및 구성하는 일반적인 관례 일반적인 HTTP 에러 코드(404, 500 등)에 대한 에러 페이지를 web.xml의 <error-code>태그를 활용하여 지정한다. 별도로 처리해 주어야 하는 Java 고유의 예외 타입에 대한 에러 페이지는 web.xml에 <exception-type> 태그를 활용하여 지정한다. 특정 JSP 페이지에서 발생하는 HTTP 에러 또는 Java 고유의 예외 타입을 별도로 처리하기 위해서는 관련 에러 페이지를 page 지시문의 errorPage 속성을 사용해서 지정하고 에러 페이지에는 page 지시문의 isErrorPage 속성에 "true"을 할당한다. 제1장