1. Struts2中的拦截器
1.1 Struts2的拦截器基本概念
1.1.1 拦截器概述
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者在定义的action执行的前后加入执行的代码,也可以在一个action执行前阻止其执行。也就是说它提供了一种可以提取action中可重用代码,统一管理和执行的方式。
拦截器链 (Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
拦截器和过滤器是有几分相似,但是也有区别:
- 过滤器是servlet规范中的一部分,任何java web工程都可以使用。
- 拦截器是struts2框架自己的,只有使用了struts2框架的工程才能用。
- 过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
- 拦截器它是只有进入struts2核心内部之后,才会起作用,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
同时,拦截器还是AOP编程思想的具体体现形式。AOP(Aspect-Oriented Programming)简单的说就是:
- 在不修改源码的基础上,已有的方法进行动态增强。
- 在struts2中,拦截器它就是对我们的动作方法进行增强。(其实就是把重复性的代码提取出来,然后放到拦截器中,统一管理,统一调用)
1.1.2 拦截器的执行时机
在访问struts2核心内部时,在动作方法执行之前先正序执行,然后执行动作方法,执行完动作方法和结果视图之后,再倒序执行。所以它是先进后出,是个栈的结构。具体可参考下图:
1.2 自定义拦截器
直接或间接的实现Interceptor接口
1 | public interface Interceptor extends Serializable { |
该接口提供了三个方法,其具体介绍如下。
- void init():该方法在拦截器被创建后会立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化。
- void destroy():该方法与init方法相对应,在拦截器实例被销毁之前,将调用该方法来释放和拦截器相关的资源。它在拦截器的生命周期内,也只被调用一次。
- String intercept(ActionInvocation invocation) throws Exception:该方法是拦截器的核心方法,用来添加真正执行拦截工作的代码,实现具体的拦截操作。它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的视图资源。每拦截一个动作请求, 该方法就会被调用一次。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过该参数的invoke()方法,将控制权转给下一个拦截器或者转给Action的execute()方法。
继承抽象拦截器类AbstractIntercepter
1 | public abstract class AbstractInterceptor implements Interceptor { |
AbstractInterceptor有一个子类MethodFilterInterceptor,该类中提供了两个属性,可以告知拦截器对哪些方法进行拦截或者对哪些方法排除。
1.2.1 第一步:编写普通java类,继承AbstractInterceptor
1 | /** |
1.2.2 第二步:在struts.xml中配置拦截器
1 | <?xml version="1.0" encoding="UTF-8"?> |
1.3 案例-检查登录拦截器
1.3.1 定义拦截器
1 | /** |
1.3.2 配置拦截器
1 | <package name="myDefault" extends="struts-default" abstract="true"> |
1.3.3 编写和配置Action
动作类
1 | public class BBSAction extends ActionSupport implements ServletRequestAware { |
配置
1 | <package name="p1" extends="myDefault"> |
2. Struts2的注解配置
2.1 使用前提
Struts2框架,它不仅支持基于XML的配置方式,同时也支持基于注解配置的方式。
注解和XML的配置,都是告知struts2框架,当我们jsp页面发送请求,根据配置执行对应动作类的方法,并根据返回值,前往指定的结果视图(jsp页面或者其他动作)。它们只是配置的形式不一样。
其次要想使用struts2的注解,必须要导入一个新的jar包。该jar包是: struts2-convention-plugin-2.3.24.jar
2.2 常用注解
2.2.1 @NameSpace
1 | 出现的位置: |
2.2.2 @ParentPackage
1 | 出现的位置: |
2.2.3 @Action
1 | 出现的位置: |
2.2.4 @Result
1 | 出现的位置: |
2.2.5 @Results
1 | 出现的位置: |
2.2.6 @InterceptorRef
1 | 出现的位置: |
2.3 案例-注解实现客户保存和查询列表
2.3.1 拷贝必备jar包
导入jar包: struts2-convention-plugin-2.3.24.jar
2.3.2 使用注解配置Action
1 | /** |
-------------本文结束感谢您的阅读-------------
本文标题: Struts2(四)
本文链接: https://wgy1993.gitee.io/archives/bb3a06c4.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
