Struts2框架使用(五)之关于Struts2的拦截器和拦截器栈

Struts2 拦截器是在访问某个 Action 或 Action 的某个方法,字段之前或之后实施拦截,并且 Struts2 拦截器是可
插拔的,拦截器是AOP的一种实现.
优点:通用功能的封装,提供了可重用性;

Struts2 拦截器原理:
Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截。在请求Struts2的Action时,Struts2会查找配置文件,并根据配置文件实例化相应的拦截器对象。

注意,这里的拦截器栈,执行顺序与栈相同。

那么如何要创建一个拦截器呢?

创建一个类,然后实现Interceptor接口。如下:

package com.mrlv.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("MyInterceptor销毁");
        
    }

    @Override
    public void init() {
        System.out.println("MyInterceptor初始化");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("执行Action之前");
        String result = invocation.invoke();
        System.out.println(result);
        System.out.println("执行Action之后");
        return result;
    }
}
invocation.invoke()方法,是执行Action。result则是执行后的返回结果。
编写好拦截器类后需要在struts.xml配置
<package name="manage" namespace="/" extends="struts-default">
    <interceptors>
         <!-- 配置拦截器 -->
        <interceptor name="myInterceptor" class="com.mrlv.interceptor.MyInterceptor"></interceptor>
    </interceptors>
</package>

调用的时候,我们可以把编写好的拦截器放在一个位,后面需要携带一个默认的拦截器defaultStack。

      <action name="hello" class="com.mrlv.action.HelloAction">
          <result name="success">success.jsp</result>
          <!-- 注意,这里的拦截器调用有顺序之分 -->
          <interceptor-ref name="myInterceptor"></interceptor-ref>
          <interceptor-ref name="defaultStack"></interceptor-ref>
      </action>

关于拦截器栈,拦截器栈的定义。

  <interceptors>
         <!-- 配置拦截器 -->
        <interceptor name="myInterceptor" class="com.mrlv.interceptor.MyInterceptor"></interceptor>
        <interceptor name="loginInterceptor" class="com.mrlv.interceptor.LoginInterceptor"></interceptor>
        
        <!-- 配置拦截器栈 -->
        <interceptor-stack name="myStack">
            <interceptor-ref name="loginInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack>
    </interceptors>

 

拦截器以及拦截器栈皆可以用于局部或全局。
如果想将其用于全局,只需要在package内配置。
<!-- 注意:一旦在package内配置了拦截器栈,那么该package内所有的action都将使用该拦截器栈,
          如果某action想要不使用,需要在action内配置
              <interceptor-ref name="defaultStack"></interceptor-ref>
           -->
      <default-interceptor-ref name="myStack"></default-interceptor-ref>

 

 如果想要实现拦截某方法,有两种方法:这里的includeMethods是设置拦截的方法。excludeMethods是能通过的方法。

1.
<interceptors>
    <!--方法拦截器配置-->
    <interceptor name="myInterceptor" class="com.mrlv.interceptor.MyInterceptor">
    <!--配置参数 :拦截什么方法-->
    <!--includeMethods控制能访问哪些-->
    <param name="includeMethods">add,delete</param>
    <!--excludeMethods控制能访问哪些-->
    <param name="excludeMethods">update</param>
</interceptors>

 2.

<action name="hello" class="com.mrlv.action.HelloAction">  
     <result name="success">  
        hello.jsp
     </result>  
              
     <interceptor-ref name="myInterceptor">    
        <param name="includeMethods">myExecute</param>  
        <param name="excludeMethods">execute</param><!--对myExecute进行拦截,对execute不拦截-->  
     </interceptor-ref>           
</action>  

 

 以上便是一些拦截器的应用。

posted @ 2017-12-19 13:59  糸色望  阅读(1065)  评论(0编辑  收藏  举报