Struts2—ognl(Object Graph Navigation language)
OGNL简介
- ognl是一种功能的强大的表达式语言
- 它可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。
ognl与el表达式对比
- ognl对象图导航的语言比el表达式强大很多倍
- el表达是只能从域当中获取数据
- ognl可以调用对象的方法,获取struts的值栈数据(根区和非根区)
ognl功能
- 支持运算符
- 支持对象方法调用
- 支持静态方法调用(@java.lang.Math@random())和值访问
- 支持赋值操作和表达式串联
- 访问ognl上下文
- 操作集合对象
- 可以直接new一个对象
ognl使用要素
- 表达式
- 根对象
- context对象(非根对象)
ognl入门
-
ognl根对象中存取数据
- 往根对象中直接存取值
//ognl的使用 /*1.获取ognl对象*/ OgnlContext ognlContext = new OgnlContext(); //往OgnlContext对象中存数据 往根对象中存数据 ognlContext.setRoot("aaa"); //从根当中取数据 直接获取这个对象 Object obj = Ognl.getRoot(ognlContext); System.out.println(obj);
-
往根对象中存取对象
- 方法1(取对象):
//ognl的使用 /*step1.获取ognl对象*/ OgnlContext ognlContext = new OgnlContext(); //存数据 往根对象中存数据 /*step2.创建一个商品对象*/ Goods goods = new Goods(); goods.setName("T恤"); goods.setPrice(12.2); /*step3.将对象存放到root根对象当中*/ ognlContext.setRoot(goods); //取对象 从根对象中取出数据 /*从根对象中获取数据 方法1*/ Object obj = Ognl.getRoot(ognlContext); System.out.println(obj);
- 方法二(常用 取字段):
//ognl的使用 /*step1.获取ognl对象*/ OgnlContext ognlContext = new OgnlContext(); //存数据 往根对象中存数据 /*step2.创建一个商品对象*/ Goods goods = new Goods(); goods.setName("T恤"); goods.setPrice(12.2); /*step3.将对象存放到root根对象当中*/ ognlContext.setRoot(goods); /*从根对象中获取数据 方法2*/ /** * getValue参数: * 1.表达式 取哪一个字段(domain中类所对应的字段名) * 2.ognlContext * 3.root 获取root */ /*获取root*/ Object root = ognlContext.getRoot(); Object name = Ognl.getValue("name", ognlContext, root); System.out.println(name);
-
ognl非根对象中存取数据
``` //注意往非根对象中存取数据得时候对象名称前面要加上#号 //ognl的使用 /*step1.获取ognlContext对象*/ OgnlContext ognlContext = new OgnlContext(); //存数据 往非根对象中存数据 就是将的数据存放到Map当中 /*step2.创建一个商品对象*/ Goods goods = new Goods(); goods.setName("T恤"); goods.setPrice(12.2); /*将数据存放到map当中,所以使用put这种方式进行 key,value*/ //非根对象 不能够取出对象中的某一个字段 而是取出存放的内容 ognlContext.put("goods",goods); //取对象 根非根对象中取出数据 /*从非根对象中获取数据*/ /** * getValue参数: * 1.表达式 :#key(前面put中取的key值) * 2.ognlContext * 3.root 获取root */ /*获取root*/ Object root = ognlContext.getRoot(); /*注意key(goods之前也要加上一个#号) 返回的为put进非根的对象*/ Goods obj = (Goods)Ognl.getValue("#goods", ognlContext, root); /*取出其中字段的方法 就是从对象中获取字段的get方法*/ System.out.println(obj); System.out.println(obj.getName()); System.out.println(obj.getPrice()); ```
-
ognl调用对象方法
-
访问静态方法的时候要在struts.xml中开启允许访问静态方法这个常量
//在struts.xml中开启常量(在package之外开启常量) <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> //引入标签库(jsp当中) <%@ taglib prefix="c" uri="/struts-tags" %> 然后就可以在jsp中获取根与非根对象中的数据
/*1.获取ognlContext对象*/ OgnlContext ognlContext = new OgnlContext(); /*2.提前拿到root的值,因为后面getValue的时候要使用到*/ Object root = ognlContext.getRoot(); /* * getValue参数: * 1.表达式 * 2.ognlContext * 3.root * */ //调用普通的方法 例如:将字符串中对象中的长度返回 Object value = Ognl.getValue("'hello'.length()", ognlContext, root); System.out.println(value); //调用静态方法 在静态方法前面加上@符号 将方法名的前面的“.”也要换成“@” 注意表达式是使用的包的全名称 Object random = Ognl.getValue("@java.lang.Math@random()", ognlContext, root); System.out.println(random);
-