当前位置:文档之家› Struts2的拦截器总结

Struts2的拦截器总结

Struts2的拦截器总结
Struts2的拦截器总结

Struts2 中的拦截器和servelt 中的过滤器是非常的相似的。如果学过过滤器的话,肯定能够感觉的到,尽管有些微的不同。可是struts2的拦截器到底如何使用呢,为什么会有这些配置呢?接下来一一来看。

过滤器和拦截器是非常相似的,过滤器public interface Filter 接口里面有三个方法:

?init(FilterConfig filterConfig),

?destroy(),

?doFilter(ServletRequest request, ServletResponse response, FilterChain chain), 这里面的doFilter() 方法是最重要的,在struts2 中String intercept(ActionInvocation invocation)就相当于此方法。

如何完成一个拦截器呢?在struts2 中要实现一个接口这个接口是什么呢?在哪呢?,是否在哪听说过?是webwork 是我们以前听的最多的关于拦截器的框架,struts2 用了其中一个核心的东西,这个东西在是什么呢?是xwork 。恩,有了它才可以拦截,好了我们在哪找呢?在com.opensymphony.xwork2.interceptor 中找,里面有个Interceptor 这是个接口,里面也有三个方法,有init,destroy 和intercept 三个方法,而在struts2 里面的所有的拦截器都继承这个接口!

为了看这些是怎么实现的,加入了一些打印!

将上面的配置整合起来就是:

这样就可以让Aciton 被拦截了,到此,好了,可以运行程序了:

输出结果是:启动服务器init 被打出

运行后提交action 输出intercept

这个就是初步的一个拦截器。

=======

在此可能出现一个问题,是什么呢?如果就我们做的注册程序而言,可以想一下,有数据转换,有数据校验,以前当转换和校验不符合的时候,点击提交,会提示相关错误信息,然而,此时当转换和校验依然不符合要求时,点击提交,却不会提示错误信息,为什么呢?

====

当然你答对了,这些功能都包含在struts2的默认拦截器中,这里没执行是被添加的拦截器myinterceptor取代了。

为了查明原因可以查看一下struts2-core-2.xx.jar中的struts-default.xml 这个文件

这里定义的很多的东西,和我们的程序相关的非常紧密

首先这里有个

... 和struts.xml 里面的

...有什么关系呢?很明显可以猜到struts.xml 继承的就是struts-default.xml中的包struts-default。

这个里面还看到标签,这个是定义拦截器栈的,仔细看可以发现里面有个validation 如此可以猜想,validation 也是定义的一个拦截器,猜想当注册信息出错后没有提示信息呢?肯定是相关的验证功能没有执行,以前的执行了,现在没执行,

这样说明了,是现有的拦截器取代了原有的拦截器,这个是我仅能想到的!那么我们手工把原来的默认拦截器加入,这样可以吗?

答案是可以的!添加如下!

这也说明一个问题:如果我们没有添加拦截器的话,struts2会给我们添加默认拦截器为什么加这句话呢?是因为在package 中定义了

name="defaultStack"/> 这句话的意思是将defaultStack定义为默认的拦截器

为拦截器添加参数

这里我们可以通过配置文件,给拦截器添加一个参数,那这个在拦截器中怎么取得的呢?了解过滤器的朋友都知道,里面有个init(FilterConfig filterConfig)方法在这里可以取值,而在struts2中没有这么麻烦,做法吗,上面其实已经给出来了!

private String hello; get和set方法

写个变量,然后加上get和set方法,当然变量的名字必须和设定的参数是相同的,这个是赋值成功的前提条件

这下知道了吗,可是还有个问题,在定义的时候添加了参数hello,使用时同样添加了参数param,当运行MyInterceptor类时会输出哪个呢?world 还是zhuxinyu。

结果是:zhuxinyu 很明显,覆盖了第一个,这是什么原则:就近原则。形如OO 中的覆盖,重写。

好了,把这些零散的东西搞完了,真的开始解决更多的知识!

拦截器栈,在struts2里面,其实是把拦截器和拦截器栈一样的对待。可以把拦截器栈当作一个拦截器看待,同样的引用。

现在定义一个拦截器栈把!

看见了没,一个引用第一次定义的myinterceptor拦截器,一个引用默认的拦截器,怎么引用呢,和开始的一个样,呵呵!

呵呵,这样看是不是比刚才简单呢?把两次引用换成一次!运行结果呢?和上次一样,而且都成功!

当然我们也可以自己定义一个默认的拦截器,这样在程序中怎么做呢?呵呵,定义如下Xml代码

这里引用的就是上面的mystack拦截器,这样在程序中如果不在action中加入拦截器,它同样可以执行相应的工作,

前面已经说过了,如果不加入任何拦截器的引用,它将把默认的拦截器加入。

拦截器栈

过滤器可以组成过滤器链,就是可以有多个过滤器来去过滤一个组件,拦截器也是,只不过是叫拦截器栈(相当于拦截器链)。

拦截器栈先把拦截器逐个执行,接着执行action方法,之后又按照相反的顺序回到最后的一个拦截器,再回到视图。

这里面看见了栈是什么样的结构,是由很多个预先定义好的拦截器构成,而且也可以再加上拦截器栈组成,就如此就组成了!

AbstractInterceptor 拦截器

我们在做拦截器的时候,刚才实现了Interceptor接口,里面有三个方法,但是一般的情况下init() 和destroy() 方法我们用不上,最关心的就是intercept(ActionInvocation invoker){}方法,所以怎么办呢?其实,struts2给我们提供了一个简化的拦截器类:AbstractInterceptor

AbstractInterceptor 这是一个抽象的类,里面实现了init() 和destroy() 方法,所以只要我们继承这个类,就不用再多写这两个方法!

如此一来写的更加少了,其它的配置方法不变。

在配置顺序也是一二,结果会输出什么呢?

intercept1 intercept2 finish2 finish1 这里执行拦截器的过程是正着来的,回来的时候是反着的。就像你要进一个很多门的房间一样。进去一个,开一个门,为了让自己能回来的方便一些,这个打开的门就不要关着了,当你把所有的门进去了后,然后回来,再逐个关门。这样的过程就像是这个拦截器执行的过程。

includeMethods 包含execute,test这两个方法,结果执行了这个拦截器,如果改成excludeMethods ,就不会执行了,也可以再加下面的一个参数

execute,test

不排除execute,test这两个方法可是又加入又排除到底执行吗?答案是执行的,必定结果是最能说明问题的!呵呵!

SCME_STRUTS2试卷

--------------------------------------装--------------------------------------订------------------------------线---------------------------------------- **学院课程考试试卷 课程名称:《使用Struts2开发基于MVC设计模式的企业级应用》(A)卷 年级:班级: 姓名:_______________ 学号:_________________ 考试(考查) 闭卷 选择题(每题2分,共计100分) 1.在控制器类中一般需要添加相应属性的( A )和(C )。(选两项) A.setter方法 B.as方法 C.getter方法 D.is方法 2.业务控制器需要在( B )配置文件中进行配置 A.web.xml B.struts.xml C.struts2.xml D.webwork.xml 3.不属于Struts 2表单标签库的是( D )。 A. B. C. D.