[JSP/Servlet] 익셉션 처리(2/2) - web.xml 파일 처리
■ 들어가기
- 뇌를 자극하는 JSP&Servlet (김윤명/한빛미디어). 을 공부하며 정리하는 블로그
■ 목차
1. 익셉션 타입별로 에러 페이지를 등록하는 방법
2. HTTP 상태 코드별로 에러 페이지를 등록하는 방법
3. xxxxx
1. 익셉션 타입별로 에러 페이지를 등록하는 방법
- 자바에서 익셉션을 객체로 표현하고 있고,
각각의 익셉션의 타입을 해당 객체의 클래스 타입으로 표현 (참고: 익셉션 타입)
- web.xml 파일에 익셉션 타입별로 에러 페이지 등록 가능하고
등록된 에러 페이지는 해당 익셉션 타입의 익셉션 발생 시 자동으로 호출됨
단, page 지시자 내 errorPage="에러 페이지" 애트리뷰트는 제거해야 한다. (web.xml 설정보다 우선하기 때문)
- web.xml 등록 방법
. 루트 엘리먼트 <web-app> 엘리먼트 내 <error-page> 라는 서브 엘리먼트 작성
. <error-page> 엘리먼트 내 <exception-type>, <location> 라는 서브 엘리먼트 작성
. 각각 익셉션 타입과 에러 페이지의 URL 경로명을 기재
- NumberFormatException 호출 예제 - JSP 페이지
. 두 수의 곱을 구하는 JSP 페이지 : Multiplyer.jsp
. 두 수의 몫을 구하는 JSP 페이지 : Divider.jsp
. 에러 페이지 : NumberFormatError.jsp
<!-- Multiplyer.jsp -->
<%@page contentType="text/html; charset=euc-kr" %>
<%
String str1 = request.getParameter("NUM1") ;
String str2 = request.getParameter("NUM2") ;
int num1 = Integer.parseInt(str1) ;
int num2 = Integer.parseInt(str2) ;
int result = num1 * num2 ;
%>
<html>
<head><title>곱셈 프로그램</title></head>
<body>
<%= num1 %> * <%= num2 %> = <%= result %>
</body>
</html>
<!-- Divider.jsp -->
<%@page contentType="text/html; charset=euc-kr" %>
<%
String str1 = request.getParameter("NUM1") ;
String str2 = request.getParameter("NUM2") ;
int num1 = Integer.parseInt(str1) ;
int num2 = Integer.parseInt(str2) ;
int result = num1 / num2 ;
%>
<html>
<head><title>나눗셈 프로그램</title></head>
<body>
<%= num1 %> / <%= num2 %> = <%= result %>
</body>
</html>
<!-- NumberFormatError.jsp -->
<%@page contentType="text/html; charset=euc-kr" isErrorPage="true" %>
<% response.setStatus(200) ; %>
<html>
<head><title>숫자 포맷 에러</title></head>
<body>
숫자 포맷이 잘못되었습니다. <br><br>
상세 에러 메시지 : <%= exception.getMessage() %>
</body>
</html>
<!-- web.xml -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">
<error-page>
<exception-type>java.lang.NumberFormatException</exception-type>
<location>/NumberFormatError.jsp</location>
</error-page>
</web-app>
> 실행 결과
- 서블릿 클래스에서 발생하는 익셉션도 web.xml에 등록된 에러 페이지를 호출 가능
- doGet, doPost 메서드 안에서 발생한 익셉션을 메서드 밖으로 던지도록 해야함 : try ~ catch 미사용!
- NumberFormatException 호출 예제 - 서블릿 클래스
. 두 수의 몫을 구하는 서블릿 클래스 : DividerServlet
/* DividerServlet.java */
import javax.servlet.http.* ;
import javax.servlet.* ;
import java.io.* ;
public class DividerServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String str1 = request.getParameter("NUM1") ;
String str2 = request.getParameter("NUM2") ;
int num1 = Integer.parseInt(str1) ;
int num2 = Integer.parseInt(str2) ;
int result = num1 / num2 ;
response.setContentType("text/html; charset=euc-kr") ;
PrintWriter out = response.getWriter() ;
out.println("<html>") ;
out.println("<head><title>나눗셈 프로그램</title></head>") ;
out.println("<body>") ;
out.printf("%d / %d = %d", num1, num2, result) ;
out.println("</body>") ;
out.println("</html>") ;
}
}
<!-- web.xml -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">
<error-page>
<exception-type>java.lang.NumberFormatException</exception-type>
<location>/NumberFormatError.jsp</location>
</error-page>
<servlet>
<servlet-name>divider-servlet</servlet-name>
<servlet-class>DividerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>divider-servlet</servlet-name>
<url-pattern>/divider</url-pattern>
</servlet-mapping>
</web-app>
> 실행 결과
2. HTTP 상태 코드별로 에러 페이지를 등록하는 방법
- 일반적으로 클라이언트(ex.브라우저)에서 요청한 URL에 해당하는 웹 자원이 없는 경우(HTTP상태코드: 404)
was에서 제공하는 기본 에러 페이지를 노출한다.
- HTTP 상태코드에 따라 직접 작성한 에러 페이지를 보여주고자 한다면 web.xml에 등록하여 처리 가능
- web.xml 등록 방법
. 루트 엘리먼트 <web-app> 엘리먼트 내 <error-page> 라는 서브 엘리먼트 작성
. <error-page> 엘리먼트 내 <error-code>, <location> 라는 서브 엘리먼트 작성
. 각각 HTTP 상태코드와 에러 페이지의 URL 경로명을 기재
- HTTP 상태코드 404에러 처리 : NotFoundError.jsp
. 이때 실제 404에러이지만, 에러 페이지 호출을 위해 HTTP 상태코드는 200 으로 변경함
<!-- NotFoundError.jsp -->
<%@page contentType="text/html; charset=euc-kr" %>
<% response.setStatus(200) ; %>
<html>
<head><title>페이지 없음 에러</title></head>
<body>
해당 페이지를 찾을 수 없습니다.
</body>
</html>
<!-- web.xml -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">
<error-page>
<error-code>404</error-code>
<location>/NotFoundError.jsp</location>
</error-page>
</web-app>
> 실행 결과