为什么用拦截器?
Struts是基于mvc模式的开发框架。任何框架,都会预先实现一部分功能。struts框架自带功能的实现,是通过一个个拦截器完成的。
Struts早起版本中,核心功能是通过一个类完成的,这个类叫做核心过滤器。
Struts2.0之后的版本,每一个拦截功能,都由一个单独的类实现,形成一个独立的拦截器,用户可以自由组合这些拦截器来完成自己想要的功能。
有了拦截器,我们的开发就类似于组装电脑配件。带来的好处:解耦。
拦截器简介:
Struts2预定义了一些拦截器,实现了某些功能,如文件上传等,默认的拦截器在struts-default.xml文件中配置。
如果使用struts2的相应功能,可以一个个引用拦截器! 也可以定义拦截器栈,包含多个拦截器!开发中就直接使用拦截器栈即可!
struts2定义了默认执行的拦截器栈!
拦截器可以对action请求进行拦截, 从而执行一些预处理操作,预处理操作完成后,控制权进入到action!
action处理请求完成,又回到拦截器!
注意:
如果struts自带的拦截器完成不了需要,用户也可以自定义拦截器!
如果用户自定义了拦截器,并使用,struts2默认的拦截器就不会调用!
自定义拦截器的时候,要引用默认的拦截器!(defaultStack)
<interceptors>
// 拦截器定义
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用。
// 拦截器栈定义 (包含多个拦截器)
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
</interceptor>
// 执行拦截器
<default-interceptor-ref name="defaultStack"/>
</interceptors>
拦截器与过滤器区别
共同点:都可以对请求进行拦截! 处理一些公用的操作!
区别:
1.作用范围
拦截器是struts2的概念!(只在struts中用)
过滤器是servlet中技术!(在servlet/struts中都可以使用!)
2. 拦截区域
拦截器,拦截的是action中方法的执行!
过滤器,可以拦截任何请求!
Struts2自定义拦截器实现
1、定义一个类实现Interceptor接口
2、实现生命周期方法
3、声明和引用自定义拦截器
Interceptor接口
com.opensymphony.xwork2.interceptor.Interceptor
所有的自定义拦截器都需要实现该接口,且以单例运行。
init: 创建后初始化时被调用, 它在拦截器的生命周期内只被调用一次。
interecept: 每拦截一个动作请求, 该方法就会被调用一次。
destroy: 拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次.
Struts2自带的拦截器