스트럿츠 1에서는 익셉션 처리 하는 방법이 두가지가 있다.
① Global Exception으로 처리하는 방법
② Action Exception으로 처리하는 방법
1. Global Exception으로 처리하는 방법
1) 에러가 발생되었을때 보여질 jsp 페이지를 생성한다.
-----------------------------------------------------------------------------------------------------
<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="org.apache.struts.Globals" %>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html"%>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<html>
<head>
<title>예외 처리</title>
</head>
<body>
<center>
<h3><b>예외 핸들러가 전달한 에러 메시지 목록</b></h3>
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
<br/><br/>
<h3>예외객체에서 가져온 예외 메시지</h3>
<blockquote style="background: wheat;">
<%
Exception ex = (Exception)
request.getAttribute(Globals.EXCEPTION_KEY);
if (ex == null) out.println("ex == null");
else out.println(ex.getMessage());
%>
</blockquote>
</center>
</body>
</html>
-----------------------------------------------------------------------------------------------------
2) .properties 파일(메시지 번들) 생성
-----------------------------------------------------------------------------------------------------
# exception messages
exception.global=오류가 발생했습니다.
exception.handler={0} : 오류가 발생했습니다. 오류 메시지 : {1}
exception.register=존재하지 않는 이름이 입력되었습니다.
exception.fileNotFound=업로드 파일이 존재하지 않습니다.
# native2ascii -encoding euc-kr ExceptionMessageResource.properties ExceptionMessageResource_ko.properties
-----------------------------------------------------------------------------------------------------
3) 사용할 struts-config.xml 파일에 <global-exceptions>생성
<global-exceptions>
<exception type="java.lang.Exception"
key="exception.global"
path="/exception/exception.jsp"/>
</global-exceptions>
모든 Exception이 발생했을때 다음의 global-exceptions 를 실행한다.
- type : Exception class 설정
- key : properties 파일에 존재하는 에러 key 선택
- path : 에러 발생시 보여줄 페이지 선언
- handler: exception을 처리할 Handler Class 선언
Handler Class 는 ExceptioHandler class를 상속 받은 구조여야 한다.(Action Exception으로 exception을 처리할때 선언)
4) config.xml 파일에 message-resources 등록하기(.properties파일 경로 지정)
<message-resources parameter="com.myhome.upload.ExceptionMessageResource"/>
2. Action Exception으로 처리하는 방법
1) ExceptioHandler class를 상속받은 class를 생성하고 ExceptionHandler class의 excute() 메소드를 override 한다.
-----------------------------------------------------------------------------------------------------
package com.myhome.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.config.ExceptionConfig;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.action.ActionMessage;
import java.util.Date;
public class InfoExceptionHandler extends ExceptionHandler {
public ActionForward execute(Exception ex,
ExceptionConfig config,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException {
/* 발생한 예외시간을 포함해서 새로운 문자열로 구성한다.
* 액션 메시지의 정보를 리소스번들에 지정한 인수로 전달하기 위해 사용된다.
* . resource bundle
* exception.handler={0} : 오류가 발생했습니다.
* 오류 메시지 : {1}
* arg[0] => {0}로 연결된다.
* arg[1] => {1}로 연결된다.
*
* */
String [] args = new String[2];
long currentTimeMillis = System.currentTimeMillis();
Date currentTime = new Date(currentTimeMillis);
args[0] = currentTime.toString(); // 현재 시간을 인자로 저장.
args[1] = ex.getMessage(); // 오류 메시지를 인자로 저장.
// 지정된 키의 메시지를 메시지 리소스 번들에서 가져와
//{0}, {1}을 지정된 인자로 대체하여 새로운 메시지 구성.
ActionMessage errorMessage = new ActionMessage(
config.getKey(),args);
// 예외 정보를 가지고 포워딩할 JSP페이지를 찾는다.
//<exception path=""/>에 지정된 페이지
ActionForward forward = new ActionForward(config.getPath());
// 예외 사항들을 request에 저장한다.
storeException(request,
config.getKey(),
errorMessage,
forward,
config.getScope());
return forward;
}
}
-----------------------------------------------------------------------------------------------------
이 클래스는 익셉션이 발생하였을때 이쪽으로 넘어오며 에러메시지를 request 객체에 담아 에러 메시지를 보여줄 페이지로 보내주게 된다.
에러가 발생하게 되면
<exception key="exception.handler"/> 메시지를 가져다가 현재 시간과 ex.getMessage()를 실행하여 예외의 메시지를 합쳐서 ActionMessage 객체를 구성하게 된다.
그리고 config.getPath()를 이용해서
<exception path="/exception/exception.jsp"/> 로 지정된 포워딩할 JSP 주소를 얻어다 ActionForward 객체를 구성한다.
최종적으로 storeException()메소드를 실행하여 에러 메시지를 지정된 스코프(config.getScope())에 저장하고는 포워드 객체를 리턴한다.
이제 IOException 이나 NullPointerException이 발생하면 아래와 같은 화면을 보게 된다.
2.struts-config.xml 파일에 <action>태크 밑으로 로컬 exception 영역을 설정한다.
<action path="/upload"
name="uploadBean"
scope="request"
parameter="method"
unknown="true"
type="com.myhome.upload.actions.UploadDispatchAction">
<!-- exception handle -->
<exception key = "exception.handler"
handler = "com.myhome.handler.InfoExceptionHandler"
path = "/excetpion.jsp"
type = "java.lang.NullPointerException">
</exception>
<forward name="result" path="/result.jsp"/>
<forward name="fail" path="/fail.jsp"/>
<forward name="list" path="/list.jsp"/>
<forward name="query" path="/modify.jsp"/>
<forward name="update" path="/template.jsp"/>
<forward name="delete" path="/template.jsp"/>
</action>
type 에 선언된 Action에서 exception이 발생 되었을때 하단의 exception handle에 의해 에러 페이지로 이동한다.
여러종류의 Exception을 처리 할 경우
<exception key="exception.handler"
handler=“info.handler.InfoExceptionHandler"
path="/exception/exception.jsp"
type="java.lang.NullPointerException"/>
<exception key="exception.handler"
handler=“info.handler.InfoExceptionHandler"
path="/exception/exception.jsp"
type="java.io.IOException"/>
'Framework > STRUTS 1' 카테고리의 다른 글
struts1 - Tiles plug-in (0) | 2009.07.01 |
---|---|
struts 1 - validator (0) | 2009.07.01 |
struts 1 - File Uplod & File Download (0) | 2009.07.01 |
Struts 1 - 스트럿츠 1의 다양한 Action Class 들 part 3 (0) | 2009.06.30 |
Struts 1 - 스트럿츠 1의 다양한 Action Class 들 part 2 (0) | 2009.06.29 |