1,OGNL(Object-Graph Navigation Language的简称),对象图导航语言
2,学习要点:
理解什么样的表达式是ognl表达式。
我们在学习struts2的时候,一直很困惑,只知道ognl表达式这个名字。我们并不知道,我们什么时候使用过表达式。
重点:
所谓的对象图导航语言指的就是通过 “放置到OgnlContext中的
#对象名字.属性名字
” 的方式去获取对应对象的属性值;主要工作就是用来学习如何让表达式合法,能够被正确解析且解释执行就可以了;
// 新建一个部门对象并设置部门名称
SlDept dept = new SlDept();
dept.setName("软件开发部");
// 新建一个员工对象并设置员工姓名
SlEmployee emp = new SlEmployee();
emp.setName("李四");
emp.setSlDept(dept);
OgnlContext context = new OgnlContext();
context.put("dept", dept);
context.put("emp", emp);
// 将员工设置为根对象
context.setRoot(emp);
// 构建Ognl表达式的树状表示,用来获取
Object expression;
try {
//1.获取非根对象(普通对象)中直接获取部门名称
expression = Ognl.parseExpression("#dept.name");
// 解析树状表达式,返回结果
Object deptName = Ognl.getValue(expression, context, context.getRoot());
System.out.println(deptName);
System.out.println("-----------------------------");
//2.获取(根对象)的方式一,直接取得。不要输入对象名,直接输入属性名称。
expression = Ognl.parseExpression("name");
Object name = Ognl.getValue(expression, context,context.getRoot());
System.out.println(name);
System.out.println("-----------------------------");
//3.获取根对象的方式一,不需要用#号,直接对所拥有的对象引用去获取引用的属性.
expression = Ognl.parseExpression("slDept.name");
Object name2 = Ognl.getValue(expression, context,context.getRoot());
System.out.println(name2);
System.out.println("-----------------------------");
//3.获取根对象的方式一,像普通对象一样取得,用#号也可以
expression = Ognl.parseExpression("#emp.name");//引号就是ongl表达式
Object expression1 = Ognl.parseExpression("#emp.slDept.name");
name = Ognl.getValue(expression, context,context.getRoot());
name2 = Ognl.getValue(expression1, context,context.getRoot());
System.out.println(name);
System.out.println(name2);
System.out.println(name==name2);
System.out.println("------------------------------------");
expression = Ognl.parseExpression("slDept.name");//引号里就是ongl表达式
expression1 = Ognl.parseExpression("#emp.slDept.name");
name = Ognl.getValue(expression, context,context.getRoot());
name2 = Ognl.getValue(expression1, context,context.getRoot());
System.out.println(name);
System.out.println(name2);
System.out.println(name==name2);
} catch (OgnlException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//
输出为:
软件开发部
-----------------------------
李四
-----------------------------
软件开发部
-----------------------------
李四
软件开发部
false
------------------------------------
软件开发部
软件开发部
true
true
经过实验验证过。
解释一下ognl中的关键类。
OgnlContext context = new OgnlContext();
context.put(“dept”, dept);
context.put(“emp”, emp);
Object expression = Ognl.parseExpression(“#emp.name”);
Object deptName = Ognl.getValue(expression, context, context.getRoot()); //解释执行Ognl表达式
这个类为Ognl表达式提供了一个执行环境,这个类实现了Map接口,所以允许通过put(key,obj)方法向OgnlContext环境中方式各种类型的对象,需要注意的是在OgnlContext中对象分为两种,第一种是叫做root对象(根对象),在整个OgnlContext中有且最多只能有一个根对象,可以通过调用OgnlContext.setRoot(obj)设置为根对象,另外一种就是OgnlContext中的普通对象,这种个数类型不受限制.
1、获取普通对象的属性值方式;(获取方式是唯一的)
比如上述例子当中,dept对象就是放置到OgnlContext中的普通对象,对于这种普通对象,只能通过“#dept.name
”的方式去获取属性值,需要注意的是dept指的是放置到上下文中key的值,另外在Dept类型中要提供getName方法;
2、获取根对象的属性值的方式,有两种,第一种也是跟上述方式一样,不多做叙述
Object expression = Ognl.parseExpression("#emp.name");
第二种,直接写属性名称就可以,注意:这个时候就不要加“#”(对象名称也不要加。),如下
expression = Ognl.parseExpression("name");
切记:随然有两种方式。但是
expression = Ognl.parseExpression("emp.name"); 是错误的。
本文只是防止以后自己忘记
更详细的记录(这里写的很好)
请参看:OGNL表达式语言详解感谢他的博文
ognl表达式,还可以调用方法