public static void setValue(java.lang.String expression,
java.util.Map context,
java.lang.Object root,
java.lang.Object value)
throws OgnlException
Evaluates the given OGNL expression to insert a value into the
object graph rooted at the given root object given the context.
Parameters:
expression - the OGNL expression to be parsed
root - the root object for the OGNL expression
context - the naming context for the evaluation
value - the value to insert into the object graph
OGNL的API设计得非常简单. context为变量和表达式的求值过程提供了上下文,提供了名称空间,存储了变量等,为通过根的对象图遍历指定了初始变量,并使用表达式告诉Ognl如何完成计算. 看一下以下两个简单的代码片段: \
User user1 = new User();
user1.setId(1);
user1.setName("firer");
User user2 = new User();
user2.setId(2);
user2.setName("firer2");
List users = new ArrayList();
users.add(user1);
users.add(user2);
Department dep = new Department();
dep.setUsers(users);
dep.setName("dep");
dep.setId(11);
Object o = Ognl.getValue("users[1].name", dep);
在这里,我们可以看到使用前面介绍的表达语言的优势. 使用“用户[1] .name”,可以完成name的值,而无需执行类型转换和其他工作. 以下是一个简单的设置示例.
User user = new User();
user.setId(1);
user.setName("ffirer");
Ognl.setValue("department.name", user, "dep1");

正如我前面提到的,Ognl还可以做其他一些工作. 一个例子是,在日常工作中,我们经常需要从列表中“搜索”满足我们要求的对象. 使用Java时,我们需要遍历列表,类型转换,值ognl map,然后进行比较以获得所需的值,而使用Ognl将使此过程变得简单而优雅. 代码段:
User user1 = new User();
user1.setId(1);
user1.setName("firer");
// 如上例创建一些 User
List users = new ArrayList();
users.add(user1);
// 将创建的 User 添加到 List 中
Department dep = new Department();
dep.setUsers(users);
List names = (List)Ognl.getValue("users.{name}", dep);
List ids = (List)Ognl.getValue("users.{? #this.id > 1}", dep);
此表达式“ users. {name}”将获得列表中所有用户的name属性,并将其返回到另一个列表中. “ users. {?#this.id> 1}”将返回ID大于1的所有用户,并以包含所有User对象的列表的形式返回. 这里使用Ognl“列表投影”操作是因为它被调用,因为它更像是返回中某些列的操作. Ognl还有许多其他功能. 了解如何在Ognl的SVN()测试用例中使用它们.
OGNL或表达式语言的性能主要由两个方面决定,一个方面是表达式的解析(Parser),另一个方面是表达式的执行. OGNL使用javaCC来完成解析器实现. 在OGNL 2.7中,还增强了OGNL的执行部分,并使用javasisit生成JIT(Just-In-Time)字节码来完成表达式的执行. Ognl将此函数命名为: OGNL Expression Compilation. 基本的使用方法是:
SimpleObject root = new SimpleObject(); OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null); Node node = (Node) Ognl.compileExpression(context, root, "user.name"); String userName = (String)node.getAccessor().get(context, root);
那么Expression Compilation对Ognl的性能有何影响?性能方面的简单测试: 与四种情况相比: 直接Java调用(1),OGNL缓存使用表达式编译(2),OGNL缓存使用已解析的OGNL表达式(3),结果不使用任何缓存(4).


您可以看到表达式编译与使用Java调用时非常接近,因此可以看到,当要多次使用表达式时,将使用表达式编译并且缓存已完成,OGNL是非常接近直接调用Java的时间.
本文介绍了OGNL的概念,表达式语法以及如何使用OGNL,并提供了一些简单的示例代码,OGNL也可以在实际应用中进行扩展,在本文中并为有兴趣的读者可以进一步进行相关的学习和研究.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-225969-2.html
怎么就不能科学一点地去想想失足妇女合法化呢
会趁机坐大滴