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;
}