拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制。Struts2框架中提供的许多功能都是使用拦截器实现的,包括异常处理,文件上传,生命周期回调和验证等。
使用拦截器的优点:
1. 简化Action的实现。拦截器能把很多功能从Action中独立出来,大量减少了Action的代码。
2. 单一责任性。将更加具体的功能从Action中分离出来,分散到不同的拦截器中,这样每个拦截器的功能,以及Action本身的功能就更单一了。
3. 提高代码的重用型。Java是一门面向对象的语言,当具有相同功能的代码被封装在拦截器中,就可以对不同的Action,根据功能需要,来配置相同的拦截器了。
拦截器的的调用顺序:
拦截器是按照配置顺序执行的,也就是说谁配置在前面,谁就会先执行。但是有一个点必须要注意:Struts2默认拦截器需要配置在自定义拦截器之前。
Struts2框架一些重要的拦截器:
No. | 拦截器和说明 |
---|---|
1 | alias:允许参数在请求之间使用不同的别名。 |
2 | checkbox:通过为未检查的复选框添加参数值false,以辅助管理复选框。 |
3 | conversionError:将字符串转换为参数类型的错误信息放置到action的错误字段中。 |
4 | createSession:自动创建HTTP会话(如果尚不存在)。 |
5 | debugging:为开发人员提供一些不同的调试屏幕。 |
6 | execAndWait:当action在后台执行时,将用户发送到中间的等待页面。 |
7 | exception:映射从action到结果抛出的异常,允许通过重定向自动处理异常。 |
8 | fileUpload:便于文件上传。 |
9 | i18n:在用户会话期间跟踪选定的区域。 |
10 | logger:通过输出正在执行的action的名称提供简单的日志记录。 |
11 | params:设置action上的请求参数 |
12 | prepare:这通常用于执行预处理工作,例如设置数据库连接。 |
13 | profile:允许记录action的简单分析信息。 |
14 | scope:在会话或应用程序范围内存储和检索action的状态。 |
15 | ServletConfig:提供可访问各种基于servlet信息的action。 |
16 | timer:以action执行时间的形式提供简单的分析信息。 |
17 | token:检查action的有效性,以防止重复提交表单。 |
18 | validation:提供action的验证支持。 |
创建一个自定义的interceptor
其实主要是实现Interceptor接口,里面有init(),destroy(),intercept(ActionInvocation arg0)这三个方法。intercept(ActionInvocation arg0)才是真正的拦截器。
关于interceptor与Filter区别
1. 拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2. 过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3. 拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4. 拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5. 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
interceptor 可以在其他环境中使用,而Filter只能在Web环境中使用。