Struts标签库之OGNL

Ognl(Object Graph Navigation Language)对象图导航语言
1. OgnlContext(上下文对象)实现map接口,存在唯一的根对象(root),可以通过程序设定上下文当中的哪个对象作为根对象。
2. 在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get方法,如果寻找的不是根对象中的属性,那么则需要以#号开头,告诉OGNL,去寻找你所指定的特定对象中的属性。
3. 当使用OGNL调用静态方法的时候,需要按照如下语法编写表达式:
@package.classname@methodname(parameter)
4. 对于OGNL来说,java.lang.Math是其默认类,如果调用java.lang.Math的静态方法时,无需指定类的名字,比如:@@min(3,6);
5. 对于OGNL来说,数组与集合是一样的,都是通过下标索引来去访问的。构造集合的时候使用{ …}形式。
6. 使用OGNL来处理映射(Map)的语法格式如下所示:
“#{‘key1’:’value1’, ‘key2’:’value2’,’key3’:’value3’}”;
7. OGNL针对集合提供了一些伪属性(如size,isEmpty),让我们可以通过属性的方式来调用方法(本质原因在于集合当中很多方法并不符合JavaBean的命名规则),但我们依然还可以通过调用方法来实现与伪属性相同的目的。
8. 过滤(filtering):collection.{? expression}, 获取到集合中的第一个元素:collection.{^ expression}, 获取到集合中的最后一个元素:collection.{$ expression}
9. 在使用过滤操作时,我们通常都会使用#this,该表达式用于代表当前正在迭代的集合中的对象。
10. 投影(projection):collection.{expression}
11. 过滤与投影之间的差别:类比于数据库中的表,过滤是取行的操作,二投影是取列的操作。
12. 在struct2中有一个称之为值栈的概念(ValueStack)。ValueStack通过N语法与top关键字就可以访问到ValueStack中的任意对象。
13. 在struts2中,根对象就是ValueStack。在Struts2的任何流程当中,ValueStack中的最顶层对象一定是Action对象
14.Struts2中的命名对象
parameters #parameters.username;
request #request.username;
session #session.username;
application #application.username;
attr #attr.username;
15. 关于struts2标签库属性值的%与#号的关系:
- 如果标签的属性值是OGNL表达式,那么无需加上%{}.
- 如果标签的属性值是字符串类型,那么在字符串当中凡是出现%{}的部分都会被解析成OGNL表达式,解析完毕后再与其它字符串进行拼接构造出最终的字符串值.
- 我们可以在所有的属性值上加%{},这样如果该属性值是OGNL表达式,那么标签处理类就会将%{}忽略掉.
实例代码:

        Person person = new Person();
        person.setName("zhangsan");

        Dog dog = new Dog();
        dog.setName("wang");

        OgnlContext context = new OgnlContext();
        context.put("person", person);
        context.put("dog", dog);

        context.setRoot(person); //设置根对象

        Object obj = Ognl.parseExpression("name");
        Object obj1 = Ognl.getValue(obj, context, context.getRoot());
        System.out.println(obj1);

        System.out.println("-----------------");
        Object obj2 = Ognl.parseExpression("#person.name");
        Object obj3 = Ognl.getValue(obj2, context, context.getRoot());
        System.out.println(obj3);

        System.out.println("-----------------"); 
        Object obj4 = Ognl.parseExpression("#dog.name");
        Object obj5 = Ognl.getValue(obj4, context, context.getRoot());
        System.out.println(obj5);

        System.out.println("-----------------");
        Object obj6 = Ognl.parseExpression("#dog.name.toUpperCase()"); //调用方法
        Object obj7 = Ognl.getValue(obj6, context, context.getRoot());
        System.out.println(obj7);

        System.out.println("-----------------");
        Object obj8 = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)");
        Object obj9 = Ognl.getValue(obj8, context, context.getRoot());
        System.out.println(obj9);

        System.out.println("-----------------");
        Object obj10 = Ognl.getValue("@@max(4,8)", context, context.getRoot());
        System.out.println(obj10);

        System.out.println("-----------------");
        Object obj11 = Ognl.getValue("new java.util.LinkedList()", context, context.getRoot());
        System.out.println(obj11);

        System.out.println("-----------------"); //生成集合
        Object obj12 = Ognl.getValue("{'aa','bb','cc'}[1]", context,context.getRoot());
        System.out.println(obj12);

        System.out.println("-----------------");//生成数组
        Object obj13 = Ognl.getValue("new java.lang.String[]{'aa','bb','cc'}[2]", context, context.getRoot());
        System.out.println(obj13);

        ArrayList<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("chm");

        context.put("list", list);

        System.out.println("-----------------");
        Object obj14 = Ognl.getValue("#list[1]",context, context.getRoot());
        System.out.println(obj14);

        System.out.println("-----------------");//处理映射(map)
        Object obj15 = Ognl.getValue("#{'key1':'value1','key2':'value2','key3':'value3'}['key2']", context , context.getRoot());
        System.out.println(obj15);

        System.out.println("-----------------");
        ArrayList<Person> persons = new ArrayList<Person>();
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
        p1.setName("zhangsan");
        p2.setName("lisi");
        p3.setName("wangwu");
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        context.put("persons", persons);

        //过滤(filtering)
        Object obj16 = Ognl.getValue("#persons.{? #this.name.length() > 4}[0].name", context, context.getRoot());
        System.out.println(obj16);

        //获取结果集合中的第一个元素
        Object obj17 = Ognl.getValue("#persons.{^ #this.name.length() > 4}[0].name", context, context.getRoot());
        System.out.println(obj17);

        //获取结果集合中的最后一个元素
        Object obj18 = Ognl.getValue("#persons.{$ #this.name.length() > 4}[0].name", context, context.getRoot());
        System.out.println(obj18);

        //投影(projection)
        Object obj19 = Ognl.getValue("#persons.{name}", context, context.getRoot());
        System.out.println(obj19);

        System.out.println("-----------------");
        Object obj20 = Ognl.getValue("#persons.{#this.name.length()>4?'hello':#this.name}", context, context.getRoot());
        System.out.println(obj20);

你可能感兴趣的:(Ognl)