1. OGNL(Object Graph Navigation Language) ,对象图导航语言
2. OgnlContext(上下文对象) ,存在唯一的叫做根的对象(root) ,可以通过程序设定上下文当中的哪个对象作为根对象。
3. 在 OGNL 中,如果表达式没有使用#号,那么 OGNL 会从根对象中寻找该属性对应的 get 方法, 如果寻找的不是根对象中的属性, 那么则需要
以#号开头,告诉 OGNL,去寻找你所指定的特定对象中的属性。
4. 当使用 OGNL 调用静态方法的时候, 需要按照如下语法编写表达式:@package.classname@methodname(parameter)
5. 对于 OGNL 来说,java.lang.Math 是其的默认类,如果调用java.lang.Math 的静态方法时, 无需指定类的名字, 比如: @@min(4,10);
6. 对于 OGNL 来说, 数组与集合是一样的, 都是通过下标索引来去访问的。构造集合的时候使用{ … }形式。
7. 使用 OGNL 来处理映射(Map)的语法格式如下所示:#{‘key1’: ‘value1’, ‘key2’: ‘value2’, ‘key3’: ‘value3’};
8. 过滤(filtering) :collection.{? expression}
9. OGNL 针对集合提供了一些伪属性(如 size,isEmpty) ,让我们可以通过属性的方式来调用方法(本质原因在于集合当中的很多方法并不符合 JavaBean 的命名规则),
但并不是所有的方法都是伪属性,但我么你依然还可以通过调用方法来实现与伪属性相同的目的。
10. 过滤(filtering) ,获取过滤得到的集合中的第一个元素:collection.{^ expression}
11. 过滤(filtering) ,获取过滤得到的集合中的最后一个元素:collection.{$ expression}
12. 在使用过滤操作时,我们通常都会使用#this,该表达式用于代表当前正在迭代的集合中的对象(联想增强的 for 循环)
13. 投影(projection ) :collection.{expression}
14. 过滤与投影之间的差别:类比于数据库中的表,过滤是取行的操作,而投影是取列的操作。
15. 在 Struts2 中有一个称之为值栈的概念(ValueStack) ,如图:
16. 在 在 Struts2 中,根对象就是 ValueStack 。在 在 Struts2 的任何流程当中,ValueStack 中的最顶层对象一定是 Action 对象。
17. parameters,#parameters.username ; request, #request.username ; session, #session.username ; application, #application.username ;
attr, #attr.username 以上几个对象叫做“命名对象” 。
15. ValueStack 与命名对象的关系图示:
16. 访问静态方法或是静态成员变量的改进。@vs@method //vs代表valueStack
17. 关于 Struts2 标签库属性值的%与#号的关系:
1). 如果标签的属性值是 OGNL 表达式,那么无需加上%{}。
2). 如果标签的属性值是字符串类型,那么在字符串当中凡是出现的%{}都会被解析成 OGNL 表达式,解析完毕后再与其他的字符串进行拼接构造出最后的字符串值。
3). 我们可以在所有的属性值上加%{},这样如果该属性值是 OGNL 表达式,那么标签处理类就会将%{}忽略掉。
18. #this 表示当前带操作的对象
19. 伪属性:size对应size(),可以直接通过伪属性调用方法。并不是所有的方法都有伪属性,伪属性不好记,建议直接访问方法。
20. 页面struts标签通过OGNL获取数据,struts封装了OGNL,会将action,request等放到OGNL内容中
21. 我们可以通过ActionContext获取相关属性:ActionContext.getContext().get("request").get("属性名")
22. attr取值会从范围小的到范围大的
23. <s:property value="password" > 会将里面的属性当做OGNL表达式来去处理,<s:a href ="" > 只会讲href中的内容当做普通字符串处理。
%{}标志大括号内的内容为ONGL表达式,获取表达式计算结果后,将结果和前面的字符串拼接在一起。
参考代码: