OGNL介绍
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
OGNL三要素
(1).expression求值表达式——首先会被解析成对象树
(2).rootobject 根对象——默认的操作对象
(3).contextOGNL执行环境——OGNL执行的上下文环境
OGNL context是一个Map结构,ognl.OgnlContext类implements Map接口,root对象也在context里面,并且做这一个特殊的对象处理,具体表现为对root 对象的操作不需要加#指示符号(并且加上了#一定取不到root对象里面的值).
OGNL中的Ognl类提供了一下额静态方法用于对comtext中的对象进行操作。
我们使用OGNL来做一个实例:
这段程序执行结果能够将user1的userName获取出来,但是并不能获取到user2的任何信息。这是因为我们使用的getValue版本中没有传递context参数值,那么OGNL就会新建一个OgnlContext对象,并把我们的root对象放进去。那么此时在这个新建的context中除了我们的root对象之外就没有其他对象了,因此只能访问root对象。由于OgnlContext类实现了Map接口,我们可以直接使用Map对象来作为参数,Ognl会自动将我们传递的Map对象转换为OgnlContext对象。
public
static Map addDefaultContext(Object root,ClassResolver classResolver,
TypeConverter converter, MemberAccess memberAccess, Map context)
{
OgnlContext result;
if (!(context
instanceof OgnlContext)) {
result = new OgnlContext();
result.setValues(context);
} else {
result = (OgnlContext) context;
}
if (classResolver !=
null) {
result.setClassResolver(classResolver);
}
if (converter !=
null) {
result.setTypeConverter(converter);
}
if (memberAccess !=
null) {
result.setMemberAccess(memberAccess);
}
result.setRoot(root);
return result;
}
Struts2中OGNL
OGNL的功能非常强大,Struts2在原生的OGNL上又做了一些扩展。比如在Struts2中使用valueStack来作为数据存储的载体,并且在Strtus2扩展的OGNL中,root对象可以不只是一个。在Strtus2中的Root使用的是CompoundRoot对象,而CompoundRoot继承了ArrayList,所以他可以存储一系列的对象,这些对象可以看作是OGNL中的root对象。当我们当问某个属性时,CompoundRootAccessor对象实例会负责在CompoundRoot对象中找到包含我们指定属性的对象一般情况下我们只会接触到OGNL的一小部分功能,所以我们就主要学习一下我们可能会用到的知识点,如果要更加深入的学习OGNL,那么可以去看一下OGNL的官方文档,上面有非常详细的介绍。
valueStack
对于每个动作调用,Struts2在执行相应的动作方法之前会先创建一个名为valueStack的对象。valueStack用来保存该动作对象和其他对象。在对动作进行处理的过程中,拦截器需要访问valueStack,视图也需要访问valueStack才能显示动作和其他信息。
valueStack的内部包含两个逻辑部分,一个叫做Object Stack,另一个叫做ComtextMap。Struts2将动作和相关对象压入Object Stack,把各种各样的映射关系(Map类型的对象)压入Comtext Map。
其中的Object Stack中的对象都相当于OGNL中的”root”对象,因此对他们可以直接访问。如果要访问Context Map中的对象,那么就得在OGNL表达式前面加上”#”符号。如果没有加”#”,那么Struts2默认会在Object Stack中进行搜索。
Strut2会把下面的这些映射关系压入到Context Map中:
(1)parameters:这个Map中包含当前请求的请求参数
(2)request:包含当前请求的所有属性
(3)session:包含当前请求的会话的所有属性
(4)application:包含当前应用程序的ServletContext属性
(5)attr:这个Map用来按照这个顺序来检索某个属性:request、session、application
注意:请求参数总是返回一个String类型的数组。比如我们要想知道请求参数的个数,那么正确的表达式应该是#parameters.count[0],而不是#parameters.count。
访问Object Stack中对象的属性
访问Object Stack里某个对象的属性,可以使用一下几种形式:
(1)object.propertyName
(2)object[‘propertyName’]
(3)object[“propertyName”]
另外,Object Stack里的对象还可以通过一个从零开始的下索引来引用。最顶端的对象用[0]来引用,以此类推。Strtus2中Action对象一定是位于valueStack的最顶端。
例如:[0].propertyName [0][‘propertyName’] [0][“propertyName”]
Struts2中的OGNL还有个特征:如果我们指定的对象上没有找到指定的属性,那么会到指定对象的下一个对象里继续搜索,直到找到这个属性或者到达栈低。(其实现原理就是我们上面说的CompoundRoot和CompoundRootAccessor)。
还有就是如果我们指定的属性本身也是对象,那么还可以通过同样的语法去访问这个属性对象的属性。例如:user.name.firstName
访问Context Map上的属性
访问Context Map上的属性的方法我们在介绍valueStack的时候已经学习过了。这里要说的是如果我们访问的属性也是对象,那么还可以通过同样的语法来访问它的属性。例如:#request[“User”][“name”]。
调用静态属性和方法
OGNL除了能够调用压入valueStack中的对象外,还能对任意的Java类的静态属性和方法进行调用。其表达式形式如下:
调用静态属性: @类的全称(含包名)@静态属性名
调用静态方法: @类的全称(含包名)@静态方法名(参数列表)
对于压入valueStack中的对象,如果要调用其方法,直接使用object.methodName(arglist)形式进行调用.
访问数组、List和Map类型
访问数组和List类型的对象中对象的方法相同,都是使用从零开始的数字索引的形式,同时也可以调用数组和List类型对象上的方法。
访问Map类型对象中的对象时需要将map中的key作为索引或者将key作为属性的方式访问,将返回与该key所对应的value
投影与选择
OGNL支持类似数据库中的投影(projection) 和选择(selection)。
投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。
例如:group.userList.{username}将获得某个group中的所有user的name的列表。
选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:
? 选择满足条件的所有元素
^ 选择满足条件的第一个元素
$ 选择满足条件的最后一个元素
例如:group.userList.{?#this.name != null}将获得某个group中user的name不为空的user的列表。
创建List/Map对象
如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。
创建List:<s:set name="list"value="#{'zhangming','xiaoi','liming'}" />
创建Map:#{ "foo" : "foo value","bar" : "bar value" }
几种与OGNL有关的符号
在Struts2中使用OGNL经常会接触到几个有关的符号:”#”,”%”,”$”。刚开始学习的时候经常分布清楚这几个符号的作用,这里我们对他们的作用大致做一个列举。
“#”的作用:
(1)访问非root对象的属性。例如:#session[“userName”]
(2)对集合进行投影与选择
(3)构造对象,
“%”的作用:
在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式 <s:property value="%{#foobar['foo1']}" />
“$”的作用:
(1)在配置文件中引用OGNL表达式(访问Action的属性)。
(2)在国际化资源文件中引用OGNL表达式(学习国际化时会学到)
OGNL中的this指针
在很多编程语言中,都有this指针的概念,它表示调用当前函数(方法)的对象。那么在OGNL中也有类似的概念。
我们已经学过,OGNL表达式是以”.”进行串联的的一个串字符串表达式。这个表达式在被执行的时候,从左到有,每一次计算都会返回一个临时的当前对象,并在此临时对象上再次进行调用,直到执行完毕。这个临时的当前变量就存储在一个叫做this的变量中,这个this变量我们就叫它this指针。通过使用this指针,我们可以是OGNL更加灵活,更加强大。
注:使用this指针时,必须在this前面加”#”,即this指针必须以“#this”的形式出现。
例如:group.userList.size().(#this+1).toString()
我们可以查看ValueStack接口的实现类OgnlValueStack的源代码,会发现我们对valueStack的栈操作(pop,push,peek)实际上是对CompoundRoot类型的成员变量root的操作,而不是对Map类型的context成员变量的操作,并且root中存放的都是HashMap对象。查找的过程为现在root中进行查找,如果没有找到,那么就会在Map类型的context成员变量中进行查找。具体的实现原理需要我们去研究源代码。
分享到:
相关推荐
本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与ValueStack、Tags以及项目中的关键实践。 **一、Action** Action是Struts2中处理业务逻辑的核心组件,它是实现了`...
本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
Struts2 OGNL语言学习笔记 OGNL(Object-Graph Navigation Language)是 Struts 2 中的一种表达式语言,主要用于简化 JSP 页面中的编码,使页面与后台代码分离。下面是 OGNL 语言的主要特点和用法: 1. 支持对象...
13. ** strut2四天笔记**:这份学习笔记可能涵盖了以上所有知识点,包括如何创建Action,配置struts.xml,使用OGNL表达式,处理异常,以及实践中的各种技巧和最佳实践。 在四天的学习过程中,你应该通过实践和理解...
### Struts2学习笔记知识点详解 #### 一、准备工作及实例 **1. 解压struts-2.1.6-all.zip** - **Apps目录**:包含struts2自带的例子程序,适合初学者通过实际案例了解框架的基本用法。 - **Docs目录**:官方文档...
本笔记将深入探讨Struts2的核心概念、发展历程、使用方法以及与OGNL(Object-Graph Navigation Language)的结合应用。 **一、Struts2概述** 1.1 为什么要用Struts 在Java Web开发中,Struts2作为MVC框架,能够...
本学习笔记将深入探讨Struts2的核心概念、架构以及实际应用。 一、Struts2框架概述 1. 架构:Struts2基于Model-View-Controller(MVC)设计模式,将业务逻辑、数据处理和用户界面分离,提高了代码的可读性和可维护...
Struts2_OGNL笔记主要关注的是如何在Struts2框架中使用OGNL(Object-Graph Navigation Language)表达式语言。OGNL作为一种强大的表达式语言,常用于Struts2的视图层,允许开发者轻松地访问和操作Java对象的属性。 ...
本学习笔记将对Struts1和Struts2进行详细解析。 **Struts1简介** Struts1是早期流行的MVC框架,它的核心是ActionServlet,负责处理HTTP请求,并通过ActionForm对象收集表单数据,然后调用Action类的方法进行业务...
本篇笔记主要介绍了在Struts2中使用OGNL的一些基本用法。 首先,OGNL可以用来获取不同范围内的属性值。在Java Web开发中,有四种常见的作用域:Request、Session、Application和Page。在示例代码中,`<s:property>`...
这份"struts2学习笔记和源码"资源是学习这个框架的理想材料,特别适合初学者。 一、Struts2框架基础 Struts2是Apache软件基金会下的一个项目,它是Struts1的升级版,弥补了Struts1的一些不足,如动作映射和拦截器等...