首先OGNL是什么
OGNL:Object-Graph Navigation Language 的缩写他是对象视图导航语言 (${user.addr.name}这种写法就叫对象视图导航)
他能做什么
OGNL:不仅仅可以视图导航,他还支持比EL表达式更加丰富的功能
怎么用它
1、先导包因为我是学到struts2才学的ognl的并且struts2的包中已经包含了
2、代码准备
//准备OGNLContext
//准备Root
User rootUser = new User("tom",81);
//准备Context
Map<String,User> context = new HashMap<String,User>();
context.put("user1", new User("jack", 12));
context.put("user1", new User("roce",21));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL
准备好了以后开始看他的语法
1、基本取值
//取出root中user对象的name属性
String name =(String) Ognl.getValue("name",oc,oc.getRoot());
Integer age =(Integer) Ognl.getValue("age",oc,oc.getRoot());
System.out.println(age);
System.out.println(name);
//取出context中user对象的name属性
String name =(String) Ognl.getValue("#user1.name",oc,oc.getRoot());
Integer age =(Integer) Ognl.getValue("#user1.age",oc,oc.getRoot());
System.out.println(age);
System.out.println(name);
2、赋值
//取出root中user对象的name属性并赋值
String name = (String) Ognl.getValue("name='32', name ",oc,oc.getRoot());
System.out.println(name);
//取出context中的user对象name并赋值
String name1 =(String) Ognl.getValue("#user1.name='步惊云',#user1.name", oc,oc.getRoot());
System.out.println(name1);
3、调用方法
//调用root中user对象的方法
String name = (String) Ognl.getValue("setName('嗯哼'),getName()",oc,oc.getRoot());
System.out.println(name);
//调用context中的user对象的方法
String name1 =(String) Ognl.getValue("#user1.setName('步惊云'),#user1.getName()", oc,oc.getRoot());
System.out.println(name1);
4、调用静态方法(这里我写了一个工具类HahaUtils)
工具类HahaUtils
public class HahaUtils {
public static Object ec(Object o){
return o;
}
}
//调用root中user对象的方法
String name = (String) Ognl.getValue("@cn.gongsiming.a_ognl.HahaUtils@ec('hello 老 贾')",oc,oc.getRoot());
System.out.println(name);
//调用context中的user对象的方法
Double name1 =(Double) Ognl.getValue("@@PI", oc,oc.getRoot());
System.out.println(name1);
5、创建对象(List,Map)
//ognl创建list对象
Integer size = (Integer) Ognl.getValue("{'jack','tom','tom','cat'}.size()",oc,oc.getRoot());
System.out.println(size);
String name1 =(String) Ognl.getValue("{'jack','tom','tom','cat'}[0]", oc,oc.getRoot());
String name2 =(String) Ognl.getValue("{'jack','tom','tom','cat'}.get(1)", oc,oc.getRoot());
System.out.println(name1);
System.out.println(name2);
//ognl创建map对象
Integer size2 = (Integer) Ognl.getValue("#{'name':'老贾','age':'21'}.size()",oc , oc.getRoot());
String name3 = (String) Ognl.getValue("#{'name':'老贾','age':'21'}['name']", oc,oc.getRoot());
String name4 = (String) Ognl.getValue("#{'name':'老贾','age':'21'}.get('age')", oc,oc.getRoot());
System.out.println(size2);
System.out.println(name3);
System.out.println(name4);
这里我只简单介绍ognl的概念 和语法 ,并没有说到和struts2的联系,因为ognl应该是一个单独的知识点并不是基于struts2的
所以就分开来说了