- 浏览: 310214 次
最新评论
-
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 163531.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 3071A.2.1 概述 如果我们希望覆盖在 ... -
《研磨struts2》附录A Struts2的配置 之 A.1 struts.xml的配置
2012-07-09 12:10 2719A.1 struts.xml的配置 A.1.1 ... -
《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置
2012-07-06 08:07 292921.3 通过注解来实现零配置 21.3.1 ... -
《研磨struts2》第二十一章 零配置 之 21.2 约定大于配置
2012-07-05 10:44 247421.2 约定大于配置 21.2.1 约定 ... -
《研磨struts2》第二十一章 零配置 之 21.1 概述
2012-07-05 10:44 232621.1 概述 21.1.1 零配置概述 在 ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.3 整合Struts2与SiteMesh
2012-07-04 08:15 2089在Struts2中使用SiteMesh ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.2 单独使用SiteMesh
2012-07-03 08:00 210520.2 单独使用SiteMesh 20. ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.1 调整应用的风格
2012-07-03 07:59 187020.1 调整应用的风 ... -
《研磨struts2》19.2 使用execAndWait拦截器模拟进度条 之 19.2.1 模拟长时间运行的Action
2012-07-02 12:24 214919.2.1模拟长时间运行的Action ... -
《研磨struts2》第十九章 进度条 之 19.1 使用“进度条”告知用户进度
2012-07-02 12:23 215219.1 使用“进度条”告知用户进度 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.3 Struts2结合JFreeChart
2012-06-28 12:12 201518.3 Struts2结合JFreeChart ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.2 Struts2插件概述
2012-06-28 12:11 2031Struts2并没有求大求全,企图把所有 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.1 JFreeChart使用
2012-06-20 15:48 229618.1 JFreeChart使用 18.1.1概 ... -
研磨struts2(1-10章)电子书下载
2012-06-19 07:30 6078研磨struts2的博客文章 私塾在线学习网 《研 ... -
《研磨struts2》第十七章 防止重复提交 之 17.3 更强大的tokenSession拦截器
2012-06-18 13:46 208217.3 更强大的tokenSession拦截器 ... -
《研磨struts2》第十七章 防止重复提交 之 17.2 使用标签
2012-06-18 13:45 233917.2 使用<s:token/>标签 ...
相关推荐
ActionContext是Struts2框架中一个关键的组件,它提供了当前请求上下文的信息,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于在模型和视图之间进行数据传递。下面将详细探讨这两个...
在实际开发中,了解并熟练掌握OGNL和值栈的使用,能显著提高Struts2应用的开发效率和代码可维护性。通过阅读`struts_3`和`struts3_web`这两个文件,你可以进一步深入学习Struts2框架的这些关键特性,并通过实践加深...
同时,也能让我们理解Struts2框架如何将OGNL与动作类、模型对象和视图组件紧密集成。 通过深入学习OGNL的源码,开发者可以更好地定制和优化Struts2应用,提升性能,增强安全性,并能解决遇到的特定问题。这是一项...
在Struts2中,`#`符号主要用于访问OGNL上下文和ActionContext。ActionContext是Struts2框架的核心组件之一,它存储了请求处理过程中的各种上下文信息,如请求参数、会话属性、应用级属性等。通过`#parameters`,你...
总的来说,Struts2的OGNL表达式和ActionContext以及ValuesStack的设计使得数据访问更加灵活和高效。开发者可以方便地在控制器、视图和模型之间穿梭,进行复杂的表达式计算和对象属性操作,同时保持代码的简洁和...
这种灵活性使得OGNL在Struts2中被广泛应用于视图层的渲染和动作类的值传递。 在源代码中,你会看到OGNL的解析器、表达式树构建、类型转换、上下文管理等多个关键部分。这些部分共同构成了OGNL的强大功能: 1. **...
在Struts2的ActionContext中,OGNL查找值栈(ValueStack),这是一个存储所有请求相关对象的数据结构。值栈顶部的对象通常为Action实例,OGNL表达式会在此对象及其关联的对象图中查找属性。 Struts2的标签库也广泛...
在Struts2框架中,OGNL被广泛应用于值栈(Value Stack)之中。值栈是Struts2框架中的核心概念之一,它是一个用于临时存储对象的栈结构,这些对象包括Action实例、模型对象、临时对象等。值栈中的对象可以按照以下四...
6. **值栈**:Struts2中的值栈是OGNL的主要工作区域,它存储了Action对象和其他相关数据。通过`#root`或`#action`关键字,可以直接访问值栈顶部的对象。 7. **表达式过滤器**:为了安全考虑,Struts2允许配置OGNL...
1. **值栈访问**:Struts2使用值栈存储请求中的所有对象,OGNL可以从值栈顶部找到并访问对象。例如,`#request.user.name`表示从HTTP请求对象中获取`user`属性的`name`。 2. **动态方法调用**:OGNL支持直接调用...
7. **OGNL表达式语言**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层语言,用于在Action和视图之间传递数据。源代码中会展示如何使用OGNL表达式。 8. **Action和ActionSupport**:Action...
值栈(ValueStack)是Struts2中用于存储和传递数据的重要工具,它可以方便地在Action和视图之间共享数据。 #### 7.2 值栈的使用 - **获取**:通过ActionContext来获取当前的值栈。 - **存储和读取数据**:可以将...
OGNL作为Struts2框架的核心技术之一,其强大的表达能力和灵活的使用方式极大地提高了开发效率。理解并熟练掌握OGNL的使用,对于深入学习和高效开发基于Struts2的应用程序至关重要。通过本文对OGNL在Struts2中的应用...
第七章则聚焦于值栈和OGNL表达式,这是Struts2中非常重要的两个概念,涉及到数据的存储、检索和表达式的动态执行,对于构建灵活、动态的Web应用至关重要。 ### Struts2的Taglib和其他高级特性 第八章介绍了Struts2...
在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`<s:property>`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...
使用OGNL时,通常配合Struts2的标签,比如`s:property`,通过值栈来访问和显示数据。 3. **EL与值栈的区别**: - Expression Language(EL)虽然也能访问值栈,但它只能从栈顶开始查找,而OGNL可以更灵活地遍历...
- Struts2 ActionContext:OGNL与ActionContext紧密配合,ActionContext存储了请求相关的上下文信息,包括值栈和session等。 - 模板技术集成:FreeMarker、Velocity等模板引擎可以使用OGNL表达式来获取和操作数据...
Struts2是一个流行的Java web框架,它利用OGNL(Object-Graph Navigation Language)作为其核心表达式语言。OGNL是一种强大的表达式语言,允许开发者在Java对象之间导航和操作数据。在Struts2中,OGNL被广泛用于访问...
在 Struts 2 中,OGNL 是默认的表达式语言,原因是它相对其它表达式语言具有多个优势,例如:支持对象方法调用、支持类静态的方法调用和值访问、支持赋值操作和表达式串联等。 在使用 OGNL 时,经常遇到的问题是 #...