拦截器:Interceptor
------------------------------
拦截器(Interceptor):Struts2拦截器是在访问某个Action或Action的某个方法之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是 Spring AOP的一种实现.
AOP:面向切面编程.其实现原理:动态代理模式
WebWork中文文档解释:拦截器是动态拦截Action调用的对象。它提供了一种机制使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的代码的方式。
拦截器栈(InterceptorStack):Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
-----------------------------------------------------------------
拦截器的作用
---------------------------------------------------
DRY原则:Dont't Repeat Yourself.
拦截器在设计和程序结构上的优点:
拦截器能把很多功能从Action中独立出来,分散到不同的拦截器里面,减少了Action的代码。如此,拦截器和Action本身的功能都更单一了。当通用的功能代码被封装在拦截器里面(代码模块化),就可以对不同的Action,根据功能需要,来配置相应功能的拦截器了。提高了拦截器所实现的功能的重用性,也变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。
1.简化Action的实现
2.功能更单一
3.通用代码模块化
4.提高重用性
Struts2中Action的执行流程
Struts2中Action的执行流程
----------------------------------------------------------
①.客户端发送请求;
②.该请求经过一系列的过滤器(Filter):其中可选过滤器ActionContextCleanUp,帮助Struts2和其他框架集成。例如:SiteMesh Plugin。
③.接着FilterDispatcher(前端控制器)被调用,FilterDispatcher询问ActionMapper,来决定该请求是否需要调用某个Action。拦截器只对Action作拦截
④.若ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
⑤.ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action类。
⑥.ActionProxy创建一个ActionInvocation的实例。
⑦.ActionInvocation实例调用Action的前后,涉及到相关拦截器(Intercepter)的调用。
⑧.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。返回结果是一个JSP或其他页面(也可以是其他的Action链)。 JSP页面展现可使用Struts2框架中的标签(该过程会涉及ActionMapper)。
-----------------------------------------------------------------
在上述整个过程中,Struts2框架中会产生很多对象,都是由Struts2中的xwork容器负责创建的-ObjectFactory
Struts2内置拦截器
Struts2之所有强大,是因为它内置了很多拦截器,Struts2框架中自定义的,可以直接拿来使用的拦截器.
不同的拦截器栈(interceptor-stack)是不同拦截器的组合,用户根据不同的需求选择不同的拦截器栈.
Struts2中内置的拦截器:
在struts-core-2.3.x.jar--->struts-default.xml中
------------------------------------------
常见的拦截器:
1:params拦截器
这个拦截器偷偷的把请求参数设置到相应的Action的属性去的,并自动进行类型转换。
2.modelDriven拦截器
如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。
3.execption拦截器
顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。
4.validation拦截器
调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。
5.token拦截器
核对当前Action请求(request)的有效标识,防止重复提交Action请求。
6.fileUpload拦截器
用来处理文件上传
7.workflow拦截器
调用Action的validate方法,一旦有错误返回,重新定位到INPUT结果视图
在校验的时候,如果有错误,将将错误信息放到一个List集合中,此时workflow拦截器来判断List集合中是否有数据,如果有就返回一个逻辑试图名称为input
8.servletConfig
通过感知接口,获取感应对象
自定义拦截器
步骤1.定义拦截器类
方式1:实现com.opensymphony.xwork2.interceptor.Interceptor接口.
方式2:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类.
public class LoginInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
ActionContext act = invocation.getInvocationContext();
Map session = act.getSession();
Object user = session.get("user");//假设登录成功后session中 会有一个user的对象
if(user == null){
//没有登录
return "login";
}
return invocation.invoke();
}
}
步骤2.在struts.xml中注册拦截器,告诉Struts2
第一步:先在中声明拦截器CheckLoginInterceptor.
第二步:在中来引用CheckLoginInterceptor拦截器.
第三步:设置当前使用的拦截器栈.
select
/index.jsp
/index.jsp
/login.jsp