Struts2拦截器原理



Struts2拦截器原理

Struts2拦截器原理

(2012-12-19 23:44:00)

标签:

it

Struts2拦截器原理

package com.kero99.wp.struts;

public class ActionProxy {

      public static void main(String[] args) {

           ActionInvocation invocation=new DefaultActionInvocation();

           invocation.invoke();

      }

}

ActionProxy 用于模拟程序的入口

 

package com.kero99.wp.struts;

public interface ActionInvocation {

      public String invoke();

}

ActionInvocation规定Invocation类应具备的方法

 

package com.kero99.wp.struts;

public interface Interceptor {

      public String interceptor(ActionInvocation invocation);

}

Interceptor接口规定了拦截器应具备的方法

 

package com.kero99.wp.users;

import com.kero99.wp.struts.ActionInvocation;

import com.kero99.wp.struts.Interceptor;

public class SQInterceptor implements Interceptor{

      public String interceptor(ActionInvocation invocation) {

           System.out.println(“SQ  before”);

           String result=invocation.invoke();

           System.out.println(“SQ  after”);

           return result;

      }

}

package com.kero99.wp.users;

import com.kero99.wp.struts.ActionInvocation;

import com.kero99.wp.struts.Interceptor;

public class ZJKInterceptor implements Interceptor{

      public String interceptor(ActionInvocation invocation) {

           System.out.println(“ZJK before”);

           String result=invocation.invoke();


           System.out.println(“ZJK after”);

           return result;

      }

}

按照接口Interceptor规范,制作的两个事例实现类。并在方法内调用方法invoke();

 

package com.kero99.wp.users;

public class UsersAction {

      public String login(){

           System.out.println(“UsersActionlogin方法“);

           return “success”;

      }

}

制作UsersAction类。

 

package com.kero99.wp.struts;

import java.util.ArrayList;

import java.util.List;

import com.kero99.wp.users.SQInterceptor;

import com.kero99.wp.users.UsersAction;

import com.kero99.wp.users.ZJKInterceptor;

public class DefaultActionInvocation implements ActionInvocation{

      private UsersAction action;

      private List interceptors;

      private int index=0;

      private String result=null;

      public DefaultActionInvocation() {

           action=new UsersAction();

           interceptors=new ArrayList();

           interceptors.add(new SQInterceptor());

           interceptors.add(new ZJKInterceptor());

      }

      public String invoke() {

           if(index

                 interceptors.get(index++).interceptor(this);

           }else{

                 result=action.login();

           }

           return result;

      }

}

构造函数中创建所有连接器对象和Action对象,每次调用invoke执行拦截容器中一个连接器。每次连接器中的interceptor方法被调用时会继续调用invoke方法,这样每一个拦截器的调用invoke方法之前的代码全部都会依次执行完成后,执行action的对应方法。Invoke方法执行完成回到调用处,每一个连接器的interceptor方法中调用invoke方法之后的代码才会逆序执行。