ValueStack是Struts2数据传输背后的机制,其基础是OGNL。想了解ValueStack的工作机制,必须先理解OGNL。
1、简介
OGNL(Object Graphic Navigation Language),对象图导航语言。下面解释何为对象图导航:
对象图导航,即以任意一个对象为根,可以访问这个对象关联的其他对象。如下面三个类:以一个User对象为根,可以导航到Group对象,进而导航到Organization对象。导航的目的,是为了获取、设置某个对象的值或调用某个对象的方法!
① 通过Java代码从User对象导航到Organization的orgId属性:
String orgId = user.getGroup().getOrg().getOrgId();
② 通过OGNL进行导航:String orgId = (String)Ognl.getValue(group.org.orgId,user);
Ognl.getValue方法的第一个参数就是一条OGNL表达式,第二个参数是指定在表达式中需要用到的root对象。
也许通过这个例子,你会觉得OGNL显得更复杂点,但OGNL的目的并不在于此。OGNL表达式的真正目的,是为了在那些不能写JA代码的地方、或者不方便写Java代码的地方执行JA代码。如在Struts2工程中,可以在strtus.xml和JSP页面使用OGNL表达式,同Action交换数据,所以,非常有必要理解OGNL的基本机制。
2、OGNL入门
下面以代码说明了OGNL表达式的用法,下面的代码完全可以在Java工程中模拟,只需导入ognl.jar和javassist.jar即可。ognl表达式这两个包可以在Struts2的lib库中找到。
① Ognl.getValue(String expression, Object root)
public class OGNLDemo1 {
@Test
public void testOGNL1() throws Exception{
User user = new User();
user.setUsername("张三");
String value= (String) Ognl.getValue("username", user);
System.out.println(value);
}
@Test
public void testOGNL2() throws Exception{
User user = new User();
Group g = new Group();
Organization o = new Organization();
o.setOrgId("Y11");
g.setOrg(o);
user.setGroup(g);
//java代码导航
System.out.println(user.getGroup().getOrg().getOrgId());
//OGNL代码导航
String value= (String) Ognl.getValue("group.org.orgId", user);
System.out.println(value);
}
@Test
public void testOGNL3() throws Exception{
User user = new User();
Group g = new Group();
Organization o = new Organization();
o.setOrgId("Y11");
g.setOrg(o);
user.setGroup(g);
//java代码导航
System.out.println(user.getGroup().getOrg().getOrgId());
//OGNL代码导航(使用#root代表root对象)
String value= (String) Ognl.getValue("#root.group.org.orgId", user);
System.out.println(value);
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-31887-1.html
直接动动炮肯定不妥
可以么
人都会有错
从我做起