Struts2的拦截器机制:
Struts2的拦截器机制:
1:拦截器是struts2中一个重要的组成部分,可以吧struts2比喻成一个大的空容器,大量的拦截器完成了该框架的大部分操作,例如param拦截器负责解析http请求的参数,并设置action的属性,servlet—config 拦截器直接将http请求中的HttpServletRequest 实例和HttpServletResponse 实例;fileUpload拦截器直接负责解析参数中的文件域,并将一个文件域设置成action的3个属性
2:struts2中的拦截器是一个可拔插的设计,只需将需要使用的拦截器配置文件中简单配置就可以了
拦截器在struts2中的作用:
1:对于任何的mvc框架来说,都会完成一个通用的控制逻辑,例如“参数的解析”,“类型的转换”,将参数封装等操作,然而在早期的 struts1中这些动作被写死在系统的 核心控制器中,带来了很多的缺点“:
1:灵活性差:不管用户是否需要都会触及到
2:可宽展行差:很难定义自定义的处理
Struts2中的大部分拦截器都是按功能分开定义,每个拦截器完成一个独立的模块,这些拦截器之间可以自由选择,灵活组合,开发者只需在struts.xml中指定该拦截器
Struts2中绝大多数的拦截器都是通过拦截器来完成的,当FilterDispatcher拦截到用户的请求时,大量的拦截器会对用户的请求进行处理,然后调用用户的action进行相应的逻辑处理
Struts2中内建的拦截器:(仅仅介绍几个日常工作中经常使用的)
1:chain:构建一个action链,使当前action可以访问前一个action的属性,一般和
!--定义全部的拦截器-->
<interceptors>
<!--定义第一个拦截器-->
<interceptor name="myInterceptor" class="guoliang.MyInterceptor"/>
//第二个拦截器
<interceptor name="mysecondInter" class="guoliang.secondInter"/>
</interceptors>
//定义action
<action name="login" class="guoliang.LoginAction">
//配置映射
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
//拦截器一般配置在result之后
//使用系统默认的拦截器
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myInterceptor"/>
<interceptor-ref name="mysecondInter"/>
</action>
上面的三个拦截器在其中defaultStack是默认的拦截器,在执行action之前,这三个拦截器都会执行
配置默认的拦截器
如果配置显示的制指定了拦截器,则默认的拦截器不在起作用,需要手动的指定默认的拦截器,同时每个包中只能指定一个默认的拦截器,如果需要指定多个默认的拦截器,则可以配置成拦截器栈,因为struts-default中如下 的片段:
<package name="struts-default">
....
<!-- 指定struts2的默认拦截器 -->
<default-interceptor-ref name="defaultStack"/>
</package>
所以我们在继承了struts-default包之后,就不需要显示的声明需要使用哪个拦截器
当然用户也可以定义自己的拦截器:
应该实现Interceptor接口
该类中的部分源码:
public interface Interceptor extends Serializable{
//销毁该拦截器之前的回调方法
void destroy();
//初始化该拦截器是的方法;
void init();
//拦截器实现的逻辑方法,一般只需实现该方法即可
String intercept(ActionInvocation invocation)throws Exception
}
String intercept(ActionInvocation invocation)throws Exception:就像action的方法一样该方法会返回一个字符串,作为逻辑视图,如果该方法直接返回了一个字符串,系统会跳转到该逻辑视图对应的实际视图资源,不会调用被拦截的action,该方法的ActionInvocation参数包含了被拦截的action的引用,可以通过调用该参数的invoke方法,将控制权转给下一个拦截器,或者action的excute
下次将实现一个拦截器类