IT/Spring-JSP&Servlet

[JSP/Servlet] 익셉션 처리(2/2) - web.xml 파일 처리

_하늘여우_ 2020. 10. 28. 03:16

출처 : unsplash

 

■ 들어가기

- 뇌를 자극하는 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>

> 실행 결과

(JSP 페이지) 곱셈 프로그램 정상
(JSP 페이지) 곱셈 프로그램 에러


(JSP 페이지) 나눗셈 프로그램 정상
(JSP 페이지) 나눗셈 프로그램 에러


- 서블릿 클래스에서 발생하는 익셉션도 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>

> 실행 결과

미존재 페이지 호출 : 에러