struts2拦截器理论知识

软件设计中DRY规则,即不要写重复的代码,这样可以大大减轻后期维护的工作量!但是问题来了,重复的代码是不可避免的,比如在用户发送请求之前先判断用户是否登录,怎么办呢?于是就把这些重复代码提取出来,封装成一个方法A,这样就避免了书写重复的代码,用户只要在发送请求之前调用方法A即可!但是问题又出现了,用户发送请求之前可能调用方法A,可能调用方法B,由于之前是以硬编码的方式将方法A写在判断用户是否登录之前,于是不得不在每个请求之前再次进行修改代码,很麻烦,怎么办呢?我们需要一种机制,解决硬编码问题,实际上又可以实现方法调用!于是Struts2拦截器出现了,实现这种需求!
什么是拦截器?拦截器从代码角度来看就是一个类,类中包含方法,这个方法会在目标方法调用之前由系统驱动自动执行!为什么叫拦截器呢?因为这个类所做的事情,所产生的行为就是一个拦截的作用,所以叫拦截器!
拦截器原理:拦截器方法是通过代理的方式来调用的!大致思路,系统以目标对象为蓝本,创建一个代理对象,代理对象里的方法是拦截器方法和目标对象方法的组合!所以在执行目标方法前后,执行拦截器方法!
struts2的拦截器策略:每个拦截器完成一个功能,需要使用哪个拦截器,在struts.xml中指定使用拦截器就行,从而让拦截器方法在目标方法执行之前或者执行之后自动执行,完成通用操作的动态插入!也可以将多个拦截器放在一起组成一个功能更加强大的拦截器栈!
struts2框架中请求的流程:struts2是一个空容器,里面大量的內建拦截器完成了该框架的大部分操作,所以可以得出struts2框架大部分功能由拦截器实现,当FilterDispatcher(配置在web.xml)拦截到用户请求后,大量拦截器对用户请求进行处理,然后调用Action实例中的方法处理请求,再返回逻辑视图,将逻辑视图对应的资源呈现给用户!
struts2內建了大量的拦截器,这些拦截器以name-calss对的形式配置在struts-default.xml文件(struts2的默认配置文件,这个配置文件会自动加载)中!当我们在struts.xml文件中定义的package继承了Struts2的默认struts-default包(这个包指定defalutStack拦截器栈作为默认的拦截器栈,若action配置中没有指定拦截器引用,系统会将defalutStack拦截器栈自动作用于该Action),就可以自由使用struts2內建拦截器!如果不继承,则需要我们自定义,难度马上增大,所以一般是需要继承的!
內建拦截器有哪些?
alias:实现在不同请求中相似参数别名的转换!
autowiring:自动装配,用于访问Spring容器中的Bean!
chain:构建antion链,使用当前Acition访问前一个Action的属性2!
conversionError:负责处理类型转换错误的拦截器!
cookie:允许以配置的方式为Action添加多个Cookie!
createSession:负责创建一个HttpSession对象!
debugging:提供更多调试信息!
execAndWait:将等待画面发送给用户!
exception:处理异常,将异常映射为结果!
fileUpload:主要用于文件上传!
i18n:支持国际化的拦截器!
logger:负责日志记录的拦截器!
modelDriven:用于模型驱动的拦截器!
scopeModelDriven:从指定生存范围找出指定model,通过setModel()方法将该Model传给Action实例!
params:负责解析HTTP请求中的参数,将参数值设置成Action对应的属性值!
staticParam:将xml中action标签下param标签中的参数传入action
scope:范围转换器
servletConfig:在action中直接访问servletAPI!
timer:输出action的执行时间!
token:阻止重复提交!
tokenSession:把token保存在HttpSession中!
validation:完成数据校验!
workflow:调用action类中的validate方法,校验失败,返回input逻辑视图!
store:将信息保存到session!
checkbox:检测没有勾选的复选框!
roles:授权拦截器
annotationWorkflow:支持struts2“零配置”特性的拦截器!
multiselect:检查没有选中的下拉列表!

怎样在struts2中使用拦截器?
1.定义拦截器 在package包下使用interceptros元素定义拦截器
2.使用拦截器
方式一:在action元素中引用拦截器!
方式二:在package元素中配置默认拦截器,实现该包下所有action同时配置相同的拦截器!
与拦截器相关的配置元素如下:
interceptros定义拦截器该元素包含interceptor和interceptor-stack
interceptor定义单个拦截器定义时需要指定name和class两个属性
interceptor-stack定义拦截器栈该元素包含interceptor-ref子元素
interceptor-ref引用一个拦截器或者拦截器栈
param用于为拦截器指定参数
default-interceptor-ref为指定包配置默认的拦截器

若action中显示应用了某个拦截器,默认拦截器(struts2的默认拦截器是defaultStack)不起作用,若action要使用默认拦截器,必须手动配置拦截器引用;若action中没有显示指定拦截器,默认拦截器将会起作用!

开发自己的拦截器步骤:
1.实现拦截器类
1.1实现Interceptor接口
1.2继承AbstractInterceptor类(实现了Interceptor方法) 会拦截action内的所有方法
1.3继承MethodFilterInterceptor(是AbstractInterceptor的子类) 拦截action内的指定方法

拦截器的执行顺序:
在execute方法之前的动作,配置在前面的拦截器先起作用;对于在execute方法之后的动作,配置在后面的拦截器将先起作用!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值