最近在计划做一个家庭网站,其中会用到框架的架构,就对struts2重新复习了一遍,以前对struts的学习停留在照着书写的层面。发现很多东西还是很模糊。最近就又碰到了拦截器的使用。作为一个学习的笔记。
相信每个一开始学习struts2的都会看到这句话,struts2和struts1的关系不大,确实,struts2是apache旗下的一个基金会结合一个成熟的框架webwork和struts1而开发出来的。其核心其实是webwork,就我所知,拦截器这部分是webwork的xwork部分来实现的。学过servlet的人知道里面有一个过滤器,拦截器和它的原理是差不多。最重要的方法分别是servlet中的doFilter方法和interceptor中的intercept方法 。拦截器的执行代码就写在这个方法中。
拦截器struts.xml文件中的配置如下:(这部分属于步骤,记住就行了)
- <struts>
- <package name="struts2" extends="struts-default">
- <interceptors>
- <interceptor name="xiaoze" class="你的拦截器类的路径">
- <param name="hello">interceptor</param>
- </interceptor>
- </interceptors>
- </package>
- <struts>
- <action name="register" class="com.test.action.RegisterAction" >
- <result name="input"></result>
- <result name="success"></result>
- <interceptor-ref name="xiaoze"></interceptor-ref>
- </action>
之后可以对自己定义的拦截器进行验证。
可能会遇到一个问题,原来没有自定义拦截器的时候,struts2框架其实是会给action中添加默认的拦截器的,包括基本的验证以及错误信息提示等。当添加了我们自定义的拦截器时,就不会添加那个默认的拦截器了。我们当然可以手动的进行默认拦截器的添加。加入下面一行代码:
<interceptor-ref name="defaultStack"></interceptor-ref>即可。
下面是关于拦截器栈的知识了,
我们可以把拦截器栈当作是一个包含拦截器的容器,在执行的时候会按顺序执行拦截器。具体的代码如下:
<interceptor-stack>
<interceptor name="" class=""></interceptor>
<interceptor name="" class=""></interceptor>
<interceptor name="" class=""></interceptor>
</interceptor-stack>
在编写自定义的拦截器的时候,有两个可以实现的接口和类分别是interceptor接口和abstractinterceptor抽象类。第二个抽象类默认实现了init和destroy方法。所以,为了简化代码,可以实现该抽象类,只用实现doIntercept方法就可以了。
最后需要说到的一点是:拦截器的执行机制是在action方法执行之前执行一次,action方法执行之后还要执行一次。可以比喻成开了灯拿完东西后还是要关灯的。