struts2攔截器

攔截器是struts2的一個功能,在訪問Action的時候會調用struts2的攔截器(若是存在的話)。攔截器既能夠做用於Action的前面,將傳遞的參數修改;也能夠做用於Action的後面,將返回的結果轉換。他是AOP(面向切面編程)的一種實現。 java

要實現攔截器,有三種方式: 編程

實現Intercept接口(com.opensymphony.xwork2.interceptor.Interceptorsession

實現AbstractInterceptor抽象類(com.opensymphony.xwork2.interceptor.AbstractInterceptor) jsp

實現MethodFilterInterceptor抽象類(com.opensymphony.xwork2.interceptor.MethodFilterInterceptor)。 this

Interceptor有如下方法必須實現: spa


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

init方法在攔截器初始化的時候執行 excel

AbstractInterceptor和MethodFilterInterceptor是Interceptor的一個模板,簡化了Interceptor的實現。 code

其中AbstracetInterceptor已經實現了init(),destroy方法。而MethodFilterInterceptor則多了includeMethodsexcludeMethods兩個屬性,includeMethods決定哪些方法須要攔截,exceludeMethods決定哪些方法不須要攔截。 xml

-----------------------------------------------------例子--------------------------------------------------- 對象

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攔截器攔截

第二種方法則能夠在須要的時候被攔截

相關文章
相關標籤/搜索