转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html
AnnotationWorkflowInterceptor:Invokes any annotated methods on the action。意思是此拦截器可以调用在Action中任何有注解的方法。下面我们来演示它的使用,具体步骤如下:
步骤一,建立struts2annotationInt项目,并建立LoginAction类,代码如下:
package com.asm;
...省略导入的包
public class LoginAction extends ActionSupport {
private String username;
@Before
public String myBefore() {
System.out.println("调用myBefore方法");
return LOGIN;
}
@After
public void myAfter() throws InterruptedException {
Thread.sleep(5000);
System.out.println("----调用myAfter方法");
}
@BeforeResult
public void myBeforeResult() {
System.out.println("----调用myBeforeResult方法");
}
public String execute() throws Exception {
System.out.println("调用execute方法");
return SUCCESS;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("---调用set方法" + username);
this.username = username;
}
}
说明:要想使用方法成为被拦截器监视的注解方法,只需在方法关加上@...这样的形式并导入相关的类即可。
步骤二,编写相关的jsp及配置该Action,主要配置内容如下:
<struts>
<package name="ano" extends="struts-default">
<interceptors>
<interceptor name="anno" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor">
</interceptor>
<interceptor-stack name="annoStack">
<interceptor-ref name="anno"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="login" class="com.asm.LoginAction">
<result name="success">/success.jsp</result>
<result name="login">/login.jsp</result>
<interceptor-ref name="annoStack"></interceptor-ref>
</action>
</package>
</struts>
结合配置说明:当我们为LoginAction配置了AnnotationWorkflowInterceptor拦截器时,LoginAction中的所有注解方法才真正生效。下面重点是来讨论这些方法的执行顺序及作用。
加@Before注解的方法:will be invoked
before the action method. If the returned value is not null, it is returned as
the action result code。意思是在action的execute方法执行之前被调用,但是此方法如果返回不为空的话,它的返回结果将是真正的返回结果,比如这里我们return LOGIN,这样无论以什么用户名登录,它总会返回到login
result(这里为login.jsp页面) 。但是从执前结果来看,在返回前仍执行了标记为@BeforeResult的方法:will be invoked
after the action method but before the result execution。意思是在返回结果集前调用此方法。下面我们把public String
myBefore()方法中的return LOGIN注释掉,并让修改此方法的返回类型为void。随后登录测试(注意要重新部署当前项目),可以发现执行结果如下:
调用myBefore方法
---调用set方法
调用execute方法
----调用myBeforeResult方法
----调用myAfter方法
从执行的顺序来看,标记为@After的方法最后执行,并且可以发现:它会延时5秒执行,但是在延时执行时,浏览器并没有成功跳到success.jsp页面,而是在5秒后,控制台打印出myArter方法中的内容同步跳转到success.jsp页面。@After :will be invoked after the action method and result execution。意为在execute方法执行并且返回结果后此方法被调用。但是从测试来看,标记为@After的方法是会影响到结果的返回(延时返回)。 强调:注意方法的执行顺序,相关的内容可以参看AnnotationWorkflowInterceptor类的api文档。