OGNL的理解
1. 什么是OGNL
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,是一个第三方开源项目。
OGNL本身是与Struts2没有任何关系的。但Struts框架使用了OGNL用于进行表达式的计算工作。Struts2通过使用OGNL简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
Struts2通过jar包ognl-3...jar将OGNL项目引入。
2. OGNL的特点
相对其它表达式语言,它提供了更加丰富的功能:
- 支持对象方法调用,如xxx.sayHello()
-
支持类静态方法调用和常量访问,表达式的格式为:
@[全限定性类名]@[方法名 | 常量名] 例如:@aaa@qq.com(“123”) 或 @aaa@qq.com<body> PI = <s:property value = "@java.lang.Math@PI"/><br> random = <s:property value="@aaa@qq.com() * 100"/> </body>
<struts> <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> </struts>
不过,对于静态方法的访问,需要通过在Struts2的配置文件struts.xml中设置常量struts.ognl.allowStaticMethodAccess的值为true进行开启。
- 可以操作集合对象
- 可以直接创建对象
3. OGNL文档解读
(Struts2)框架使用了一个“标准命名上下文”来计算OGNL表达式。用于处理OGNL的最顶层对象是一个Map(通常被称为上下文Map或上下文)。在上下文Map中,OGNL有一个根对象的概念。在表达式中,根对象的引用不用使用任何“标记”,而引用其它对象则需要使用#标记。
(Struts2)框架将ActionContext设置为OGNL上下文对象,将值栈设置为OGNL根对象(值栈是一个包含多个对象的集合,但对于OGNL来说,它是作为一个对象出现的)。和值栈一起,框架也放置了其它对象到ActionContext中,其中包含表现为application、session或request上下文的Map。这些对象将与值栈中的数据共存于ActionContext中。
从以上文档的阅读可知,OGNL中有一个上下文概念,即Context,用于存放数据。OGNL的上下文其实质就是一个MAP,其中存放着很多的JavaBean对象。这些对象根据对其操作方式的不同分为了两类:根对象与非根对象。对于非根对象,需要使用#来访问,而对于根对象,则可以直接访问。
无论是根对象还是非根对象,在Struts2中均是用于在应用*享数据的。一般情况下,会在Action方法中存入数据,而在JSP页面中读取数据。
下一篇: 基于ssm框架上传下载的实现