现在的位置: 首页 > 综合 > 正文

半夜三更搞懂xwork的OGNL

2018年01月31日 ⁄ 综合 ⁄ 共 816字 ⁄ 字号 评论关闭
 加班陪同事无聊中,开始研究XWORK的OGNL

OGNL可以这样来形容它的作用:它将对象“平坦”地展示出来

XWORK包装过的OGNL有如下用法

vs.findValue("age", String.class)
vs.findValue("cat.name")

如果平坦的那个面有2个一样的元素,那么取栈顶那个

vs.findValue("@com.opensymphony.xwork2.util.Dog@getDeity()", String.class)
上面是直接访问静态方法

注意 vs.set("dog", dog); 与 vs.push(dog)的区别,
前者一定得用 vs.findValue("dog.name")     后者直接 vs.findValue("name")

还有一些高级用法

        vs.setOtherName("blah");
        vs.findValue("setName(otherName)");
上面的otherName可以从平面中去解析,setName也是平面中解析出来的方法

assertEquals(new Boolean(false), vs.findValue("[1].name.endsWith(name)"));
上面这句有点难懂了吧?后面那个name是从栈顶里取出来的,而[0],[1]....是从栈顶开始计算的,于是,栈顶下面那个元素的name不等于栈顶元素的name

        vs.getContext().put("foo", foo);

        assertEquals("bar:123", vs.findValue("#foo.bar", String.class));

类似与 vs.set  也就是说 OGNLValueStack里的map的键值可以通过 #foo来读取

总的来说,findValue(String Expression) 里的字符串类似与javascript的eval()方法

抱歉!评论已关闭.