ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JSP/Servlet] 익셉션 처리(2/2) - web.xml 파일 처리
    IT/Spring-JSP&Servlet 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>
    

    > 실행 결과

    미존재 페이지 호출 : 에러

    댓글

Designed by Tistory.