- 浏览: 303746 次
最新评论
-
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
hunanjun000:
《研磨struts2》第四章 Action 之 4.5 Action的其它重要知识
7.4 ActionContext和ServletActionContext
7.4.1 再探ActionContext
前面已经了解到ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,我们也称之为广义值栈。
Struts2在每次执行Action之前都会创建新的ActionContext,在同一个线程里ActionContext里面的属性是唯一的,这样Action就可以在多线程中使用。
1:ActionContext的线程安全性
那么Struts2是如何保证ActionContext的线程安全性呢?
看看ActionContext对象的代码,示例如下:
ThreadLocal又称为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
存放在ActionContext里的数据都存放在这个ThreadLocal的属性中,而这个属性只会在对应的当前请求线程中可见,从而保证数据是线程安全的。
2:访问的是Map
回顾前面在使用ActionContext来访问Session中数据的程序,你会发现,其实在程序里面访问的是一个Map,而非HttpSession对象,这是为什么呢?
原来,Struts2框架将与Web相关的很多对象重新进行了包装,比如将HttpSession对象重新包装成了一个Map对象,里面存放着Session中的数据,提供这个Map给Action使用,而不用Action直接和底层的HttpSession打交道。也正是因为框架的包装,让Action可以完全的和Web层解耦。
但是要注意一点,ActionContext不能在普通的Java应用程序中使用。
在以前的学习中,介绍了Action和Servlet API是解耦的,因此可以在Java应用程序中调用Action的execute方法来进行测试。但是如果使用了ActionContext来获取session数据,那么就不能这样运行了。因为ActionContext包装的都是Web的数据,在Java应用程序中运行的时候,没有Web的环境和响应的数据,因而会抛出空指针的异常。
访问其它的Web对象的值也是与此类似的,你通过ActionContext去访问的都是包装后的Map。
3:使用SessionAware接口
Struts2还提供另外一种简单的方式,使用SessionAware接口来访问存储于ActionContext中的数据,该接口通过使用IoC/DI来为Action注入Session Map,就可以在程序里面直接使用这个Map来操作数据了。
(1)在Action中不再需要访问ActionContext了,取而代之,Action实现SessionAware接口,该接口告知Struts2在Action执行之前要设置Session Map,是通过servletConfig 拦截器来实现的,这个拦截器在defaultStack里面就有。示例代码如下:
在上面的代码中:
- Action类实现SessionAware接口
- 这个接口要求Action类实现一个方法setSession(Map<String, Object> session),通过这个方法注入Session的数据
- 在execute方法中,通过这个私有属性就可以操作会话中的数据,注意一点,这个Map中的值也是与HttpSession联动的。
(2)结果界面也稍作修改,好来看出Action操作session后的效果,示例如下:
通过两种方式来查看会话中的值。
去运行测试一下,结果页面示例如下:
图7.6 查看会话中的值
为了能够在普通的Java应用中运行并测试Action,推荐大家使用SessionAware的方式来访问HttpSession。因为这样一来,在通过main方法运行或测试的时候,可以直接调用setSession方法,传入模拟的会话数据,就不会出现execute方法中抛出空指针的异常了。
因此,推荐大家使用SessionAware的方式来访问HttpSession。
4:使用其它包装接口
跟SessionAware类似,你可以使用RequestAware来获取包装请求对象的attribute中的值的Map;使用ApplicationAware来获取包装ServletContext对象的attribute中的值的Map;使用ParameterAware来获取包装请求对象的参数中的值的Map,等等,这里只罗列这几个常见和常用的,还有更多的请参见Struts2的API文档。
7.4.2 ServletActionContext
在实际应用开发中,光是获取数据就够了吗?答案显然是否定的,有些时候,根据功能需要,在Action中必须要能获取到Servlet相关的API,比如要操作Cookie。这个时候,就需要用ServletActionContext了。
1:ServletActionContext概述
这个类直接继承了ActionContext,当然也继承了它父类的很多功能,比如:对OgnlValueStack、Action名字等的访问。更重要的是,它还提供了直接访问Servlet的相关对象的功能,它可以取得的对象有:
- HttpServletRequest:请求对象
- HttpServletResponse:响应对象
- ServletContext:Servlet上下文信息
- PageContext:Http页面上下文
2:基本使用
直接使用ServletActionContext的静态方法就可以获取到相应的对象。示例如下:
- HttpServletRequest request = ServletActionContext.getRequest();
- HttpServletResponse response = ServletActionContext.getResponse();
- ServletContext servletContext = ServletActionContext.getServletContext();
- PageContext pageContext = ServletActionContext.getPageContext();
- HttpSession session = ServletActionContext.getRequest().getSession();
这里要注意的是HttpSession对象的获取,是在取得HttpRequest对象过后,通过HttpRequest对象来获取会话对象。当然,取得相应的对象后,就直接使用这些对象的方法来进行开发,这里就不去赘述了。
3:通过IoC/DI的方式来获取相应的Servlet对象
还可以通过IoC/DI的方式来获取相应的Servlet对象,对应关系是:
- ServletRequestAware:通过这个接口来获取HttpServletRequest对象
- ServletResponseAware:通过这个接口来获取HttpServletResponse对象
用ServletRequestAware来示例一下。
(1)修改Action,让其实现ServletRequestAware接口,示例代码如下:
- public class OgnlAction extends ActionSupport implements ServletRequestAware{
- private HttpServletRequest request = null;
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- }
- public String execute(){
- request.setAttribute("request", "Request的属性值");
- request.getSession().setAttribute("sessionTestKey", "测试SessionAware");
- return this.SUCCESS;
- }
- }
(2)对应的结果页面也需要稍作修改,要把Action中设置的值显示出来,示例如下:
(3)运行测试一下,结果页面应该如下:
图7.7 使用ServletRequestAware的结果页面
当然,你也可以以同样的方式去使用ServletResponseAware,这里就不去赘述了。
7.4.3 ActionContext和ServletActionContext
根据前面的讲述,你会发现,ActionContext和ServletActionContext有着一些重复的功能,都能够获取到Web对象的数据,但是又有些不同。
通常情况下,可以这么认为:ActionContext主要负责值的操作;ServletActionContext主要负责获取Servlet对象。
那么在Action中,该如何去抉择呢?建议的原则是:
- 优先使用ActionContext
- 只有ActionContext不能满足功能要求的时候,才使用ServletActionContext
总之,要尽量让Action与Web无关,这对于Action的测试和复用都是极其有好处的。
另外还有一点需要注意:在使用ActionContext时,不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许还没有设置,这时通过ActionContext取得的值也许是null。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4072.html】
欢迎访问http://sishuok.com获取更多内容
评论
发表评论
-
研磨struts2 目录贴
2012-08-24 12:12 162651.1 《研磨struts2》 第一章 Struts2 ... -
跟着cc学设计 之 研磨设计模式 视频教程 出炉了
2012-08-15 07:16 2研磨设计模式——跟着CC学设计系列精品课程,上线了! ... -
研磨struts2 目录
2012-07-30 21:15 2471.1 《研磨struts2》 第一章 Strut ... -
研磨struts2 目录
2012-07-30 16:54 361.1 《研磨struts2》 第一章 Stru ... -
《研磨struts2》A.2 struts.properties的配置 之 A.2.1 概述
2012-07-09 12:10 2993A.2.1 概述 如果我们希望覆盖在 ... -
《研磨struts2》附录A Struts2的配置 之 A.1 struts.xml的配置
2012-07-09 12:10 2675A.1 struts.xml的配置 A.1.1 ... -
《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置
2012-07-06 08:07 282821.3 通过注解来实现零配置 21.3.1 ... -
《研磨struts2》第二十一章 零配置 之 21.2 约定大于配置
2012-07-05 10:44 238521.2 约定大于配置 21.2.1 约定 ... -
《研磨struts2》第二十一章 零配置 之 21.1 概述
2012-07-05 10:44 222421.1 概述 21.1.1 零配置概述 在 ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.3 整合Struts2与SiteMesh
2012-07-04 08:15 2002在Struts2中使用SiteMesh ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.2 单独使用SiteMesh
2012-07-03 08:00 200620.2 单独使用SiteMesh 20. ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.1 调整应用的风格
2012-07-03 07:59 180220.1 调整应用的风 ... -
《研磨struts2》19.2 使用execAndWait拦截器模拟进度条 之 19.2.1 模拟长时间运行的Action
2012-07-02 12:24 207919.2.1模拟长时间运行的Action ... -
《研磨struts2》第十九章 进度条 之 19.1 使用“进度条”告知用户进度
2012-07-02 12:23 207319.1 使用“进度条”告知用户进度 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.3 Struts2结合JFreeChart
2012-06-28 12:12 194118.3 Struts2结合JFreeChart ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.2 Struts2插件概述
2012-06-28 12:11 1964Struts2并没有求大求全,企图把所有 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.1 JFreeChart使用
2012-06-20 15:48 219918.1 JFreeChart使用 18.1.1概 ... -
研磨struts2(1-10章)电子书下载
2012-06-19 07:30 5978研磨struts2的博客文章 私塾在线学习网 《研 ... -
《研磨struts2》第十七章 防止重复提交 之 17.3 更强大的tokenSession拦截器
2012-06-18 13:46 201917.3 更强大的tokenSession拦截器 ... -
《研磨struts2》第十七章 防止重复提交 之 17.2 使用标签
2012-06-18 13:45 229717.2 使用<s:token/>标签 ...
相关推荐
struts2--3.Ognl与值栈
struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号
本资源适合刚接触Struts和Ognl的小伙伴交流学习,欢迎吐槽。
struts2OGNL表达式ActionContext及valuesStack.pdf
从官网checkout下来的源码,如果大家觉的区官网麻烦可以直接下载这个
Struts2中ognl-2的源代码,从官网下载的
NULL 博文链接:https://lijiejava.iteye.com/blog/628636
1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据
struts2的ognl
Struts2学习计划5---Struts2_OGNL(对象图导航语言)的学习
有对struts2标签和OGNL的总结。
struts.xml文件中新增以下内容: <!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
struts2标签和OGNL表达式struts2标签和OGNL表达式
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
struts2 OGNL之标签访问值栈(value stack)用法,希望能对大家有帮助
Struts2的标签库及OGNL表达式语言
第7章 UI组件标签 139 7.1 为什么需要UI组件标签 139 7.2 标签、模板和主题 144 7.2.1 标签 146 7.2.2 模板 146 7.2.3 主题 146 7.3 UI组件标签 148 7.3.1 通用属性 148 7.3.2 简单组件 149 7.3.3 基于集合的组件 ...
struts2-convention-plugin-2.3.32.jar struts2-core-2.3.32.jar struts2-spring-plugin-2.3.32.jar xwork-core-2.3.32.jar 2、删除上面原有的低版本jar 3、修改 WEB-INF\classes 目录下struts.xml 文件,...
struts2 最新漏洞 S2-016、S2-017修补方案 .docx
主要是ognl的用法,很适合新手上路的,源代码很清晰可见,一看就懂