struts2拦截器

拦截器是struts2的一个功能,在访问Action的时候会调用struts2的拦截器(如果存在的话)。拦截器既可以作用于Action的前面,将传递的参数修改;也可以作用于Action的后面,将返回的结果转换。他是AOP(面向切面编程)的一种实现。

要实现拦截器,有三种方式:

实现Intercept接口(com.opensymphony.xwork2.interceptor.Interceptor

实现AbstractInterceptor抽象类(com.opensymphony.xwork2.interceptor.AbstractInterceptor)

实现MethodFilterInterceptor抽象类(com.opensymphony.xwork2.interceptor.MethodFilterInterceptor)。

Interceptor有以下方法必须实现:


public class AInterceptor implements Interceptor{
 public void init(){}
 public void destroy(){}
 public String intercept(ActionInvocation invocation) throws Exception{
  return invocation.invoke()
 }
}

init方法在拦截器初始化的时候执行

AbstractInterceptor和MethodFilterInterceptor是Interceptor的一个模板,简化了Interceptor的实现。

其中AbstracetInterceptor已经实现了init(),destroy方法。而MethodFilterInterceptor则多了includeMethodsexcludeMethods两个属性,includeMethods决定哪些方法需要拦截,exceludeMethods决定哪些方法不需要拦截。

-----------------------------------------------------例子---------------------------------------------------

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import java.util.Map;

public class HeheInterceptor implements Interceptor {
    public void init(){
        System.out.println("this is init !");
    }

    public void destroy(){
        System.out.println("this is destroy !");
    }

    public String intercept(ActionInvocation invocation) throws Exception{
        try{
            Thread.sleep(10000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        Map session = invocation.getInvocationContext().getSession();
        Operator operator = (Operator)session.get("cms_operator");
        System.out.println("hello the user's name is "+operator.getLoginName());
        System.out.println("hello the user's password is "+operator.getPassword());
        operator.setLoginName("hehe");
        return invocation.invoke();
    }
}
在以上代码中实现步骤是这样的:


1.初始化的时候会执行init方法

2.被拦截时进入interceptor方法

3.“沉睡”10秒钟

4.将一个账号的名字修改

5.让action继续执行

6.当该对象被回收时执行destory方法

struts的配置文件可以这样写:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
	<package name="default" extends="struts-default">
	<interceptors>
            <interceptor name="hehe" class="moretv.cms.interceptor.HeheInterceptor"/>
            <interceptor-stack name="default">
			<interceptor-ref name="hehe" />
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="default" />
	</package>
	<package name="user" extends="default"  namespace="/">
	  <action name = "login" class="AAction" method="login">
          <result name="error">/WEB-INF/jsp/login.jsp</result>
          <result name="success">/WEB-INF/jsp/main.jsp</result>
         </action>
	</package>
</struts>



也可以这样写:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
	<package name="default" extends="struts-default">
	<interceptors>
            <interceptor name="hehe" class="moretv.cms.interceptor.HeheInterceptor"/>
		</interceptors>
	</package>
	<package name="user" extends="default"  namespace="/">
	  <action name = "login" class="AAction" method="login">
            <interceptor-ref name="hehe" />
          <result name="error">/WEB-INF/jsp/login.jsp</result>
          <result name="success">/WEB-INF/jsp/main.jsp</result>
         </action>
	</package>
</struts>

第一种方法所有继承了default的package下的action都会被hehe拦截器拦截

第二种方法则可以在需要的时候被拦截









你可能感兴趣的:(struts2,拦截器)