스트럿츠2 Interceptor

Interceptor 란?

1. 액션의 전처리 및 후처리 담당한다.
2. 1개의 인스턴스만 생성되고, 여러 액션에서 사용된다.
3. 여러 개의 인터셉터가 순차적으로 실행되는 스택을 만들 수 있다.
4. 액션의 전처리 과정에서 액션 실행 없이 Result로 바로 이동할 수 있다.





방법1: AbstractInterceptor 클래스 상속
com.opensymphony.xwork2.interceptor.AbstractInterceptor
intercept() 메소드 오버라이드 (필수)

public class XXXInterceptor extends AbstractInterceptor { }

---------------------------------------------------------------

방법2: MethodFilterInterceptor 클래스 상속(추천)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor
인터셉터 적용 제외 또는 적용 메소드를 지정할 수 있다.
doIntercept() 메소드 오버라이드 (필수)

public class XXXInterceptor extends MethodFilterInterceptor { }



-------------------------의존성을 주입한 인터셉터---------------------------------

1. 인터셉터의 가장 중요한 기능

2. 전처리 코드에서 setter 를 이용해서 액션이 필요한 객체를 주입

3. 의존성 주입이 필요한지 판단하기 위해서 XXXAware 인터페이스를 활용(중요)

-----------------------------의존성 setting------------------------------------
[board.interceptor.BoardServiceAware.java]

package board.interceptor;

import board.model.*;

public interface BoardServiceAware {
public void setBoardService(BoardService boardService);
}
-----------------------------의존성을 지닌 인터프리터class-------------------------------

[board.interceptor.BoardServiceInterceptor.java]

package board.interceptor;

import board.model.*;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.interceptor.*;

public class BoardServiceInterceptor extends AbstractInterceptor {

    private BoardService boardService;

    public void init() {
       boardService = new BoardService();
    }
   public String intercept(ActionInvocation invocation) throws Exception {
        Object action = invocation.getAction();
        if(action instanceof BoardServiceAware) {
             BoardServiceAware aware =  (BoardServiceAware) action;
             aware.setBoardService(boardService);
         }
         return invocation.invoke();
    }

    public void destroy() {
        boardService = null;
    }

}
-------------------------BoardAction class---------------------------------------

[board.action.BoardAction.java]

package board.action;

import board.interceptor.*;
import board.model.*;
import com.opensymphony.xwork2.*;

public class BoardAction extends ActionSupport
                                   implements BoardServiceAware {

//BoardServiceAware 구현
private BoardService boardService;
public void setBoardService(BoardService boardService) {
this.boardService = boardService;
System.out.println("BoardService 객체 주입됨");
}

//액션 메소드
public String registerForm() throws Exception {
 return "registerForm";
}
      …
}
------------------------------인터프리터맵핑----------------------------------------

[struts-root.xml]

<struts>
    <package name="root" namespace="/" extends="struts-default">
         <interceptors>
             <interceptor name="timerInterceptor" class="root.interceptor.TimerInterceptor"/>
             <interceptor name="boardServiceInterceptor" class="board.interceptor.BoardServiceInterceptor"/>
             <interceptor-stack name="rootInterceptorStack">
                  <interceptor-ref name="timerInterceptor"/>
                  <interceptor-ref name="boardServiceInterceptor"/>
             </interceptor-stack>
         </interceptors>
   
         <action name="welcome" class="root.action.WelcomeAction">
             <interceptor-ref name=" timerInterceptor"/>
             <result name="success">welcome.jsp</result>
         </action>
   
         <action name="board_*" method="{1}" class="board.action.BoardAction">
             <interceptor-ref name="rootInterceptorStack">
                   <param name="timerInterceptor.excludeMethods">registerForm</param>
             </interceptor-ref>
             <result name="registerForm">board/registerform.jsp</result>
             …
         </action>
    </package>
</struts>


by darkmirr | 2009/01/06 19:16 | FRAME WORK | 트랙백 | 덧글(0)

트랙백 주소 : http://darkmirr.egloos.com/tb/1255272
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶