引言: 闲话不多说,最近项目结束,天天泡在CSDN论坛上,不乏看到一些好的文章,在此与君共勉...
原文地址:http://blog.csdn.net/wyply115/article/details/8257140 ,有兴趣的朋友可以去他博客学习学习...
一、ValueStack
1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用
实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.
2.ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象.
3.struts2把ValueStack对象保存在名为:struts.valueStack的request域中.即ValueStack作用域为request.当action创建的时候,ValueStack就创建了,action被销毁的时候,ValueStack就销毁了
4.ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext)
(1) * 其中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的方法:push(),和pop()方法,
用来对root对象中所包含的数据进行存取.正是由于这两个方法,CompoundRoot变成了一个栈结构.
* struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack
的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.
(2)* 其中的context对象是OgnlContext,它实现了map接口,在valuestack的默认实现类中,即OgnlValueStack类中,
调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可知,
此方法返回的是一个OgnlContext对象.
5.获取ValueStack的三种方式
(1)ValueStack valueStack = ActionContext.getContext().getValueStack();
ActionContext为Action的上下文,其中有重要的6大对象
* valueStack,parameters,request,session,application,attr
* 而ognl表达式必须选择AcitonContext中的一个对象作为根对象(root),默认为valueStack,因此访问valueStack中的数据不加#
而如果要使用另外5个对象作为根对象,需要加#前缀.
(2)ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());
ServletActionContext继承了ActionContext,它与web容器耦合,可以获取web容器的一些信息.
(3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
6.ValueStack内存结构图
7.常用的存储数据的方法
(1)向map栈中存数据,即ValueStack中的context(OgnlContext)
* 通过request,session等向map中存储数据
ServletActionContext.getRequest().setAttribute("username","joey");
ServletActionContext.getSession().put("pwd","123");
* 直接向map栈中放数据
ActionContext.getContext().put("msg","how you doing");
(2)向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象
* 先得到root,再把数据压入到root中,这中方式是放入到栈底.
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(new Person());
* 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.
* 存放一个map到对象栈中
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.
* 利用valueStack的push方法把一个对象直接压入栈顶
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.push(new Person());
8.利用OGNL表达式取ValueStack中的数据
(1)<s:property />:取栈顶的元素.
(2)<s:iterator />:取栈顶的元素.
注意:此标签的value属性值无论来自对象栈还是Map栈,都可以不加#前缀(<s:select/>标签也适用).
因为此标签在迭代的时候,总是把当前正在迭代的元素放入到栈顶.
二、ognl
1.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性.
它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中.
2.Root对象
OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象.
例如:
[java] view plaincopyprint?
1. public class User{
2. private String username;
3. private Group group;
4. //省略setter,getter方法
5. }
6. public class Group{
7. private String name;
8. private Organization org;
9. //省略setter,getter方法
10. }
11. public class Organization{
12. private String orgId;
13. //省略setter,getter方法
14. }
[java] view plaincopyprint?
1. public class User{
2. private String username;
3. private Group group;
4. //省略setter,getter方法
5. }
6. public class Group{
7. private String name;
8. private Organization org;
9. //省略setter,getter方法
10. }
11. public class Organization{
12. private String orgId;
13. //省略setter,getter方法
14. }
public class User{
private String username;
private Group group;
//省略setter,getter方法
}
public class Group{
private String name;
private Organization org;
//省略setter,getter方法
}
public class Organization{
private String orgId;
//省略setter,getter方法
}
以上三个类,描述了通过一个User对象,同过User对象可以导航到Group对象,进而导航到Organization对象.
以User为根,通过基本的getters方法,可以访问到此根对象的其它关联对象.【对象图的导航,必须通过getters方法导航】
注意: * 导航的目的,就是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法.
* OGNL表达式语言的真正目的,是为了在那些不能写java代码的地方执行java代码,或者是为了更方便的执行java代码.
3.Context对象
* 在OGNL表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到
Map中即可.而这个Map对象称为Context
* 要在表达式访问到context中的对象,需要使用"#对象名称"的语法规则.
* 存在context的主要原因就是在OGNL中,不支持多个root对象,而如果需要在表达式中访问多个毫不相关的对象时,
只能通过一个Map来把这些对象统一传递给OGNL.
- 大小: 100.4 KB
分享到:
相关推荐
Struts2 OGNL表达式实例详解 Struts2 OGNL表达式实例详解主要介绍了Struts2 OGNL表达式实例详解,相关实例代码,需要的朋友可以参考。Object Graph Navigation Language(对象图导航语言),就是用点来访问成员变量...
### Struts2中OGNL的概念及原理说明 #### 一、OGNL表达式的基本用法与特点 **OGNL**,即**Object Graphic Navigation Language**(对象图导航语言),是Struts2框架中用于处理对象及其属性的强大工具之一。通过...
**OGNL详解** OGNL是一种强大的表达式语言,用于在Java对象图中导航并执行操作。在Struts2中,OGNL被广泛用于表示层与业务层数据的交互。 1. **OGNL的基本语法** - OGNL表达式通常以`#`字符开始,用于引用...
- 在Struts2中,可以使用OGNL来访问ValueStack中的值。ValueStack是Struts2的核心组件之一,用于存储请求期间的数据。 - 例如,可以通过`<s:property value="cat.name"/>`来获取Cat对象的name属性值。 - 使用`#`...
4. **Struts2_2.1.6版本的中文问题** 在某些版本的Struts2中,可能出现处理中文字符集的问题。这可能需要配置应用服务器或web.xml以指定正确的字符编码,如设置`<filter>`和`<filter-mapping>`元素以使用UTF-8编码...
Struts 2 的核心技术基础是WebWork,它在Struts 1的基础上进行了许多改进,如更强大的表达式语言(OGNL)、拦截器机制、更简单的配置等。WebWork的这些特性被集成到Struts 2中,使得Struts 2成为了一个高效且易用的...
总结来说,Struts2 API为Java Web开发提供了强大的工具,通过Action、Interceptor、ValueStack、OGNL、配置文件等元素,实现了一种灵活、可扩展的MVC模式。熟练掌握Struts2 API的使用,可以提升开发效率,构建出高效...
### Struts2综合复习知识点详解 #### 一、Struts2标记库中迭代标签iterator的()方法是判断当前元素是否是第偶数个元素。 **答案解析:** - 正确答案为 **D.isEven**。 - Struts2中的`<s:iterator>`标签用于迭代...
Struts2的核心组件包括Action、Result、Interceptor(拦截器)、ValueStack(值栈)等。Action是业务逻辑的执行者,Result负责处理Action执行后的结果,Interceptor用于在Action调用前后进行额外的操作,而...
Struts2标签库详解 Struts2作为一款强大的MVC框架,其标签库是其核心功能之一,极大地简化了开发者在视图层的工作,提高了开发效率。本文将深入解析Struts2标签库,帮助读者理解并掌握其用法。 1. **简介** ...
- **ValueStack与Ognl**:理解ValueStack的作用,它是如何存储Action上下文数据的,以及Ognl表达式语言的使用。 3. **Struts 2的拦截器** - **自定义拦截器**:创建和使用自定义拦截器,理解其工作流程和生命周期...
Struts2的核心之一就是它对于参数传递的支持能力,这一点主要依赖于OGNL(Object-Graph Navigation Language)和ValueStack。通过这两个组件,Struts2实现了动态的数据绑定和灵活的类型转换功能。 #### 二、OGNL与...
最后,我们将深入探讨Struts2的核心技术,如Action、Interceptor、Result、ValueStack等,以及它们如何协同工作来处理用户请求。同时,我们还会讨论如何在实际项目中整合Struts2与其他技术,如Spring、Hibernate等,...
这个API详解的CHM文件“Struts 2 Core 2.0.1 API”是开发者的重要参考资料,它详细列出了框架的核心组件、接口、类和方法,帮助开发者深入理解和使用Struts2框架。 Struts2的核心组件包括Action、Result、...
Struts2中OGNL遍历数组、List和Map方法详解 Struts2框架中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于在Web应用程序中访问和操作对象。其中,OGNL遍历数组、List和Map是常见的操作,...
3. **ValueStack与OGNL**: Struts2使用ValueStack作为模型数据容器,它将Action实例和Action属性放入栈中,便于视图层访问。OGNL(Object-Graph Navigation Language)是Struts2默认的表达式语言,用于在Action和...
根据给定的信息,我们将深入探讨Struts2框架中的一些核心概念,包括OGNL表达式的使用、ValueStack的理解及其数据存取方法,以及拦截器的生命周期等。 ### OGNL表达式及其三要素 #### OGNL简介 OGNL(Object-Graph ...
- 书籍《软件开发新课堂 Struts2 基础与案例开发详解》光盘中的源码,是学习Struts2的宝贵实践材料,通过阅读和分析代码,可以深入理解Struts2的内部机制和实际应用。 - 视频教程:如果光盘内包含视频教程,建议...
此外,它还可能涵盖了ActionSupport类、ValueStack、OGNL(Object-Graph Navigation Language)表达式等关键概念的解释。 **struts2入门教程(共13章).chm**则更倾向于是一份教学性质的资料,它可能会逐步引导初学...
### Struts2 `<s:if>` 标签使用详解 #### 概述 Struts2 是一款基于 Java 的企业级 Web 应用框架,它利用了 MVC(Model-View-Controller)架构模式来帮助开发者构建可扩展、易于维护的 Web 应用程序。在 Struts2 中...