在ognl的PropertyAccessor实现类中如何判断当前Node是否最后一个

 我们在使用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;
   }

 

  .......

}

......

以上用于备忘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值