페이지

2015. 2. 25.

[struts2] 인터셉터 만들기

interface를 구현 받아서 만들수 있다.

public class HelloInterceptor implements Interceptor{
    public void destroy() {
        //서버가 종료될때 동작
        //별로 필요 없음
    }
    public void init() {
        //최초 호출될때 1번
        //서블릿과 다른점은 서버를 재실행 하면 바로 실행이 됨
    }
    public String intercept(ActionInvocation arg0) throws Exception {
        //이후 여기서만 동작함
        //서블릿의 서비스와 같은 개념
        return null;
    }
}





[HelloInterceptor.java]
public class HelloInterceptor implements Interceptor{
    public void destroy() {
    }
    public void init() {
        System.out.println("init");
    }
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("interceptor");
        return null;
    }
}

이후 인터셉터를 설정해야 한다.

[struts.xml]
<struts>
    <package name="test" extends="struts-default">
        <interceptors>
            <interceptor name="hello" class="test.interceptor.HelloInterceptor" />       
        </interceptors>
       
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="hello" />
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


저장하고 서버를 재실행하면 콘솔창에서 init이 출력되는 것을 볼 수 있다.
서버가 재실행될떄 init메서드가 호출되기 때문


[콘솔 내용]
2월 25, 2015 4:06:16 오후 org.apache.struts2.config.Settings getLocale
경고: Settings: Could not parse struts.locale setting, substituting default VM locale
init
2월 25, 2015 4:06:17 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...








http://localhost:8080/struts/hello2.action를 요청하면
interceptor이 출력되는 것을 확인 할 수 있다.





현재까지는 controll  -  interceptor  -  action 모델에서
interceptor에서 action으로 가지 않음..
(execute가 출력되는지 확인해 보면됨)


이제 intercept에서 매개변수를 보내는 과정을 진행하자

[HelloInterceptor.java]
public String intercept(ActionInvocation arg0) throws Exception {
    System.out.println("interceptor");
    return arg0.invoke();
}



서버 재실행후 콘솔을 확인하면 execute가 출력되는 것을 확인 할 수 있음

[콘솔 내용]
2월 25, 2015 4:14:38 오후 org.apache.struts2.config.Settings getLocale
경고: Settings: Could not parse struts.locale setting, substituting default VM locale
init
2월 25, 2015 4:14:38 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...
interceptor
execute




즉, invoke()메서드는 execute()메서드를 호출하는 역할임

따라서 controller와 action사이를 연결을 돕도록하는 것이 invoke메서드이다.







갈때를 전 인터셉터
올때를 후 인터셉터 라고 하자.

[HelloInterceptor.java]public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("전 interceptor");
        String result = arg0.invoke();
        System.out.println("후 interceptor");
        return result;
    }

[콘솔 내용]
init
2월 25, 2015 4:20:00 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...
전 interceptor
execute
후 interceptor


즉, 전 interceptor를 거친후 execute를 실행하고 돌아오면서 후 interceptor를 거치게 된다.




기존의 interceptor들은 대부분 전인터셉터만 존재한다.


컨트롤러가 엑션에 보내려는 매개변수를 인터셉터가 모두 가로챈다.

이것은 ActionInvocation arg0에는 어느 액션으로 가는 것인지 목적지가 들어있다.

즉, HelloWorld에 모든 정보를 가로챈것!!


[HelloInterceptor.java]public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("intercept Action : " + arg0.getAction());
        String result = arg0.invoke();
        return result;
    }


init
2월 25, 2015 4:26:42 오후 com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory <clinit>
정보: Setting DefaultObjectTypeDeterminer as default ...
intercept Action : test.action.HelloWorld@74ad4e7f
execute

즉, test.action.HelloWorld@74ad4e7f 이곳으로 보내려고 했던 것임




[HelloWorld.java]를 수정하고 인터셉터에서 add메서드를 불러보자

[HelloWorld.java]
public class HelloWorld {
    private int x = 0;
    public String execute(){
        System.out.println("execute x = " + x);
        return "success";
    }
    public void add(int x){
        this.x = x;
    }

}

[HelloInterceptor.java]
public String intercept(ActionInvocation arg0) throws Exception {
        HelloWorld hw = (HelloWorld)arg0.getAction();
       hw.add(1000);

        String result = arg0.invoke();
        return result;
    }