OGNL

http://www.cnblogs.com/xly1208/archive/2011/11/19/2255500.html

1.OGNL(Object Graph Navigation Language),对象图导航语言。是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

 

2.jar包:

  • ognl-3.0.jar
  • javassist-3.7.ga.jar

 

3.OgnlContext(上下文对象),实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。存在唯一的叫根的对象(root),可以通过程序设定上下文当中的那个对象作为根对象。在ognl中,如果表达式没有使用#号,那么ognl会从根对象寻找该属性对象的get方法,如果寻找的不是根对象的属性,那么则需要以#号开头,告诉OGNL,去寻找你所指定特定对象的属性。

  • OgnlContext context = new OgnlContext()
  • 设置根对象:context.setRoot(Object object)
  • 解析一个表达式:Object object = Ognl.patseExpression("name")     结果:name
  • Object object = Ognl.getValue(object(解析之后的对象),context(上下文),getRoot()(根))

 

4.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。

 

5.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

 

6.操作对象的特定方法

  • Object object = Ognl.parseExpression("name".toUpperCase().length())
  • Object object2 = Ognl.getValue(object,context,getRoot())

7.使用OGNL调用静态方法

  • @package.classname@methodname(parameter)
  • Object object = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)")

8.对于OGNL来说,java.lang.Math是其默认的类,如果调用java.lang.Meth的静态方法,无需指定类的名字,比如:@@min(4,10)

9.getValue()

  • Ognl.getValue(Object tree,Map context,Object root)
  • Ognl.getValue(String expression,Map context,Object root)

10.对于OGNL来说,数组与集合是一样的,都是通过下标索引来访问的。构造集合的时候使用{。。。}形式。

  • Ognl.getValue("{'aa','bb','cc','dd'},context,context.getRoot()")   结果:【aa,bb,cc,dd】
  • Ognl.getValue("{'aa','bb','cc','dd'},context,context.getRoot()")   结果:【aa,bb,cc,dd】

11.OGNL的映射,使用OGNL来处理映射(map)的语法格式:

  • #{'key1':'value1','key2':'value2'}
  • Ognl.getValue("#{'key1':'value1','key2':'value2'}",context,contect.getRoot())   结果:【key1=value1,key2=value2】
  • Ognl.getValue("#{'key1':'value1','key2':'value2'}[key2]",context,contect.getRoot())   结果:value2

12.过滤(filtering):对集合过滤,返回符合条件的子集合

  • Conllection.{?expression}
  • 获得集合中第一个元素,返回集合: Conllection.{^expression}
  • 获得集合中最后一个元素,返回集合:Collection.{$exoression}

13.在使用过滤操作时候,我们通常会使用#this,该表达式用于代表当前正在迭代的集合中的对象(联系增强的for循环)

14.OGNL针对集合提供了一些属性(size,isEmpty),让我们可以通过属性的方式来调用方法(本质在于集合当中的很多方法并不符合javaBean的命名规则),但依然还可以通过调研方法来实现与伪属性相同的目的。    就是方法调用时  .size  无后面的括号

15.投影(projection),collection.{expression}

16.过滤与投影的区别:类比于数据库中的表,过滤是取行的操作,而投影是取列的操作

17.在Struts2中有一个称之为值栈的概念(ValueStack),后进先出。在struts2的任何流程中,ValueStack中最顶层对象一定是action对象

  • 接口 ValueStack (从上向下访问)
  • Class OgnlValueStack
  • 【N】,【1】,索引为1,及其下面的子栈
  • top,[1].top,索引为1的最顶端的栈

 

18.命名对象

  • parameters(客户向服务器所发出的请求参数)  #parameters.username
  • request  #request.username
  • session  #session.username
  • application #application.username
  • attr #attr.username

ValueStack与命名对象的关系图

19.

20.关于struts2标签库属性值%与#的关系

  • 若标签的属性值为OGNL表达式,则无需%{}
  • 若标签的属性值为字符串类型,那么在字符串当中凡是出现的%{}都会被解析成OGNL表达式,解析完毕后再与其他的字符串进行拼接构造出最后的字符串值
  • 可以在所有的属性值上加%{},若该属性值为OGNL,则标签处理类就会将%{}忽略掉

21

posted on 2015-11-23 05:06  彩屏黑白  阅读(230)  评论(0编辑  收藏  举报

导航