Struts2.0之类输入校验篇之七(拦截器配置)

来源:互联网 发布:大数据的建模分析 编辑:程序博客网 时间:2024/06/11 02:02

拦截器是Struts2 的核心.
相当与一个容器,配置大量拦截器.
[注意:]其实为了让软件系统有更大的灵活性,把组件直接的关系放到XML配置文件里面,
       可以把这个配置文件想象为脚本,脚本有很大的灵活性,
       组件+脚本=灵活的软件系统
自己实现一个Struts2的拦截器:
拦截器是用来拦截Action的.
com.opensymphony.xwork2.interceptor
查看Intercepter接口,
那三个方法.是不是和Filter类似.
public interface Interceptor extends Serializable
{
     void destroy();
     void init();
     String intercept(ActionInvocation invocation) throws Exception;
}
实现的方法和Filter也基本类似,[注意:]Filter的使用可以看孙鑫的那个Servlet/Jsp深入详解.
调用那个invoke方法,相当于Fielter的dochain
执行拦截器链的下一个拦截器
看到那个intercetpt方法的返回值是一个String,这个和Action的execute方法返回是一致的.
就是那些SUCCESS,INPUT...
如果返回了,拦截器九不会向下执行了.
拦截器需要实现一个Intercepter接口
然后在sttuts.xml里面配置拦截器.
拦截器配置到某一个Action下面.
<intercepters>...
定义好了,后将拦截器加到某一个Action里面.
重新启动,运行,看到控制台,拦截生效了,
但是现在问题又出来了,以前的那些验证的拦截器又不起作用了.
怎么回事情啦?
还是看看struts2-core-2.0.11.2.Jar包里面,看那个struts-default.xml
我们自己的那个struts.xml里面的package就是extends="struts-default.xml"
也就是说struts的配置文件是可以继承使用的.
现在看那个struts-default.xml,里面的<interceptors>
里面哪么多的拦截器,是struts2提供给使用的.
比如说:
jsp的Form里面的field自动注入到Action的属性,
以及那些属性可以弄到Jsp,都是那些拦截器实现的.
//实现将参数注入到Action的属性里面.
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
//实现防止表单重复提交
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
//实现验证,就是数据类型,比如说Age输入了abc.
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
            
还有很多有用的,具体可以查看API.或源代码.
再往下面看:
             <!-- Basic stack -->
             <interceptor-stack name="basicStack">
                 <interceptor-ref name="exception"/>
                 <interceptor-ref name="servletConfig"/>
                 <interceptor-ref name="prepare"/>
                 <interceptor-ref name="checkbox"/>
                 <interceptor-ref name="params"/>
                 <interceptor-ref name="conversionError"/>
             </interceptor-stack>
             <!-- Sample validation and workflow stack -->
             <interceptor-stack name="validationWorkflowStack">
                 <interceptor-ref name="basicStack"/>
                 <interceptor-ref name="validation"/>
                 <interceptor-ref name="workflow"/>
             </interceptor-stack>
......
这儿就是拦截器栈,可以将多个拦截器组成栈,栈里面还可以加入栈,
哇卡,天才的设计啊!!
再往下面看
<default-interceptor-ref name="defaultStack"/>
表示,这个defaultStack作为 当前Package的拦截器.
哪么我们的"struts" Package是Extends 那个"struts-dfault"   Package
所以它的默认拦截器栈也就是那个defaultStack了
这儿要注意一点的就是,如果你自己在action里面声明了一个拦截器,
哪么默认拦截器九不起作用了.
这儿九必须再手动的加入defaultStack到那个action下面
<interceptor-ref name="defaultStack"></interceptor-ref>
这样九可以了.
<interceptor>那儿还可以设置param,强哈
用来注入值到拦截器的属性,嘿嘿,IoC真的很神奇哈.
居然还可以在<interceptor-ref>那儿用param.
表示在使用的时候注入属性.
自己定义拦截器栈,把defaultStack和刚才自己定义的加到一起.
可以在自己的struts.xml里面写下面的
<default-interceptor-ref name="myStack"/>
就相当于覆盖了 struts-default.xml.
和子类覆盖父类的方法一样的感觉.
自定义Intercepter的时候,如果直接去实现Intercepter的话,
必须去实现init()和destory(),
在很多时候,不需要去实现那个init和destory(),
所以,可以去继承AbstractIntercetpor,那个类已经空实现了init和destory(),
当然你也可以自己去定义一个抽象类空实现那两个方法.

方法过滤拦截器,这个拦截器具有指定那些方法拦截,那些不拦截的功能.
这个是细粒度的拦截器.
新建一个intercepter,extends 那个   MethodFilterInterceptor
重写doIntercept方法.
然后把这个拦截器在Struts.xml里面配好.
<param name = "includeMethods">方法名</param> 那儿设置需要拦截的方法,和不拦截的方法.
方法名那儿可以写: 方法1,方法2,
貌视可以用*,Spring也是这样搞的.
排除的拦截器就写="excludeMethods" 就可以啦..
[注意:]如果你把一个方法既然写到includeMethods,又写道excludeMethods
       实际上还是要拦截得,说明includeMethods比excludeMethods优先级高

原创粉丝点击