当前位置: 首页 > 工具软件 > OGNL > 使用案例 >

OGNL学习(一)Ognl和OgnlContext

廖臻
2023-12-01

各种表达式如下:(导入相关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)

 类似资料: