频道栏目
首页 > 资讯 > 其他 > 正文

Struts2框架核心:拦截器使用配置解析和常见bug学习心得(笔记)

18-07-28        来源:[db:作者]  
收藏   我要投稿

目录

基本概念及原理

自定义拦截器:

使用拦截器

重复提交数据:



基本概念及原理

含义

Struts 2拦截器,是Struts2的核心和基础。

为AOP的一种实现,底层通过动态代理动态完成。反射。

访问action之后,需要经过层层拦截器。

完成某些功能的类,以可插拔的方式放在配置前,后。

官方定义

动态拦截Action调用的对象,提供机制,定义代码,使其在Action前后被调用,也可以在Action执行之前阻止其执行。同时提供一种可以提取Action中可重用的方式。

拦截器栈:多个拦截器组合的集合体,将这些拦截器按照一定的顺序链接成链。

图:后进先出栈

拦截器原理:和过滤器的功能类似,一个拦截器在一个拦截栈中有什么功能:1,可以调用下方的拦截器,有时可以判断请求是否通过,下面如果没有拦截器的话调用资源Action。

拦截器代码:在struts-default.xml中查看。

interceptors器;

interceptor-stack栈;

default-interceptor-ref默认拦截器配置。

典型的责任链模式,职责链,判断在运行过程中实时选择。 代表:异常

每个元素有不同职责,将他们纳入链式结构,每个元素负责链式结构下一个元素的执行调用。

思想:将复杂的系统分而治之,使每个部分的逻辑能够高度重用并增强他的拓展性。


自定义拦截器:

三个步骤:

1.直接或间接实现接口,(适配器模式)com.opensymphony.xwork2.interceptor.Interceptor,实现一个接口必须实现接口中的所有方法。如图:

或者继承继承类 com.opensymphony.xwork2.interceptor.AbstractInterceptor实现一个继承类只需要实现需要的方法。

2,通过元素来定义拦截器

3,通过元素使用拦截器

struts.xml中 定义拦截器,定义在action标签之前,并在action中配置拦截器。新建Invocation。先定义一个新的拦截器类MyInterceptor,继承Interceptor接口中的多个方法,也可继承AbstractInterceptor中的方法,继承到的方法,将intercept方法中在拦截器获得拦截结果的前后打入输出,调试程序观察出拦截器出入的顺序。

public String intercept(ActionInvocation invocation) throws Exception {

    System.out.println("method start");

    String result=invocation.invoke();

    System.out.println("method end");

    return result;

  }

配置struts.xml拦截器的代码:




    


使用拦截器

加入拦截器出现了问题,当引用自定义拦截器时,默认拦截器将失效。此时需要在struts.xml中手动引用默认拦截器。


在action标签中添加默认拦截器的引用代码:


拦截器1成功,并且按出入顺序打印出标记:

拦截栈的运用:

也可以将两条引用语句从action配置中取出并放入拦截栈中,称为自定义拦截栈,命名为myStack。

并在action中引用myStack拦截栈。

在定义两个拦截器的时候,配置完成后,运行获得结果。

获取数据的顺序为后进先出,符合拦截栈的基本特性。


提出问题:在package中的多个action想要引用同名拦截栈myStack,只需要在action标签前面添加语句:

"myStack">

添加后action中的调用栈语句可以删除。

拦截器对所有方法都会拦截,但是只想要拦截单独的方法。提供MethodFilterInterceptor类

其中有两个方法:exclude为显示想要拦截的方法,include为显示不想要拦截的方法。

在MethodFilterInterceptor类中有两个的方法,拦截和不拦截,在自定义拦截器中你想要操作的拦截器标签下添加param标签:


login

表示拦截器3不进行拦截,此时就不会通过拦截器3。includeMethods方法同理。


重复提交数据:

在提交数据之后,刷新页面会使数据再次提交,数据会提交两次,造成错误。

可以用重定向sendRecdient,将地址定向到新的页面。但是某些情况只能使用请求转发Dispacther。

如何解决:在第一次打开页面后,向session中存值,同时保存,提交页面时将提交页面的值和session的值进行比对,如果一致,代表第一次提交,运行进入Action,第一次提交后session清空,第二次打开页面,表单中的值还在,session中的值已经没有了,两个对比之下不同,便可以跳转至错误页面。

解决方法:

使用Strut2框架中自带的tokenInterceptor拦截器。

1,在提交页面如登录页面表单中加入token标记。

在form表单中添加标签。

2,在struts.xml中配置tokenInterceptor拦截器和配置invoke.token信息。

在Struts2中有一个拦截器token,需要配置进栈。


最后在token接口中找到结果名称,类型为redirect。

login.jsp

这样,就可以解决在Struts2框架中关于数据由于重复刷新而导致重复提交数据的情况。

相关TAG标签
上一篇:java关于Annotation“注解”的实例解析
下一篇:关于沃尔玛的流媒体之路
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站