출처 : http://blog.naver.com/nillwow/7631084


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

JSP에서 에러페이지를 보여주는 방식은 크게 세가지로 나눌수 있습니다.

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>/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.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>
<% } %>

※ 내용에 오류가 있으면 지적해 주시기 바랍니다.
ares
세번째 파트에 첨가를 하자면
struts 커스텀 태그 중에
<html:errors /> 태그 단 한줄을
이용해도 쉽게 에러메세지를 표현할수 있습니다.
하지만 html:errors 태그로 stack의 정보를 아는 방법은
없는것 같습니다.
2003-01-31 12:00:26.0
박종진
부연하자면 <html:errors/> 태그를 사용하실때는
(1) 에러메시지를 담고있는 메시지 리소스 파일(ex: ApplicationResources.properties)을 작성하셔야하고,
(2) Form 또는 Action에서 에러 발생시에 적절한 ActionError를 만들어주는 작업이 필요합니다.
(3) struts-config.xml의 action요소에서 input 파라미터
세팅하는 것도 빼먹어선 안되겠죠.

+ Recent posts