表达式引擎作用
表达式引擎在web开发中能够完成规则化字符串表达式与Java对象之间的互相转化,也就是作为各个模块直接数据沟通的桥梁。
Ognl的最具代表性的两个方法,ognl中还有许多其他方法来实现相同功能
ognl每次操作都是围绕它的三个参数而进行的,这三个参数被称为ognl三要素。
表达式
表达式时ognl的核心,所有ognl的操作都是针对表达式解析后进行的。表达式其实是一个带有语法含义的字符串。
root对象
ognl操作的对象,(针对root对象来进行表达式计算)
上下文环境
这个环境规定在哪里进行ognl操作。ognl的上下文环境时一个map结构,称为ognlcontext。
对root对象的访问
针对OGNL的root对象的对象树的访问是通过使用“点号”将对象引用串联起来实现的。例:获取root对象的name属性 name
获取root对象的department属性中的name属性 department.name
对上下文环境的访问
通过对#符号加上链式表达式访问。
例:获取上下文中名为introduction的对象的值 #introduction
访问OGNL中的静态对象
需要通过@[class]@[filed/method]的表达式语法来进行
例:访问com.emample类的name属性 @com.emample@name
方法调用
类似Java的调用。
例:调用root对象中的group属性中的users的size方法。 group.users.size().
对数组和由于容器的访问通过下标
group.users[0].name
ognl支持类似数据库中的投影与连接
投影是指选出集合中每个元素相同的属性组成新的集合。
collection.{xxx}xxx表示公共属性
选择就是过滤满足selection条件的集合元素。
collection.{x yyy},x表示选择操作符有三种 ? 选择满足条件的所有元素
^ 满足条件的第一个元素 $ 满足条件的最后一个元素。yyy表示选择用的逻辑表达式
ognl支持通过表达式来构造对象
this指针
ognl中的this指针指向当前计算的调用者对应的实例。
有关#操作符的3种不同用途
加在普通ognl表达式之前,用于访问ognl上下文中的变量
使用#{}语法动态构建map
加在this指针之前表示对this指针的引用
ognl的计算规则
1、类的寻址方式 ——Classresolver
//本接口只有一个方法,具体实现在DefaultClassResolver类
public interface ClassResolver {
Class classForName(String var1, Map var2) throws ClassNotFoundException;
}
//具体默认实现
public class DefaultClassResolver implements ClassResolver {
private Map classes = new HashMap(101);
public Class classForName(String className, Map context) throws ClassNotFoundException {
Class result = null;
if ((result = (Class)this.classes.get(className)) == null) {
try {
result = Class.forName(className);
} catch (ClassNotFoundException var5) {
if (className.indexOf(46) == -1) {
result = Class.forName("java.lang." + className);
this.classes.put("java.lang." + className, result);
}
}
this.classes.put(className, result);
}
return result;
}
}
//加载特殊名称的类
public Class classForName(String className, Map context) throws ClassNotFoundException {
Object root = Ognl.getRoot(context);
try {
if (root instanceof CompoundRoot) {
if (className.startsWith("vs")) {
CompoundRoot compoundRoot = (CompoundRoot) root;
if ("vs".equals(className)) {
return compoundRoot.peek().getClass();
}
int index = Integer.parseInt(className.substring(2));
return compoundRoot.get(index - 1).getClass();
}
}
} catch (Exception e) {
LOG.debug("Got exception when tried to get class for name [{}]", className, e);
}
return Thread.currentThread().getContextClassLoader().loadClass(className);
}
2、类型转化方式
typeconverter的作用是指定在ognl计算的过程中如果需要进行类型转换应该遵循的实现方式。
3、方法/属性访问策略
MemberAccess规定了OGNL的对象方法/属性访问策略规定了ognl在进行计算时是否可以访问某个对象的方法或属性。在默认实现中禁止访问private、protected、package protected的属性
4、方法、属性访问机制
methodAccessor和PropertyAccessor规定了OGNl在访问方法和属性时的实现方式。
5、nullhandler空值处理机制
NullHandler的作用是指定ognl在计算时,如果遭遇到级联对象时的处理方式