package com.struts.ognl;
import ognl.Ognl;
import ognl.OgnlContext;
import org.junit.Test;
/**
* OGNL 表达式:
* OGNL 是 Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个开源项目;
*
* ognl 优势:
* 1、支持对象方法调用,如果 request.request_data;
* 2、支持类的静态方法调用和值访问,表达式的格式:
* @[类全名(包括包)]@[方法名|值名],例如:
* @java.lang.String@Format("foo %s", "bar");
* 或:@tutorial.MyConstant@APP_NAME;
* 3、支持赋值操作和表达式串联,如 price=100,discount=0.8;
* calculatePrice() 这个表达式会返回 80;
* 4、访问 ognl 上下文(OgnlContext),和 ActionContext;
* 5、操作集合对象;
*
* ognl 表达式用于页面中取值,是 struts 默认支持的表达式语言;必须引用相应的 ognl jar 包;
* ognl 表达式必须配置 struts 标签用,不能离开 struts 标签直接用;
* EL 表达式也用于页面取值,是 jsp 页面取值的标准;默认可以直接使用,应用范围更广。
*
* ognl 有一个上下文的概念,其本质是一个 Map 对象,实现了 java.utils.Map 接口;叫做 OgnlContext;
* OgnlContext 是 ognl 表达式的核心,ognl 表达式取值就是通过 OgnlContext 对象实现的;
*/
public class OgnlContextDemo {
/**
* 从非根元素取值的 ognl 表达式必须要用 "#"
*/
@Test
public void test1() throws Exception{
// 创建一个 OgnlContext 对象
OgnlContext ognlContext = new OgnlContext();
// 创建对象
User user = new User();
user.setId(22);
user.setName("Jack");
// 放入数据:此处是往非根元素放入数据,取值的时候表达式要用 "#"
ognlContext.put("userKey", user);
// 获取数据
// 先构建一个 ognl 表达式:从非根元素取值,表达式要用 "#"
String ognlExpression = "#userKey.id";
// 再解析表达式
Object ognl = Ognl.parseExpression(ognlExpression);
// 最后获取表达式的值
Object value = Ognl.getValue(ognl, ognlContext, ognlContext.getRoot());
System.out.println(value);
}
/**
* 从根元素取值的 ognl 表达式不用带 "#"
*/
@Test
public void test3() throws Exception{
// 创建一个 OgnlContext 对象
OgnlContext ognlContext = new OgnlContext();
// 创建对象
User user = new User();
user.setId(22);
user.setName("Jack");
// 放入数据:往根元素放入数据
ognlContext.setRoot(user);
// 获取数据
// 先构建一个 ognl 表达式,在解析表达式
Object ognl = Ognl.parseExpression("id"); // 从根元素取数据,不用带 "#"
// 获取 ognl 表达式的值
Object value = Ognl.getValue(ognl, ognlContext, ognlContext.getRoot());
System.out.println(value);
}
/**
* ognl 表达式调用 静态方法
*/
@Test
public void test4() throws Exception {
// 创建一个 OgnlContext 对象
OgnlContext ognlContext = new OgnlContext();
// 构建 ognl 表达式,调用类的静态方法
// String ognlExpression = "@Math@floor(8.8)";
String ognlExpression = "@@floor(8.8)"; // 由于 Math 类比较常用,所以也可以省略
// 解析 ognl 表达式
Object ognl = Ognl.parseExpression(ognlExpression);
// 获取表达式的值
Object value = Ognl.getValue(ognl, ognlContext, ognlContext.getRoot());
System.out.println(value);
}
}