各种表达式如下:(导入相关jar包,OGNL.jar 和javassist.jar)
package com.ognl;
import java.util.ArrayList;
import java.util.List;
import ognl.Ognl;
import ognl.OgnlContext;
public class OgnlTest {
public static void main(String[] args) throws Exception {
Person person = new Person();
person.setName("zhangsan");
Dog dog = new Dog();
dog.setName("wangcai");
Dog dog2 = new Dog();
dog2.setName("maomao");
person.setDog(dog2);
OgnlContext context = new OgnlContext();//实现了map接口
context.put("person", person);
context.put("dog", dog);
context.setRoot(person);
Object object = Ognl.parseExpression("name");
System.out.println(object);//name
/*
* Ognl.getValue(object,context,context.getRoot())
* 它会到指定的上下文context中去寻找object,默认是到根元素中寻找
* 在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get()
* 方法,如果寻找的不是根对象的中的属性,那么需要以#开头,告诉OGNL,去寻找指定对象中的属性
*/
Object object2 = Ognl.getValue(object, context,context.getRoot());
System.out.println(object2);//zhangsan
Object o = Ognl.getValue("name", context,context.getRoot());
System.out.println(o);//zhangsan
Object object3 = Ognl.getValue("#dog.name",context,context.getRoot());
System.out.println(object3);//wangcai
Object object4 = Ognl.getValue("#person.dog.name", context,context.getRoot());
System.out.println(object4);//maomao
/*
* 调用属性所用的方法
*/
System.out.println("-------------------------------");
//Object obj = Ognl.getValue("getName().toUpperCase()", context,context.getRoot());//效果同下
Object object5 = Ognl.getValue("name.toUpperCase()", context,context.getRoot());
System.out.println(object5);//ZHANGSAN
System.out.println("--------------------------------");
/*
* 当使用OGNL调用静态方法的时候,需要按照如下的语法编写表达式
* @package.classname@method(parameters)
* 较特殊的类:对OGNL来说,java.lang.Math是其默认的类,即调用java.lang.Math的静态方法时,
* 无需指定类的名称
*/
Object object6 = Ognl.getValue("@java.lang.Integer@toBinaryString(10)",context,context.getRoot());
System.out.println(object6);//1010
Object object7 = Ognl.getValue("@@min(7,10)", context,context.getRoot());
System.out.println(object7);//7
System.out.println("----------------------------");
/*
* 数组和集合
* 都是通过下标索引访问
*/
Object object8 = Ognl.getValue("{'aa','bb','cc'}[2]", context,context.getRoot());
System.out.println(object8);//cc
System.out.println("-------------------------");
/*
* 映射Map
* 语法格式如下:
* #{'key1':'value1','key2':'value2'}
*/
Object object9 = Ognl.getValue("#{'key1':'value1','key2':'value2'}['key2']", context,context.getValues());
System.out.println(object9);//value2
System.out.println("--------------------------");
/*
* 过滤
* 格式:
* collection.{? expression}
* 返回的是集合
* #this表示遍历时每个对象(联想增强for循环)
*/
List<Person> list = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setName("hehe");
p2.setName("xixi3");
p3.setName("haha333");
list.add(p1);
list.add(p2);
list.add(p3);
context.put("list",list);
System.out.println(Ognl.getValue("#list.{? #this.name.length() > 4}.size()", context,context.getRoot()));//2
/*
* 过滤获取集合中的第一个元素
* 表达式:
* collection.{^ expression}
* 返回值为集合
*/
System.out.println(Ognl.getValue("#list.{^ #this.name.length() > 4}.get(0).getName()", context,context.getRoot()));//xixi3
/*
* 过滤器取得集合中最后一个元素
* 表达式:
* collection.{$ expression}
*/
System.out.println(Ognl.getValue("#list.{$ #this}[0].name", context,context.getRoot()));//haha333
/*
* 投影
* 表达式:
* collection.{expression}
* 返回集合,返回集合长度和原来集合的长度相等
* 返回的集合中的对象是原来对象的子集
*
* 过滤与投影的区别:
* 类比于数据库中的表,过滤是取行,而投影是取列的操作
*/
System.out.println(Ognl.getValue("#list.{name}", context,context.getValues()));//[hehe, xixi3, haha333]
System.out.println(Ognl.getValue("#list.{#this.name.length()>4?'Hello world':#this.name}", context,context.getRoot()));//[hehe, Hello world, Hello world]
}
}
在Struts2中,根对象就是ValueStack(一个堆栈),在Struts2的任何流程中,ValueStack中的最顶层对象一定是Action对象。
以下几个对象,叫做“命名对象” ,不在ValueStack中:
类名 | 访问方式 |
parameters(客户端传向服务器端的参数) | #parameters.uernme |
request | #request.username |
application | #application.username |
访问 静态方法或静态成员变量的改进@vs@method(其中vs表示ValueStack)