拦截器的方法在xwork-2.0.4.jar
下面com.opensymphony.xwork2.interceptor的Interceptor.class
学习拦截器要注意struts2-core-2.0.11.jar下面的struts-default.xml
定义了拦截器和默认的拦截器占(defaultStack) <default-interceptor-ref name="defaultStack"/>
如果在一个action中手动引用了任意一个拦截器那么默认的拦截器就不能引用到action中你必须手动引用
如果在action中没有引用拦截器那么默认拦截器会自动引用
invoke()方法是如果还有下一个拦截器就调用下一个拦截器 如果没有就直接调用action()方法
拦截器的定义
<interceptors>
<interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
定义赋值<param name="hello">world</param>
</interceptor>
</interceptors>
拦截器的引用 一般都要手动引用默认的拦截器
<interceptor-ref name="myInterceptor">
使用动态赋值<param name="hello">test</param>
</interceptor-ref>
使用时动态赋值会覆盖定义时候的赋值
拦截器占的定义和引用 拦截器占由拦截器和拦截器占组成
在这个拦截器占中引用了myInterceptor拦截器和默认的拦截器占
<interceptor-stack name="myStack">
<!-- 拦截器的执行顺序:先配置的先执行 回来的时候是先配置的后执行
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor2"></interceptor-ref>
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
·························
·························
<interceptors>
<interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
<param name="hello">world</param>
</interceptor>
<interceptor name="myInterceptor2" class="com.test.interceptor.MyInterceptor2">
</interceptor>
<interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
</interceptor>
拦截器占的定义和引用 拦截器占由拦截器和拦截器占组成
:在这个拦截器占中引用了myInterceptor拦截器和默认的拦截器占
<interceptor-stack name="myStack">
<!-- 拦截器的执行顺序:先配置的先执行 回来的时候是先配置的后执行
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor2"></interceptor-ref>
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
把myStack定义为默认的拦截器
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="register" class="com.test.action.RegisterAction" method="test">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
<interceptor-ref name="myInterceptor3">
方法拦截器会有excludeMethods和includeMethods方法后者的优先级高于前者
<param name="excludeMethods">test,execute</param>
<param name="includeMethods">test</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
···········································
···········································
定义默认的拦截器 那么这个拦截器会引用到所有的action中
<default-interceptor-ref name="myStack"></default-interceptor-ref>
在多数情况下所有的拦截器都要继承Interceptor
public class MyInterceptor implements Interceptor
{
private String hello;
public String getHello()
{
return hello;
}
public void setHello(String hello)
{
this.hello = hello;
}
public void destroy()
{
System.out.println("destroy");
}
public void init()
{
System.out.println("init");
System.out.println(hello);
}
public String intercept(ActionInvocation invocation) throws Exception
{
System.out.println("intercept");
String result = invocation.invoke();
System.out.println("finish");
return result;
}
}
但有时也可以继承AbstractInterceptor这样就可以忽略init()和destroy()
public class MyInterceptor2 extends AbstractInterceptor
{
@Override
public String intercept(ActionInvocation invocation) throws Exception
{
System.out.println("intercept2");
String result = invocation.invoke();
System.out.println("finish2");
return result;
}
}
也有继承MethodFilterInterceptor方法过滤拦截器
public class MyInterceptor3 extends MethodFilterInterceptor
{
@Override
public void init()
{
System.out.println("init3");
}
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception
{
System.out.println("my interceptor3");
String result = invocation.invoke();
return result;
}
}
监听器一般都要实现PreResultListener
public class MyListener implements PreResultListener
{
public void beforeResult(ActionInvocation invocation, String resultCode)
{
System.out.println("result : " + resultCode);
}
}
监听器都是在完成execute()方法准备返回结果页面是调用
<global-results>
<result name="login" type="redirect">/login2.jsp</result>
</global-results>