OGNL的理解

1. 什么是OGNL

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,是一个第三方开源项目。
OGNL本身是与Struts2没有任何关系的。但Struts框架使用了OGNL用于进行表达式的计算工作。Struts2通过使用OGNL简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
Struts2通过jar包ognl-3...jar将OGNL项目引入。
OGNL的理解_第1张图片

2. OGNL的特点

相对其它表达式语言,它提供了更加丰富的功能:

  • 支持对象方法调用,如xxx.sayHello()
  • 支持类静态方法调用和常量访问,表达式的格式为:
    @[全限定性类名]@[方法名 | 常量名] 例如:@java.lang.Integer@parseInt(“123”) 或 @java.lang.Math@PI

        <body>
        PI = <s:property value = "@java.lang.Math@PI"/><br>
        random = <s:property value="@java.lang.Math@random() * 100"/>
        body> 
        <struts>
        <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
        struts>

    OGNL的理解_第2张图片

    不过,对于静态方法的访问,需要通过在Struts2的配置文件struts.xml中设置常量struts.ognl.allowStaticMethodAccess的值为true进行开启。

  • 可以操作集合对象
  • 可以直接创建对象

3. OGNL文档解读

OGNL文档截图

(Struts2)框架使用了一个“标准命名上下文”来计算OGNL表达式。用于处理OGNL的最顶层对象是一个Map(通常被称为上下文Map或上下文)。在上下文Map中,OGNL有一个根对象的概念。在表达式中,根对象的引用不用使用任何“标记”,而引用其它对象则需要使用#标记。
(Struts2)框架将ActionContext设置为OGNL上下文对象,将值栈设置为OGNL根对象(值栈是一个包含多个对象的集合,但对于OGNL来说,它是作为一个对象出现的)。和值栈一起,框架也放置了其它对象到ActionContext中,其中包含表现为application、session或request上下文的Map。这些对象将与值栈中的数据共存于ActionContext中。
OGNL的理解_第3张图片

从以上文档的阅读可知,OGNL中有一个上下文概念,即Context,用于存放数据。OGNL的上下文其实质就是一个MAP,其中存放着很多的JavaBean对象。这些对象根据对其操作方式的不同分为了两类:根对象与非根对象。对于非根对象,需要使用#来访问,而对于根对象,则可以直接访问。
无论是根对象还是非根对象,在Struts2中均是用于在应用中共享数据的。一般情况下,会在Action方法中存入数据,而在JSP页面中读取数据。

你可能感兴趣的:(OGNL初学习)