Where The Streets Have No Name

JSP 에러 페이지를 만드는 세가지 방법 본문

Developement/Java

JSP 에러 페이지를 만드는 세가지 방법

highheat 2007. 5. 4. 12:27
출처 : http://www.okjsp.pe.kr/bbs?act=VIEW&seq=27259&bbs=bbs4&keyfield=content&keyword=&pg=0

1. 첫째는 옛날 방식으로 JSP페이지에 직접 에러페이지를 표시해주는 방식입니다.

<%@ page errorPage="error.jsp" %>

이때 error.jsp에 <%@ page isErrorPage="true" %>라고 선언해야합니다.
JSP페이지에 에러가 발생하면 error.jsp로 제어가 넘어가고 error.jsp에서는
"exception"이라는 implicit 객체를 사용하여 에러메시지를 보여줄 수 있습니다.
에러를 우아하게 처리하기 위해서는 JSP페이지마다 errorPage속성을 지정해야하는
불편이 있었던 방식입니다.

 

2. 둘째는 서블릿2.3에서 추가된 것으로, web.xml에 에러유형별로 에러페이지를
지정해 주는 좀더 진화된 방식입니다.(첨부파일 참조)

 

    <error-page>
      <error-code>404</error-code>
      <location>/404error.jsp</location>
    </error-page>
    <error-page>
      <error-code>500</error-code>
      <location>/500error.jsp</location>
    </error-page>
    <error-page>
      <exception-type>java.lang.Throwable</exception-type>
      <location>/error.jsp</location>
    </error-page>

 

이제 JSP에서 예외가 발생하면 해당 JSP페이지에 errorPage속성을 선언 안해도
error.jsp가 자동으로 에러를 처리합니다. 그리고 error-page에서 지정해준 error.jsp에는
<%@ page isErrorPage="true" %> 등의 선언이 불필요합니다. 그러나 이전 방식과는 다르게
예외객체인 "exception"을 직접 접근하진 못합니다.
대신 새로이 추가된 속성값으로 예외객체를 불러올 수 있습니다.

 

Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");

 

에러 관련하여 request 스코프에 저장된 속성의 목록입니다.
(http://network.hanbitbook.co.kr/view_news.htm?serial=78)

 

javax.servlet.error.status_code: 에러 상태 코드를 말해 주는 정수이다.

javax.servlet.error.exception_type: 에러가 생기게 된 예외 형을 지적해 주는 클래스 인스턴스이다.
javax.servlet.error.message: 예외 메시지를 말해주는 스트링이며, 예외 컨스트럭터로 보내어 진다.
javax.servlet.error.exception: 실제 예외가 없어지면 버릴 수 있는 객체이다.
javax.servlet.error.request_uri: 문제를 일으킨 리소스의 URI를 말해주는 스트링이다.

 

에러페이지를 JSTL로 작성한다면 위의 속성들은 이렇게 접근할 수 있습니다.
(가르쳐주신 ares님께 감사드립니다)

 

  <c:out value="${requestScope['javax.servlet.error.message']}"/>

 

저처럼 <c:out value="${javax.servlet.error.message}"/> 로 하지 마시길...

 


3. 추가로 스트러츠 고유의 에러 처리법도 있습니다.
struts-config.xml에서 Exception의 타입에 따라 에러 페이지를 매핑합니다.
(ExceptionHandler를 새로 구현하셔도 됩니다)

 

<global-exceptions>
    <exception key="error.general"
               type="java.lang.Exception"
               handler="org.apache.struts.action.ExceptionHandler"
               path="/error.jsp"
               scope="request"/>
</global-exceptions>

 

스트러츠를 사용하는 어플리케이션에서 Exception이 발생하면 Exception 객체는
request에 org.apache.struts.Globals.EXCEPTION_KEY 키로 저장되고 제어권은
error.jsp로 넘어갑니다. 스트러츠용 error.jsp의 예입니다.

 

<% Exception ex = (Exception)request.getAttribute(org.apache.struts.Globals.EXCEPTION_KEY); %>
<% if (ex != null) { %>
  <table width=100% border=1 cellpadding=6 cellspacing=0>
  <tr align="center" bgcolor="#FFCC66"><td>에러 메시지</td></tr>
  <tr align="center"><td><b><%= ex %></b></td></tr>
  </table>
<p>
  <table width=100% border=1 cellpadding=6 cellspacing=0>
  <tr align="center" bgcolor="lightgrey"><td>에러 스택 추적 정보
  </td></tr>
  <tr align="left"><td>
  <pre><% ex.printStackTrace(new java.io.PrintWriter(out)); %></pre>
  </td></tr>
  </table>
<p>
<% } %>