36.拦截器中的注解

转自: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文档。

原文地址:https://www.cnblogs.com/sharpest/p/5587644.html