当前位置: 首页 > 编程日记 > 正文

Struts2--ActionContext及CleanUP Filter

1. ActionContext


ActionContext是被存放在当前线程中的,获取ActionContext也是从ThreadLocal中获取的。所以在执行拦截器、 action和result的过程中,由于他们都是在一个线程中按照顺序执行的,所以可以可以在任意时候在ThreadLocal中获取 ActionContext。


ActionContext包括了很多信息,比如Session、Application、Request、Locale、ValueStack等,其中 ValueStack可以解析ognl表达式,来动态获取一些值,同时可以给表达式提供对象。

 

ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器 (其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象. 一般情况, 我们的ActionContext都是通过: ActionContext context = (ActionContext) actionContext.get(); 来获取的.我们再来看看这里的actionContext对象的创建:

static ThreadLocal actionContext = new ActionContextThreadLocal();

ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.这样,我们 ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.

通过ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession(); (通过Map模拟HttpServlet的对象,操作更方便)

 

2. ServletActionContext

ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:

(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象
(2)javax.servlet.http.HttpServletResponse : HTTPservlet相应对象
(3)javax.servlet.ServletContext : Servlet上下文信息
(4)javax.servlet.ServletConfig : Servlet配置对象
(5)javax.servlet.jsp.PageContext : Http页面上下文

如何从ServletActionContext里取得Servlet的相关对象:

<1>取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();

<2>取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();

 

3. ServletActionContext和ActionContext联系

ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.

注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(), 因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。 至于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,而 ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象时独立的建立了一个req。

 

4.ActionContextClearUp

ActionContextClearUp其实是Defer ClearUP.作用就是延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除。具体看下面的代码,代码很简单:

Java代码 复制代码
  1. public void doFilter(...){   
  2.   
  3.   ...   
  4.   try{   
  5.     ...   
  6.     //继续执行所配置的chain中的Filter   
  7.     chain.doFilter(request, response);   
  8.   }finally{   
  9.   //保证在所有动作执行完之后,调用cleanUp   
  10.     ...   
  11.     cleanUp(request);   
  12.   }   
  13. }   
  14.   
  15. protected static void cleanUp(ServletRequest req) {   
  16.   
  17.   ...   
  18.   ActionContext.setContext(null);//清除ActionContext实例   
  19.   Dispatcher.setInstance(null);//清除Dispatcher实例(Dispatcher主要是完成将url解析成对应的Action)   
  20. }  
Java代码 复制代码 收藏代码
  1. public void doFilter(...){   
  2.   
  3.   ...   
  4.   try{   
  5.     ...   
  6.     //继续执行所配置的chain中的Filter   
  7.     chain.doFilter(request, response);   
  8.   }finally{   
  9.   //保证在所有动作执行完之后,调用cleanUp   
  10.     ...   
  11.     cleanUp(request);   
  12.   }   
  13. }   
  14.   
  15. protected static void cleanUp(ServletRequest req) {   
  16.   
  17.   ...   
  18.   ActionContext.setContext(null);//清除ActionContext实例   
  19.   Dispatcher.setInstance(null);//清除Dispatcher实例(Dispatcher主要是完成将url解析成对应的Action)   
  20. }  
public void doFilter(...){try{...//继续执行所配置的chain中的Filterchain.doFilter(request, response);}finally{//保证在所有动作执行完之后,调用cleanUp...cleanUp(request);}
}protected static void cleanUp(ServletRequest req) {...ActionContext.setContext(null);//清除ActionContext实例Dispatcher.setInstance(null);//清除Dispatcher实例(Dispatcher主要是完成将url解析成对应的Action)
}

 

另外注明一下UtilTimerStack的push和pop是用来计算调用方法所执行的开始和结束时间,用来做性能测试的。用法如下:

Java代码 复制代码
  1. String timerKey = "ActionContextCleanUp_doFilter: ";   
  2.   
  3. UtilTimerStack.setActive(true);   
  4.   
  5. UtilTimerStack.push(timerKey);   
  6. //调用要测试的方法。   
  7. UtilTimerStack.pop(timerKey);  
Java代码 复制代码 收藏代码
  1. String timerKey = "ActionContextCleanUp_doFilter: ";   
  2.   
  3. UtilTimerStack.setActive(true);   
  4.   
  5. UtilTimerStack.push(timerKey);   
  6. //调用要测试的方法。   
  7. UtilTimerStack.pop(timerKey);  
String timerKey = "ActionContextCleanUp_doFilter: ";UtilTimerStack.setActive(true);UtilTimerStack.push(timerKey);
//调用要测试的方法。
UtilTimerStack.pop(timerKey);

 

转载于:https://www.cnblogs.com/PatrickLee/archive/2012/07/30/2615035.html

相关文章:

HTML5跳转页面并传值以及localStorage的用法

1、首先&#xff0c;你得在那个页面把数据存入localStorage中吧。这个是必须的&#xff01; localStorage.setItem("user",JSON.stringify(data.allUser)); 用localStorage的setItem方法&#xff0c;这个方法看名字都知道得差不多了吧。。。setItem把数据存入localSt…

冒泡排序_python实现冒泡排序

冒泡排序是比较经典的面试题&#xff0c; 它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换&#xff0c;也就是说该元素列已经…

30分钟内让你明白正则表达式是什么,并对它有一些基本的了解(二)

测试正则表达式 如果你不觉得正则表达式很难读写的话&#xff0c;要么你是一个搞笑的天才&#xff0c;要么&#xff0c;你不是地球人。正则表达式的语法很令人头疼&#xff0c;即使对经常使用它的人来说也是如此。由于难于读写&#xff0c;容易出错&#xff0c;所以找一种工具对…

(区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955

http://poj.org/problem?id2955 Description We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence,if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences…

[初级]深入理解乐观锁与悲观锁

2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。 乐观并发控制(乐观锁…

Umbra 3:次世代的遮挡裁剪

原文链接&#xff1a;http://www.gamasutra.com/view/feature/164660/sponsored_feature_next_generation_.php?print1 来自 Umbra Software [在这个主办方特辑中&#xff0c;Umbra Software讨论了当前使用的大量裁剪遮挡方法的优缺点&#xff0c;并解释了它自己的自动化遮挡…

在64位机上PLSQL连oracle11g问题:SQL*Net not properly installed和ORA-12154:TNS:无法处理服务名...

今天有同事在给客户安装我们的系统时&#xff0c;出现了问题。 背景&#xff1a;同事安装如下&#xff1a; 服务器是小机&#xff0c;在小机上做的虚拟机。WIN&#xff12;&#xff10;&#xff10;&#xff13;操作系统&#xff0c;装的是&#xff16;&#xff14;位的。 数据…

ios 应用和电脑共享文件夹_堪比AirDrop,苹果 iPhone与Windows电脑互传文件的三种方式...

如果你是苹果全家桶用户&#xff0c;一定会对 「AirDrop(隔空投送)」 功能赞誉有加&#xff0c;使用 AirDrop 可以在 iPhone 与 MacBook、iPad 等设备之间快速传递照片、视频或文件。遗憾的是&#xff0c;「AirDrop 仅限苹果设备之间使用」&#xff0c;而很多小伙伴应该和小兽一…

Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性

1 数组排序 1.1 问题 本案例实现一个整型数组排序的函数&#xff0c;数组排序的规则由传递的规则函数决定。 1.2 方案 首先定义一个整型数组排序函数sortInts&#xff0c;该函数有一个整型数组类型的参数&#xff0c;该参数必须是输入输出参数inout&#xff0c;否则并不能修改数…

shell命令之---Linux文件权限

本章内容  理解Linux的安全性 解读文件权限 使用Linux组 1、Linux的安全性---/etc/passwd文件 # cat /etc/passwdroot:x:0:0:root:/root:/bin/bash/etc/passwd文件的字段包含了如下信息&#xff1a; 登录用户名 用户密码 用户账户的UID&#xff08;数字形式&#x…

失败原因_解析干洗店失败原因

在市面上我们其实也知道有的店面开张时间不长或者最终没有存活下来&#xff0c;干洗店也不例外。我们在看到各地干洗店的高额利润的同时&#xff0c;也会发现一些失败的干洗店。他们的干洗店为何难以运营下去呢?下面伊斯曼小编来在多个方面剖析一下其中的蹊跷和缘由&#xff1…

seg:NLP之正向最大匹配分词

已迁移到我新博客,阅读体验更佳seg:NLP之正向最大匹配分词 完整代码实现放在我的github上:click me 一、任务要求 实现一个基于词典与规则的汉语自动分词系统。二、技术路线 采用正向最大匹配(FMM)方法对输入的中文语句进行分词&#xff0c;具体的实现可以分为下面几个步骤&…

喷涂机器人保养应该注意的七个事项

喷涂机器人又叫喷漆机器人(spray painting robot)&#xff0c; 是可进行自动喷漆或喷涂其他涂料的工业机器人。目前市面上采用比较多的品牌有ABB、库卡、发那科等等&#xff0c;长时间的使用能加速工业机器人的老化&#xff0c;保养是延缓机器人老化的一大关键&#xff0c;那么…

K均值与C均值区别

k均值聚类&#xff1a;---------一种硬聚类算法&#xff0c;隶属度只有两个取值0或1&#xff0c;提出的基本根据是“类内误差平方和最小化”准则&#xff1b;  模糊的c均值聚类算法&#xff1a;-------- 一种模糊聚类算法&#xff0c;是k均值聚类算法的推广形式&#xff0c;隶…

中超赛程来100wan点in_不干了:中超球队改名“硬重启”,球迷组织绝望解散

聚焦中超和CBA&#xff0c;独一无二球迷媒体点击右上角关注&#xff0c;你不会后悔的...2021赛季中超注定会与众不同&#xff0c;足协的新规将陆续实施&#xff0c;如果降薪还在外界意料之中的话&#xff0c;那么更改中性化名字的要求则让多数俱乐部较为头疼&#xff0c;尤其是…

微博polg什么意思_贾磊:广东发微博给CBA造成了负面影响 方硕的意思可能没表达清楚...

直播吧11月5日讯 近日做客一档节目时&#xff0c;著名篮球记者贾磊谈到了前天晚上的京粤大战。贾磊谈到了王骁辉伸腿绊倒威姆斯一事&#xff1a;“我觉得这场比赛&#xff0c;王骁辉的这个动作&#xff0c;大家都看的非常清楚&#xff0c;确实是一个犯规&#xff0c;也给威姆斯…

iOS 中的网络请求 (同步请求、异步请求、GET请求、POST请求)

1、同步请求可以从因特网请求数据&#xff0c;一旦发送同步请求&#xff0c;程序将停止用户交互&#xff0c;直至服务器返回数据完成&#xff0c;才可以进行下一步操作&#xff0c; 2、异步请求不会阻塞主线程&#xff0c;而会建立一个新的线程来操作&#xff0c;用户发出异步请…

springboot 头像上传 文件流保存 文件流返回浏览器查看 区分操作系统 windows 7 or linux...

1 //我的会员中心 头像上传接口2 /*windows 调试*/3 Value("${appImg.location}")4 private String winPathPic;5 /*linux 使用*/6 Value("${img.location}")7 private String linuxPathPic;8 9 PostMapping(value "/file")10 public String f…

个人所得税计算器2016 by Jacksile

个人所得税计算器2016 个人所得税计算器2016 税前薪资&#xff1a;元各项社会保险费&#xff1a;元起征点&#xff1a;35004800元应缴税款&#xff1a;元实发薪资&#xff1a;元个人所得税计算公式 应纳税额 应纳税所得额 x 税率 &#xff0d; 速算扣除数 应纳税所得额 工资收…

interface IEngineControl封装引擎通用操作

using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace SIAT {namespace Engine{/******************************************************************** 引擎控制接口&#xff0c;该类封装一些引擎中通用的操作* * ***********…

iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七

不知大家有没有遇见过自己写的tableview被导航栏遮挡住的问题,反正我是遇见过! 因为在ios7以后所有的UIViewController创建后默认就是full Screen的&#xff0c;因此如果带导航栏的应用界面中的部分控件会被导航栏覆盖掉。 解决方案&#xff1a;可以使用ios7中的UIViewControll…

程序员笔记|如何编写优雅的Dockerfile

导读 Kubernetes要从容器化开始&#xff0c;而容器又需要从Dockerfile开始&#xff0c;本文将介绍如何写出一个优雅的Dockerfile文件。 文章主要内容包括&#xff1a; Docker容器 Dockerfile 使用多阶构建感谢公司提供大量机器资源及时间让我们可以实践&#xff0c;感谢在此专…

Oracle面试问题汇总

1:SqL 优化 1&#xff1a;尽量避免使用 select * 查询方式 因为oracle 在解析过程中 会将*依次转化成所以的列名。 2&#xff1a;减小访问数据库的次数 因为每执行一条sql语句的时候&#xff0c;oracle内部会做许多的事情 如&#xff1a;解析sql &#xff0c;估算索引的利用效率…

相关性分析p值_一行代码掌握皮尔逊相关分析,洞察变量关系

变量类型与推荐的假设检验方法可以看到&#xff0c;当我们探索两个连续变量之间的关系时&#xff0c;相关分析是一个很好的选择。那么&#xff0c;相关分析的原理是什么&#xff1f;如何在Python中实现相关分析呢&#xff1f;一、Pearson相关系数针对两个独立的服从正态分布的连…

润前报表简单问题

Q&#xff1a;设计器如何打开A&#xff1a;如果是安装的&#xff0c;那么直接到菜单下&#xff0c;打开润乾报表设计器就行了&#xff0c;如果是压缩包或者从别人那儿拷过来的&#xff0c;就运行\reportHome\bin下面的startup.bat就可以打开了。 Q&#xff1a;做一个报表最基本…

一个简单的slider滑块组件

2019独角兽企业重金招聘Python工程师标准>>> 我们先来看一张图片&#xff1a; 要实现这样的效果我们有很多种方法&#xff0c;比如直接使用<input type"range" />修改样式即可&#xff0c;也可用下面的这种方式修改 样式 HTML代码&#xff1a; <…

压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地

项目背景随着业务拓展&#xff0c;对于接口性能的要求也在上升&#xff0c;各部门也开始针对部分慢接口进行优化&#xff0c;从测试角度针对这些优化需求进行测试时不仅要保证对应接口的功能正常使用同时也要验证接口优化成果。在日常的开发工作中一些后台服务配置的改动也会对…

01python语言程序设计基础——初识python

1.python的字符串中format函数用法 format 函数可以接受不限个参数&#xff0c;位置可以不按顺序。In [2]:"{} {}".format("hello", "world") # 不设置指定位置&#xff0c;按默认顺序Out[2]:hello world In [3]:"{0} {1}".format(&q…

没有什么不可能(1)

近在读一本书《没有什么不可能》&#xff0c;书中宗旨就是&#xff1a;这个世界没有什么不可能&#xff0c;每个人的脚下都有一条通往成功的道路&#xff0c;信念是一切力量的源泉。这本书看了三分之一&#xff0c;跟大家分享一下前三个观点。 1、只有想不到&#xff0c;没有做…

浅浅认识之VBS脚本访问接口与COMODO拦截COM接口

这2天测试了一个使用了WMI提供ASEC后门&#xff0c;里面使用了JS脚本往外请求http获取执行命令。但我的分析系统却没抓到这个行为&#xff0c;可在真机中确实抓到有HTTP请求。相当奇怪。 最后无奈windbg出手&#xff0c;内核断点afd 发送函数。最后发现是scrcons.exe进程&#…