拦截器是Struts2的核心所在。当须要扩展Struts2的功能时,只须要提供相应的拦截器,并将它配置在Struts容器中便可。反之,若是不须要某个功能,也只须要取消该拦截器便可。
java
定义拦截器使用<interceptor…/>元素。其格式为:程序员
<interceptor name="拦截器名" class="拦截器实现类"></interceptor>
只要在<interceptor..>与</interceptor>之间配置<param…/>子元素便可传入相应的参数。其格式以下:
apache
<interceptor name="myInterceptor" class="org.tool.MyInterceptor"> <param name="参数名">参数值</param> ... </interceptor>
一般状况下,一个Action要配置不只一个拦截器,每每多个拦截器一块儿使用来进行过滤。这时就会把须要配置的几个拦截器组成一个拦截器栈。定义拦截器栈用<interceptor-stack name="拦截器栈名"/>元素,因为拦截器栈是由各拦截器组合而成的,因此须要在该元素下面配置<interceptor-ref …/>子元素来对拦截器进行引用。其格式以下:jsp
<interceptor-stack name="拦截器栈名"> <interceptor-ref name="拦截器一"></interceptor-ref> <interceptor-ref name="拦截器二"></interceptor-ref> <interceptor-ref name="拦截器三"></interceptor-ref> </interceptor-stack>
注意:在配置拦截器栈时用到的拦截器必须是已经配置好的拦截器。拦截器栈也能够引用拦截器栈。 spa
若是为包指定了某个拦截器,则该拦截器会对每一个Action起做用,可是若是显式地为某个Action配置了拦截器,则默认的拦截器将不会起做用。默认拦截器用<default-interceptor-ref name=""/>元素来定义。每一个包只能指定一个默认的拦截器,若是须要指定多个拦截器共同做为默认拦截器,则应该将这些拦截器定义成拦截器栈,而后把这个拦截器栈配置为默认的拦截器便可。.net
下面是默认拦截器的配置方法:code
<package name="包名"> <interceptors> <interceptor name="拦截器一" class="拦截器实现类"></interceptor> <interceptor name="拦截器二" class="拦截器实现类"></interceptor> <interceptor-stack name="拦截器栈名"> <interceptor-ref name="拦截器一"></interceptor-ref> <interceptor-ref name="拦截器二"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="拦截器名或拦截器栈名"></default-interceptor-ref> </package>
Struts 2提供了一些接口或类供程序员自定义拦截器。如Struts 2提供了com.opensymphony.xwork2.interceptor.Interceptor接口,程序员只要实现该接口就可完成拦截器实现类。该接口的代码以下:xml
import java.io.Serializable; import com.opensymphony.xwork2.ActionInvocation; public interface Interceptor extends Serializable{ void init(); String intercept(ActionInvocation invocation) throws Exception; void destroy(); }
该接口中有三个方法:对象
init():该方法在拦截器被实例化以后、拦截器执行以前调用。blog
intercept(ActionInvocation invocation):该方法用于实现拦截的动做。该参数调用其invoke方法,将控制权交给下一个拦截器,或者交给Action类的方法。
destroy():该方法与init()方法对应,拦截器实例被销毁以前调用,用于销毁在init()方法中打开的资源。
Struts 2提供了AbstractInterceptor类,该类提供了init()方法和destory()方法的空实现。在通常的拦截器实现中,都会继承该类,由于通常实现的拦截器是不须要打开资源的,故无需实现这两个方法,继承该类会更简洁。
下面来配置拦截器,若是输入框中输入的内容是“hello”,返回当前页面。实现该功能只须要在原项目的基础上配置拦截器便可。首先编写拦截器实现类,代码以下:
package org.tool; import org.action.StrutsAction; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor{ public String intercept(ActionInvocation arg0) throws Exception { // 获得StrutsAction类对象 StrutsAction action=(StrutsAction)arg0.getAction(); // 若是Action类中的name属性的值为"hello",返回错误页面 if(action.getName().equals("hello")){ return Action.ERROR; } // 继续执行其余拦截器或Action类中的方法 return arg0.invoke(); } }
在struts.xml配置文件中进行拦截器配置,修改后的代码以下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="org.tool.MyInterceptor"></interceptor> </interceptors> <default-interceptor-ref name=""></default-interceptor-ref> <action name="struts" class="org.action.StrutsAction"> <result name="success">/welcome.jsp</result> <result name="error">/hello.jsp</result> <result name="input">/hello.jsp</result> <!--拦截配置在result后面 --> <!--使用系统默认拦截器栈 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!--配置拦截器 --> <interceptor-ref name="myInterceptor"></interceptor-ref> </action> </package> </struts>
备注
改为 "http://struts.apache.org/dtds/struts-2.1.dtd"就能够了,缘由未知。
通过这样简单的配置后,从新部署项目,在运行界面输入“hello”,也会通过拦截返回到当前页面,如图3.十一、图3.12所示。
图3.11 运行界面
图3.12 提交后返回当前页面