一:OGNL
OGNL是Objcet-Graph Navigation Language 的缩写,它是一种功能强大的表达式语言,是一个第三方的开源项目。
Struts2通过使用OGNLtu简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化功能。
Struts2通过jar包ognl-3.*.*jar将ognl项目引入。
相对其它表达式语言,它提供了更加丰富的功能:
1.支持对象方法调用,如,xxx.sayHello()
2.支持类静态方法调用和常量访问,表达式的格式为:
@[全限定性类名]@[方法名 | 常量名 ]
例如:@java.lang.Integer@parseInt("123")或@java.lang.Math@PI
不过,对于静态方法的访问,需要通过在Struts的配置文件struts.xml设置常量struts.ognl.allowStaticMethodAccess的值为ture进行开启。
3.可以操作集合对象
4.可以直接创建对象
struts2框架使用了一个“标准命名上下文”来计算OGNL表达式,用于处理OGNL的最顶层的对象是一个Map(通常被称为上下文Map或上下文)。在上下文Map中,OGNL有一个根对象的概念。在表达式中,根对象的引用不用使用任何“标记”,而引用其它对象则需要使用#标记。
struts2框架将ActionContext设置为OGNL上下文对象,将值栈设置为根对象(值栈原本是从此包含多个对象的集合,但对于OGNL来说,只能包含一个对象)。伴随着值栈(数据的放入),框架会将其它对象置入ActionContext中,其中表现为application,session或request上下文的Map。这些对象将与值栈中的数据共存于ActionContext中。
从以上可知,OGNL中有一个上下文概念,即Context,用于存放数据。OGNL的上下文其实质就是一个Map,其中存放着很多的JavaBean对象,这些对象根据对其操作方式的不同分为了两类:根对象与非根对象。对于非根对象,需要使用#来访问,而对于根对象,则可以直接访问。
无论是根对象还是非根对象,在struts2中均是用于在应用中共享数据的。一般情况下,会在Action方法中存入数据,而在jsp页面中读取数据。