我们在使用ognl时,一般情况下ognl已经考虑的非常完善了。但是特定的情况下,我们仍然需要注册自己的PropertyAccessor,以便ognl能够正确的遍历特殊的对象。
注册特定PropertyAccessor的方式:OgnlRuntime.setPropertyAccessor(clz,PropertyAccessor);
其中clz是Class对象,它可以是目标对象的具体Class,也可以是父类、甚至是目标对象实现的接口之一。
假设目标对象比较特殊,根据它在表达式中是否处于未尾来调用目标对象的不同方法,那么如何当前判断Node是否处理ognl表达的尾部呢?
ognl没有直接提供这样的方法,在实现PropertyAccessor时,可以这样处理:
class MyPropertyAccessor implements PropertyAccessor{
public Object getProperty( Map context, Object target, Object name ) throws OgnlException{
boolean isLastProp = isLastProp((OgnlContext) context);
if(isLastProp) return ((MyObj) target).获取显示值();
return ((MyObj) target).获取实际值();
}
/** 判断当前节点是否最后一个节点 */
private boolean isLastProp(OgnlContext context) {
Node n = context.getCurrentNode();
while(true) {
Node par = n.jjtGetParent();
if(par == null)
return false;
else if(par.jjtGetParent() == null)
break;
n = par;
}
Node par = n.jjtGetParent();
if(par.jjtGetChild(par.jjtGetNumChildren() - 1) == n)
return true;
else
return false;
}
.......
}
......
以上用于备忘。