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自己清除。具体看下面的代码,代码很简单:

public void doFilter(...){     ...     try{     ...     //继续执行所配置的chain中的Filter     chain.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是用来计算调用方法所执行的开始和结束时间,用来做性能测试的。用法如下:
String timerKey = "ActionContextCleanUp_doFilter: ";     UtilTimerStack.setActive(true);     UtilTimerStack.push(timerKey);     
//调用要测试的方法。     
UtilTimerStack.pop(timerKey);   


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php html区别_php与html区别

php与html区别HTML是超文本标记语言&#xff1b;PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。HTML主要用在客户端的显示&#xff0c;比如我们浏览的网页&#xff0c;特别是静态网页&#xff0c;都…

Struts2源码阅读(三)_DispatcherConfigurationProvider

首先强调一下struts2的线程程安全&#xff0c;在Struts2中大量采用ThreadLocal线程局部变量的方法来保证线程的安全,像Dispatcher等都是通过ThreadLocal来保存变量值,使得每个线程都有自己独立的实例变量,互不相干. 接下来就从Dispatcher开始看起&#xff0c;先看其构造函数&a…

php点击链接代码,php 获取超链接中文本的代码

本文分享的这段代码&#xff0c;使用php正则从超链接中提取文本。例如&#xff0c;可以从Link中&#xff0c;获取文本内容&#xff1a;Link。代码如下&#xff1a;/*** 从超链接中提取文本* param string $url* return string* edit www.jbxue.com*/function getUrlLinkText($u…

谷歌宣布在北京成立AI中国中心:李飞飞和李佳共同领导

来源&#xff1a;澎湃新闻概要&#xff1a;谷歌正式宣布谷歌AI中国中心&#xff08;Google AI China Center&#xff09;在北京成立。谷歌正式宣布谷歌AI中国中心&#xff08;Google AI China Center&#xff09;在北京成立。12月13日&#xff0c;在上海举行的谷歌开发者大会&a…

2008php多版本共存,ECS Windows 2008 IIS如何同时配置多版本的php

ECS Windows 2008 IIS如何同时配置多版本的phpWindows可以通过IIS下安装PHP Manager工具让IIS可以同时支持多版本的php&#xff0c;具体步骤如下所示&#xff1a;1.首先需要下载PHP Manager软件(下载地址&#xff1a;http://phpmanager.codeplex.com/releases/view/69115)&…

Struts2源码阅读(四)_DispatcherConfigurationProvider续

接下来第三步:init_LegacyStrutsProperties()调用的是调用的是LegacyPropertiesConfigurationProvider通过比较前面DefaultPropertiesProvider与调用的是LegacyPropertiesConfigurationProvider.发现DefaultPropertiesProvider继承自后者,但重写了register()方法,主要是生成Pro…

AI 与区块链:两大热门技术,会碰撞出什么样的火花?

来源&#xff1a;36氪概要&#xff1a;区块链和AI可以说是当今最热门的两个技术方向了。区块链和AI可以说是当今最热门的两个技术方向了。在一般人看来&#xff0c;这两大技术似乎没有什么交叉的地方&#xff0c;因为区块链和AI分别属于是技术谱系的两个极端&#xff1a;一个是…

php5.5升级到php5.6,从php5.5.9升级到php5.6之后,相当于php5enmod?

在ubuntu服务器中,我曾经为php5.5.9安装模块,例如带有apt-get的mcrypt,然后使用sudo php5enmod mcrypt启用了它.现在,我已经升级到php5.6,并且错过了一个在Laravel 4.2中与PHPThumb一起使用的模块,该模块需要GID或Imagick来修改图像.所以我做了 &#xff1a;$sudo apt-get inst…

伯克利人工智能研究院最新研究:协作型工业机器人如何更智能?

原文来源&#xff1a;BAIR作者&#xff1a;Changliu Liu、Masayoshi Tomizuka「雷克世界」编译&#xff1a;嗯~阿童木呀、我是卡布达在现代工厂中&#xff0c;工人和机器人是两大主要劳动力。出于安全考虑&#xff0c;这两者通常被限制在金属笼中的机器人分离开来&#xff0c;而…

Struts2源码阅读(五)_FilterDispatcher核心控制器

Dispatcher已经在之前讲过&#xff0c;这就好办了。FilterDispatcher是Struts2的核心控制器&#xff0c;首先看一下init()方法。 public void init(FilterConfig filterConfig) throws ServletException { try { this.filterConfig filterConfig; initLogging(); …

Php如何过360拦截,PHP常见漏洞修复文件-360漏洞修复插件

主要对常见的漏洞进行拦截&#xff0c;如&#xff1a;SQL注入漏洞、检测POST数据、XSS漏洞防护等&#xff0c;效果非常不错&#xff0c;值得拥有。1、下载:360漏洞修复插件2、解压后&#xff0c;上传整个文件夹至服务器根目录3、if(is_file($_SERVER[DOCUMENT_ROOT]./360safe/3…

谷歌开源 TFGAN,让训练和评估 GAN 变得更加简单

作者&#xff1a;思颖概要&#xff1a;训练神经网络的时候&#xff0c;通常需要定义一个损失函数来告诉网络它离目标还有多远。三年前&#xff0c;蒙特利尔大学 Ian Goodfellow 等学者提出「生成式对抗网络」&#xff08;Generative Adversarial Networks&#xff0c;GANs&…

Struts2源码阅读(六)_ActionProxyActionInvocation

下面开始讲一下主菜ActionProxy了.在这之前最好先去了解一下动态Proxy的基本知识.ActionProxy是Action的一个代理类&#xff0c;也就是说Action的调用是通过ActionProxy实现的&#xff0c;其实就是调用了ActionProxy.execute()方法&#xff0c;而该方法又调用了ActionInvocatio…

py语言和php,php和python什么区别

python语言的风格Python在设计上坚持了清晰划一的风格&#xff0c;这使得Python成为一门易读、易维护&#xff0c;并且被大量用户所欢迎的、用途广泛的语言。设计者开发时总的指导思想是&#xff0c;对于一个特定的问题&#xff0c;只要有一种最好的方法来解决就好了。这在由Ti…

计算机产业深度报告:云计算与人工智能开启新一轮技术变革周期

来源&#xff1a;乐晴智库概要&#xff1a;每一次的技术迭代都将行业推向新的高度&#xff0c;同时也对产业生态和企业兴衰产生重大影响。纵观整个IT产业的发展史&#xff0c;从1960年代到现在的2010年代&#xff0c;科技行业历经了大型机时代、小型机时代、PC时代、互联网时代…

自动分页,返回时跳回指定页

实现原理&#xff1a; displaytag 自动分页时&#xff0c;只需要提供一个“集合”(name 属性) 和翻页对应的 requestURI 属性&#xff08;也是返回整体的集合&#xff09; 执行翻页时 displaytag 会自动计算出页数&#xff0c;形如&#xff1a; http://localhost:8080/bpp/ma…

java 界面艺术字,Java 在Word文档中添加艺术字

与普通文字相比&#xff0c;艺术字更加美观有趣也更具有辨识度&#xff0c;常见于一些设计精美的杂志或宣传海报中。我们在日常工作中编辑Word文档时&#xff0c;也可以通过添加艺术字体来凸显文章的重点,美化页面排版。这篇文章将介绍如何使用FreeSpire.Doc for Java在word文档…

AI校招程序员最高薪酬曝光!腾讯80万年薪领跑,还送北京户口

来源&#xff1a;100offer概要&#xff1a;如果说 2016 年是互联网 AI 领域井喷的元年&#xff0c;2017 年整个 AI 领域全面爆发&#xff0c;来潮汹涌的趋势相较 2016 年可以说是有过之而无不及。如果说 2016 年是互联网 AI 领域井喷的元年&#xff0c;2017 年整个 AI 领域全面…

集合对象-“块数据”操作--其实是同一对象引用

例如&#xff1a; Set set1 new HashSet(); set1.add( object1 ); set1.add( ... ); set1.add( objectn ); Set set2 new HashSet( set1 ); 或者 Set set3 new HashSet( set1 ); set3.addAll( set1 ); set2 与 set3 中存储的都是 set1 元素的 “引用” 代码如…

vscode php断点,VSCode中设置断点调试PHP(示例代码)

所需文件xampp 集成服务器(本文使用Apache2.4MySQLPHP7.4.3)vscodeXdebugphp-debug 插件配置Xdebug1. 下载Xdebug插件 (直接去 https://xdebug.org/download.php下载php对应版本的插件)如果不知道如何选取版本&#xff0c;则如下Step 1&#xff1a;获取本地php版本信息 (利用ph…