OGNL表达式
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法。Struts2中使用OGNL表达式作为POJO到视图数据显示的绑定(后台返回User对象,在界面可使用${user.name}取出名称),MyBatis使用OGNL表达式作为在mapper文件中参数的映射(select元素parameterType=“User”,使用#{user.name}可设置参数)。所以我们了解一下OGNL表达式是很有必要的。OGNL表达式上手特别简单,OGNL表达式jar包可以去网上下载,下边事例是用了MyBatis中自带的OGNL表达式API。
http://www.codeweblog.com/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%BC%95%E6%93%8Eognl/
这么文章介绍了具体如何使用OGNL表达式。
有些时候说再多不如看代码理解的快
package com.zhangxy.myBatis.ognl;
import java.io.Serializable;
public class User implements Serializable {
public static final long serialVersionUID = 1L;
public User() {
}
public User(long id, String name) {
this.id = id;
this.name = name;
}
private long id;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Long getUID() {
return serialVersionUID;
}
@Override
public String toString() {
return "id->"+id+"|name->"+name;
}
}
下面是我使用OGNL表达式的代码事例。
package com.zhangxy.myBatis.ognl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.ognl.Ognl;
import org.apache.ibatis.ognl.OgnlException;
public class TestOgnl1 {
public static void main(String[] args) throws OgnlException {
t2();
}
public static void t2() throws OgnlException {
User user = new User();
user.setId(1000);
user.setName("zhangxy");
Map<String, String> ognlContext = new HashMap<String, String>();
ognlContext.put("id", "2000");
ognlContext.put("name", "HIG");
Object value = null;
String expression = "";
// expression = "name!=null && name!=''";
expression = "name!=null and name!=''";
value = Ognl.getValue(Ognl.parseExpression(expression), user);
System.out.println("逻辑判断" + expression + ",值->" + value);
expression = "name";
value = "ABC";
Ognl.setValue(Ognl.parseExpression(expression), user, value);
System.out.println("设置对象属性" + expression + ",值<-" + value);
expression = "name";
value = Ognl.getValue(Ognl.parseExpression(expression), user);
System.out.println("读取对象属性" + expression + "->" + value);
expression = "setName('EFG')";
value = "EFG";
Ognl.getValue(Ognl.parseExpression(expression), user);
System.out.println("调用" + expression + "方法,传递name参数<-" + value);
expression = "getName()";
value = Ognl.getValue(Ognl.parseExpression(expression), user);
System.out.println("调用" + expression + "方法->" + value);
expression = "@com.zhangxy.myBatis.ognl.User@serialVersionUID";
value = Ognl.getValue(Ognl.parseExpression(expression), null);
System.out.println("调用" + expression + "静态变量->" + value);
expression = "@com.zhangxy.myBatis.ognl.User@getUID()";
value = Ognl.getValue(Ognl.parseExpression(expression), null);
System.out.println("调用" + expression + "静态方法->" + value);
expression = "@com.zhangxy.myBatis.ognl.User@getUID()";
value = Ognl.getValue(Ognl.parseExpression(expression), null);
System.out.println("调用" + expression + "静态方法->" + value);
value = Ognl.getValue("new com.zhangxy.myBatis.ognl.User(#id,#name)", ognlContext, new Object());
System.out.println("new User根据ognl上下文中的值->" + value);
value = Ognl.getValue("{'a','b','c'}", null);
System.out.println("构建一个List->" + value + ",取出index为1的元素->" + Ognl.getValue("[1]", value));
expression = "#{'a':'A','b':'B','c':'B'}";
value = Ognl.getValue(expression, null);
System.out.println("构建一个Map->" + value + ",取出key b对应的valu->" + Ognl.getValue("['b']", value));
expression = "size()+1";
value = Ognl.getValue(expression, value);
System.out.println(expression + "->" + value);
// #this表示对当前对象的引用,谁调用()内的表达式#this就是谁,这里是数组length属性的值
// expression="length.(#this+1).(#this+10)";
// #root表示根对象,这里是数组
expression = "length.(#this+1).(#this+10).(#root.length)";
value = Ognl.getValue(expression, new String[] { "a", "b", "b" });
System.out.println(expression + "->" + value);
// 投影与选择
List<User> userList = new ArrayList<User>();
userList.add(user);
expression = "#root.{id}";
value = Ognl.getValue(expression, userList);
System.out.println("投影:获取collection中元素对象的id属性值,并形成一个list,list元素为id值->" + value);
// ?选择满足条件的所有元素
// ^ 选择满足条件的第一个元素
// $ 选择满足条件的最后一个元素
expression = "#root.{? #this.id==1000}";
value = Ognl.getValue(expression, userList);
System.out.println("选择:获取collection中元素对象的id属性值==1000,并形成一个list,list元素为User->" + value);
}
}
测试结果:
逻辑判断name!=null and name!='',值->true
设置对象属性name,值<-ABC
读取对象属性name->ABC
调用setName('EFG')方法,传递name参数<-EFG
调用getName()方法->EFG
调用@com.zhangxy.myBatis.ognl.User@serialVersionUID静态变量->1
调用@com.zhangxy.myBatis.ognl.User@getUID()静态方法->1
调用@com.zhangxy.myBatis.ognl.User@getUID()静态方法->1
new User根据ognl上下文中的值->id->2000|name->HIG
构建一个List->[a, b, c],取出index为1的元素->b
构建一个Map->{a=A, b=B, c=B},取出key b对应的valu->B
size()+1->4
length.(#this+1).(#this+10).(#root.length)->3
投影:获取collection中元素对象的id属性值,并形成一个list,list元素为id值->[1000]
选择:获取collection中元素对象的id属性值==1000,并形成一个list,list元素为User->[id->1000|name->EFG]