1、当使用OGNL调用静态方法的时候,需要按照如下语法编写表达式:
@package.classname@methodname(parameter)
2、对于OGNL来说,java.lang.Math是其的默认类,比如:
@@min(4, 10);
3.、对于OGNL来说,数组与集合是一样的,都是通过下表索引来去访问的,构造集合的时候用{.....}形式。
4、使用OGNL来处理映射(Map)的语法格式如下所示:
#{'key1':'value1', 'key2':'value2', 'key3':'value3'}
5、OGNL作用:过滤(filtering),针对集合
collection.{?expression}
用于过滤和投影(projecting)集合
如person.{?#this.age>20}
? --获取集合中所有满足选择逻辑的对象(拿sql来做比例就是"select * from xxx where age>20")
^ --获取集合中第一个满足选择逻辑的对象(拿sql来做比例就是"select top(1) from xxx where age>20")
$ --获取集合中最后一个满足选择逻辑的对象
6、OGNL针对集合提供了一些伪属性(如size, isEmpty),让我们可以通过属性的方式来调用方法(本质原因在于集合当中的很多方法并不符合JavaBean的命名规则),但我们依然可以通过调用方法来实现与伪属性相同的目的。
7、投影:collection.{expression}
8、投影与过滤之间的差别:类比于数据库中的表,过滤式取行操作,而投影是取列操作。
//查询list集合中name的那一列,其中name的长度小于5的用"hello world"替换,name长度大于5的就返回本身
System.out.println( Ognl.getValue("#list.{#this.name.length() <= 5 ? 'hello world' : #this.name}", context, context.getRoot()));
9、在struts2中有一个称之为值栈的概念(ValueStack),
10、在struts2中,根对象就是valueStact。在struts2的任何流程当中,valueStact中的最顶层对象一定是Action对象。
11、parameters,#parameters.username
request ,#request.username
session,#session.username
application,application.username
attr,#attr.username
以上这些对象称为“命名对象”。
12、valueStack与命名对象的关系图示:
13、访问静态方法或是静态成员变量的改进:
@vs@method