功能需求说明:

用拦截器的方式,拦截以.action结尾的类,同时记录访问的action名称、action的包路径、action后面带的参数、操作者的ID、操作者的姓名、等其他数据。

吐槽点:

1.当我拿到这个需求的时候,直接懵逼了,用日志的方式不是更好么,干嘛要用这个拦截器呢?项目经理脑袋秀逗了啊?当我把这个想法说了之后,得到的是项目经理一句“那种做法太low了”,我想请问low么?应该不low吧,你们觉得呢?

2.好久没有接触SSH,更何况拦截器以前就用得很少,没办法,只有现学现用,好吧,接着就百度,这里是最坑逼的,玛蛋,一搜一大把都是拿登录来做实例,特别让人想吐槽的就是代码和描述什么的都是千篇一律,还都说自己的是原创,wqnmlgb,好意思么?

下面就正式开始,直接上代码,不废话半天:

1.新建一个类来继承AbstractInterceptor,然后重写他的方法:

public class ActionInterceptor extends AbstractInterceptor{/*** 数据库表POJO {@link com.mavis.demeter.bean.interceptor.Tracker}的业务逻辑层。* @since 4.4*/private ITrackerService trackerService;// 提供getter/setterpublic ITrackerService getTrackerService() {return trackerService;}public void setTrackerService(ITrackerService trackerService) {this.trackerService = trackerService;}public String intercept(ActionInvocation invocation) throws Exception {// 在拦截器触发之前,需要把Spring中的bean实例取出来,// 这样在最后才能把拦截到的数据通过方法保存到数据库中ServletContext application = ServletActionContext.getServletContext();  WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);// 从ApplicationContext中取得定义在Spring中的bean实例this.trackerService = (ITrackerService)ctx.getBean("TrackerService");// 获取拦截到的action名称ActionContext ctxs = invocation.getInvocationContext();  String actionName = ctxs.getName().toString();Tracker tt = new Tracker();tt.setActionName(actionName);// 获取拦截到的action参数Map<String, String> param = new HashMap<String, String>();HttpServletRequest request = ServletActionContext.getRequest();Map<String, String[]> params = request.getParameterMap();for (String key : params.keySet()) {String[] values = params.get(key);for (int i = 0; i < values.length; i++) {param.put(key, values[i]);}}tt.setActionParameters(param.toString());// 获取拦截到的action所在的包路径String actionPakeages = invocation.getAction().toString();// 截取完整的包名String[] split = actionPakeages.split("@", 9);String actionPakeage = split[0].toString();tt.setActionPakeage(actionPakeage);// 获取拦截到的组织机构IDOrgnization orgnization = (Orgnization)ctxs.getSession().get(Constant.SESSION_ORGNIZATION);if(orgnization != null){tt.setOrganizationId(orgnization.getOrgnizationId());}// 获取拦截到的员工IDStaff staff = (Staff)ctxs.getSession().get(Constant.SESSION_STAFF);if(staff != null){tt.setStaffId(staff.getStaffId());tt.setStaffName(staff.getShownName());}tt.setTrackerTime(new Date());// 把拦截到的数据保存到数据库中this.trackerService.save(tt);return invocation.invoke();}}

第二步:配置struts2

    <!-- 新增拦截器配置 --><package name="myInterceptor" extends="struts-default"><interceptors><!-- 定义权限控制拦截器 --><interceptor name="authority" class="com.mavis.hermes.interceptor.ActionInterceptor"/>(name随便取,class就是你拦截器所在的地方,引入进来)<!-- 定义一个包含权限控制的拦截器栈 --><interceptor-stack name="mydefault"><!-- 默认拦截器 --><interceptor-ref name="defaultStack" /><!-- 自定义拦截器 --><interceptor-ref name="authority" /></interceptor-stack></interceptors><!-- 定义默认拦截器 --><default-interceptor-ref name="mydefault" /></package><!-- 拦截器配置结束 -->

针对第二步想多BB两句:

1.先看看那个登录权限拦截器的实现原理,里面有很清晰的解释什么的默认拦截器,什么是自定义拦截器,他们执行的顺序和各自的运用时机。

2.别一上来就copy代码,先看懂再自己写,代码要自己敲出来才是自己的。

第三步:在struts.xml中,凡是配置了action类的pakeage中,都继承你自己定义的这个拦截器,代码如下:

<package name="proscenium" extends="myInterceptor" namespace="/">

第四步:最重要的东西

                // 在拦截器触发之前,需要把Spring中的bean实例取出来,// 这样在最后才能把拦截到的数据通过方法保存到数据库中ServletContext application = ServletActionContext.getServletContext();  WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);// 从ApplicationContext中取得定义在Spring中的bean实例this.trackerService = (ITrackerService)ctx.getBean("TrackerService");

就是这个上面几句话,憋我了一天,玛蛋,好不容易想起的,都怪自己,把很多以前的都忘记了,好记性不如烂笔头啊,这也是写这篇博客的初衷吧。

解释一下:

在拦截器中,传统的注入和new都是不可行的,至于具体什么原因,我忘记了,好像跟什么反射机制有关,

第一句:

ServletContext application = ServletActionContext.getServletContext(); 

利用ServletActionContext获取到ServletContext

第二句:

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);

利用WebApplicationContextUtils中的getWebApplicationContext(application)方法,把ServletContext丢进去,用于获取WebApplicationContext

第三句:

通过WebApplicationContext就可以获取到Spring中配置的bean

this.trackerService = (ITrackerService)ctx.getBean("TrackerService");

通过以上步骤,你就可以顺利的把POJO的Service注入到拦截器中了,这样你就可以在拦截器中进行数据的CRUD了。

Struts2 拦截器中实现对数据进行数据库操作相关推荐

  1. Struts2拦截器和标签

    一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每 ...

  2. struts2控制器及拦截器返回JSON格式数据

    1.     JSON插件 想要使用json必定会用到jquery. 1.1        导入相关的Ajax-jar包-01资料中ajax文件中. commons-beanutils-1.8.0.j ...

  3. struts2 拦截器Interceptor中取得request、response

    如何在Struts2中的拦截器中获取 request response 等对象呢? ActionContext actionContext = invocation.getInvocationCont ...

  4. mysql 数据拦截器_拦截器中操作数据库

    做了个小项目,当初设计的是只有一个模块的用户行为被记录,其他不用记录,昨天突然说,要用户在整个系统的行为都要被记录. 很懵逼,如果把用户行为的记录放在各个模块,可以很精确的记录,但是各个模块都要有更改 ...

  5. Struts2拦截器的使用

    如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了str ...

  6. struts2拦截器的实现原理及源码剖析

    拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...

  7. 基于struts2拦截器实现用户操作日志记录

    2019独角兽企业重金招聘Python工程师标准>>> 这里基于struts2的拦截器来实现. 使用struts2拦截器拦截所有或者指定的请求,对用户操作过程中的:操作用户,操作时间 ...

  8. Struts2拦截器实现异常处理机制

    http://bbs.itcast.cn/thread-10364-1-1.html Struts2拦截器实现异常处理机制   在j2ee项目中,系统内部难免会出现一些异常,如果把异常放任不管直接打印 ...

  9. 【struts2】struts2拦截器

    struts2提供面向切面(AOP)编程的机制,拦截器便是一种成熟的AOP编程思想的实现,它提供一种机制使开发者能把相对独立的代码抽象出来,配置到action前后执行.拦截器interceptor类似 ...

最新文章

  1. 跨平台打造移动原生应用的10大武器
  2. spring整合springmvc和mybatis
  3. Netflix:为什么建立专门的媒体数据库?
  4. 分治算法求最大最小值c语言,[蓝桥杯][算法提高VIP]和最大子序列 (C语言代码)分治法...
  5. 001.从零到1之Linux高性能服务器开发
  6. java中包的概念及作用_Java中包的概念和使用实战
  7. 超融合基础架构需要完全更换现有网络吗?
  8. C#综合揭秘——细说多线程(下)(转载)
  9. 啊啊啊啊啊,麻烦到死,又要装mysql
  10. Velodyne-16完全配置
  11. maven项目关系依赖
  12. session 、cookie、token的区别及联系
  13. 我们真正痛恨的不是996,而是剥削和内卷
  14. NDN助力网络5.0时代
  15. C++共享指针的父类和子类转化
  16. 进程间通信:命名管道FIFO(2)
  17. 销售开票税价错误,修改方式!
  18. 信息学奥赛c++ 回文字符串 正解
  19. 【报告分享】2021年5G应用场景研究-CTR(附下载)
  20. 自动驾驶/智能网联在高速公路自动驾驶货车示范应用现状

热门文章

  1. ping 工具的使用
  2. c语言输出不足10补0,c++ cout输出不足位补0 setw、setfill
  3. 最优控制的四种目标函数(二次型最优控制算法等)
  4. 【机器学习】机器学习算法模式:区别监督学习、无监督学习、半监督学习、强化学习
  5. 工控机中eDP接口和LVDS接口的区别
  6. Java精品项目源码前后端分离项目第17期基于遗传算法学校排课系统
  7. matlab将mp4格式短视频处理成图片,一种短视频音乐推荐方法与流程
  8. rv1126 SDK简单编译
  9. 计算机网络基础(三)子网划分及子网掩码计算方法
  10. pta 6-7 使用函数求最大公约数 (10 分)