一、OGNL - 对象图导航语言
Object-Graph Navigation Language
其实就是给定一个对象,然后可以获取这个对象身上的属性值, 也可以给这个对象身上的属性赋值。 也可以调用这个对象方法…
struts底层就是用OGNL表达式来进行赋值的。
1. OGNL 核心元素
* 表达式:用于表示要执行什么操作
* 根元素:root,OGNL会在一定的范围里面查找对象,标注根对象的好处就是便于OGNL区分对象的位置,快速的定位它们的所在,而且OGNL在获取根对象和非根对象的表达式也不尽相同。
* 上下文:在OGNL范围里面,就是一个map集合,表示的就是一个范围,限定我们查询的范围。
2. OGNL 入门演示
1)导入Ognl的jar包
其实在struts基本jar包里面包含了Ognl的jar包;
核心jar包:ognl-3.0.19.jar;
依赖的jar包:javassist-3.11.0.GA.jar
2)Ognl的静态方法:
Ognl.setValue(表达式,根对象,值);
Ognl.getValue(表达式,根对象)
参数1:表达式,就是要操作什么东西,属性或者方法名
参数2:根对象:前面的这个name属性值就是从根对象取出来的。
Ognl可以操作属性,也可以操作方法!
@Test
public void test01() throws OgnlException{
User user1 = new User("张三","123");
User user2 = new User("李四","123");
System.out.println(Ognl.getValue("username", user2));
System.out.println(Ognl.getValue("getUsername()", user2));
//这个代码虽然没有指定map集合,但是猜测。底下会有一个map上下文来包装我们的对象
Ognl.setValue("username", user2, "王五");
System.out.println(Ognl.getValue("getUsername()", user2));
System.out.println(Ognl.getValue("getUsername()", user1));
}
- 表达式 和 根对象 和 上下文(OGNLContext )
其实OGNL 里面表示上下文是有一个具体类来表示的。这个类是OGNLContext , 其实这个类也没有多少特别之处,就是一个Map 。
@Test
public void test02() throws OgnlException{
User user1 = new User("张三","123");
User user2 = new User("李四","123");
Map<String, User> map = new HashMap<String, User>();
map.put("user1", user1);
map.put("user2", user2);
/*
* 参数一: 表达式
* 参数二: 上下文 ,其实就是一个范围
* 参数三: 根对象
*
* #取非根对象上的属性,就必须在前面加 #
* OGNL默认找属性都是在根对象身上找的。如果不加#就表示要在根对象上找属性。
*/
System.out.