struts 1 - exception 처리

Published on: 2009. 7. 2. 00:39 by louis.dev


스트럿츠 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"/>