Interceptors에 대한 자세한 내용은 struts.apache.org를 참조한다.

http://struts.apache.org/2.0.14/docs/interceptors.html



■ Interceptor의 내부적인 구조를 간단하게 그린 그림이다.

1) preparable : Client로 부터 전달된 모든 데이타 들은 모두 preparable로 들어오며,
    form의 파라미터로 정의 되어있는 그 파라미터의 이름을 통해서 다음 구현할 액션 각각
    의 setter를 정의하고 거기에 있는 객체를 생성, 초기화 해주는 역할을 한다.


2) stack : preparable으로 넘어온 데이타에 대해 렌더링을 수행하고 그 결과를 Action으로 호출한다.

3) Action : execute method 메소드 만을 수행한다.(비즈니스 로직 수행)

4) ModelDriven : 결과를 result로 주는 역할을 담당한다.

 Interceptors 에 대한 간단한 설명.

 

1) 액션 실행 주위로 실행될 수 있는 코드를 인캡슐레이션 할 수 있게 한다.
2) 액션 실행에 투명성을 제공할 수 있는 커맨드 패턴의 추가 서비스이다.
3) 인터페이스는 액션 외부에 정의되고, 런타임 시에 액션과 액션 실행 환경을 엑세스할
    있어
, 관심사
분리와 크로스 커팅 코드를 할 수 있게 해준다
4) 인터셉터는 액션이 호출되기 전과 후에 명령코드를 실행할 수 있다. 대부분의 프레임워크
    핵심 기능들
인터셉터로 구현되어있다.

5) 모든 인터셉터는 플러그인 방식이며, 인터셉터 스택으로 적용될 수 있다.

 인터셉터의
대표적인 기능

    
 타입 변환, 객체 파퓰레이션, 유효성 검사, 파일 업로드, 출력 페이지 준비
등과 같은 기능들은 모두 인터셉터의 도움으로 구현된다.


default interceptor
struts-default.xml에서 정의되어있다.


 Struts2는 Interface기반 이다. Interceptors를 implements 구현하기 위해서는 preparable, action, modeldriven 이 세가지를 꼭 구현해야 한다.

 간단한 소스 보기 : Class에서 적용된 경우

package interceptor1.action;

import interceptor1.dao.SumDAO;
import interceptor1.model.NumberForAdd;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;

public class SumAction implements Action, Preparable, ModelDriven { // 3가지만 구현하면 다양하게 구현할 수 있다.

    //도메인 오브젝트
    NumberForAdd num;
    private int sum = 0;

    @Override
    public String execute() throws Exception { // 2단계
        SumDAO dao = new SumDAO();             
        sum = dao.add(num);
        return SUCCESS;
    }

    //Preparable인터페이스의 prepare 구현
    @Override
    public void prepare() throws Exception {
        num = new NumberForAdd(); //1단계 : form에서 넘오는 값들을 property가  같은 곳에다가(stack에서 온) 넣어준다.
    }

    //ModelDriven 인터페이스의 getModel 구현
    @Override
    public Object getModel() { //3단계 리턴
        return num;
    }

    //result.jsp 에서 sum 값을 참조시키기 위해
    public int getSum() {
       return sum;
    }

}

맨 위의 Interceptors가 내부적으로 돌아가는 그림 처럼 1, 2, 3 단계로 수행한다.

 interceptor1.xml 보기 : xml에서 적용될 때.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <package name="struts2" extends="struts-default">

<!-- 자신이 만든 interceptor는 action 밖에서 사용하고, 존재하는 interceptor의 사용은 action에서 사용한다 -->      
     <interceptors> <!-- 직접 만든 interceptor -->
        <interceptor name="mytimer" class="interceptor.Timer"/>
      </interceptors> 

      <action name="add" class="interceptor1.action.SumAction">
        <interceptor-ref name="mytimer"/> <!-- 제공되는 interceptor 들-->
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="params"/>
        <result>/result.jsp</result>
      </action>
   </package>
</struts>

자세한 내용은 소스 참조. 간단한 예제 포함.


Struts2 Interceptor 1.


+ Recent posts