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