zoukankan      html  css  js  c++  java
  • 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文档。

  • 相关阅读:
    .vsdx 在线查看 省的安装 visio 2013了
    桌面整理工具 rolan
    第一节、ES6的开发环境搭建
    $("[lay-id='"+this.id+"']")
    mathAge.call(btn) 函数call 改变函数内 this #js
    viewer && ImageFlow 图片滚动组件 图片点击放大 可以滚轮放大缩小 viewer
    ie11 突然不能加载外部css 很神奇 头部改为 <!DOCTYPE> <html>
    CODE[VS] 1219 骑士游历
    CODE[VS] 1169 传纸条
    CODE[VS] 1010 过河卒
  • 原文地址:https://www.cnblogs.com/sharpest/p/5587644.html
Copyright © 2011-2022 走看看