ognl框架使用入门

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
开源框架OGNL就是基于该表达式语言的一个实现,你可以从http://www.ognl.org得到ognl.jar,源码和一些文档。本文主要通过一个例子讲述通过Java Main函数如何使用ognl.jar。同时也要导入javassist.jar包。
当然,首先得建立你的工程,然后把ognl.jar引入到你的类路径中。同时把junit.jar也引入到你的类路径,因为本文的例子的测试代码需要用到junit.jar。
然后建立Java类Company.java,User.java。这两个类只是简单的JavaBean。代码如下:


Java代码
1./**
2. * 公司对象
3. * */
4.public class Company {
5. /**
6. * 公司名字
7. * */
8. private String companyName;
9. public String getCompanyName() {
10. return companyName;
11. }
12. public void setCompanyName(String companyName) {
13. this.companyName = companyName;
14. }
15.}
16./**
17. * 用户对象
18. * */
19.public class User {
20.
21. /**
22. * 姓名
23. * */
24. private String name;
25.
26. /**
27. * 所在公司
28. * */
29. private Company company;
30. public String getName() {
31. return name;
32. }
33. public void setName(String name) {
34. this.name = name;
35. }
36. public Company getCompany() {
37. return company;
38. }
39. public void setCompany(Company company) {
40. this.company = company;
41. }
42.
43.}
44.

接着,建立类TestOngl.java,主要的测试代码都在该类中。

Java代码
1.package ognltest;
2.
3.import java.util.HashMap;
4.import java.util.Map;
5.
6.import junit.framework.TestCase;
7.import ognl.Ognl;
8.import ognl.OgnlException;
9.
10.public class TestOngl extends TestCase{
11. //此处为类中的代码。
12.}

类中的第一方法为,testOgnlSimpleProperty,演示了如何用Ognl从一个简单对象中取属性值。代码如下:


Java代码
1./**
2. * 测试简单属性
3. * */
4. public void testOgnlSimpleProperty()
5. {
6. User user=new User();
7. user.setName("abc");
8. try {
9. Object result = Ognl.getValue("name",user);//********(1)
10. System.out.println("***简单属性**********result::"+result);
11. //输出:***简单属性**********result::abc
12. Company com=new Company();
13. com.setCompanyName("某某科技有限公司");
14. user.setCompany(com);
15.
16. result=Ognl.getValue("company.companyName",user);//*******(2)
17. System.out.println("***嵌套属性**********result::"+result);
18. //输出:***嵌套属性**********result::某某科技有限公司
19. } catch (OgnlException e) {
20. // TODO Auto-generated catch block
21. e.printStackTrace();
22. }
23. }


其中行(1)中的”name”,行(2)中的” company.companyName”就是表达式语言了,只不过这两个表达式是最但的表达式了。
类中的第二方法为,testFromMap,演示了如何用Ognl从一个Map中取对象中取对象或对象的属性值。代码如下:


Java代码
1./**
2. * 测试从Map中取
3. * */
4. public void testFromMap() throws OgnlException
5. {
6. Map distObject=new HashMap();
7. distObject.put("abc","10000");
8. Object result = Ognl.getValue("abc",distObject);//********(1)
9.
10. System.out.println("***从Map中取简单属性**********result::"+result);
11. //输出:***从Map中取简单属性**********result::10000
12. User user=new User();
13. user.setName("myName");
14. distObject.put("user",user);
15. result = Ognl.getValue("user.name",distObject);//********(2)
16. System.out.println("***从Map中取嵌套属性**********result::"+result);
17. //输出***从Map中取嵌套属性**********result::myName
18.
19. }


好了,通过这个例子,相信大家知道Ognl表达式是怎么一回事了,也应该了解怎么使用ognl.jar。不妨大家自己动手去联系一下这个例子,感受一下ognl的强大之处。
其实,现在流行的MVC框架webwork,struts2都用到了OGNL,如果你学会了OGNL的基础知识,那么你在学webwork中的OGNL时,或者struts2中的OGNL时,也就轻车熟路了。

以下是ognl的应用:
OGNL可以用索引来访问数组,比如表达式abc[1].name,表示取得id为abc的数组的第1维的对象的name属性,注意,OGNL中的数组索引与Java一样,是从0开始的,下面的代码演示了如何访问数组:


Java代码
1.Map distObject=new HashMap();
2. User[] users=new User[3];
3. users[0]=new User();
4. users[0].setName("user0");
5. users[1]=new User();
6. users[1].setName("user1");
7. users[2]=new User();
8. users[2].setName("user2");
9. distObject.put("abc",users);
10. Object result = Ognl.getValue("abc[1].name",distObject);//********(1)
11.
12. System.out.println("***测试数组**********abc[1].name:"+result);
13. //输出:***测试数组**********abc[1].name:user1

    OGNL提供了一些特别的索引符号访问数组中的特殊位置,如符号^表示数组的第1维元素,$表示最后一维,|表示中间的元素。表达式abc[^].name,表示取得id为abc的数组的第1维的对象的name属性。下面的代码演示了这些特殊的符号的用法。


Java代码
1.Map distObject=new HashMap();
2.User[] users=new User[3];
3.users[0]=new User();
4.users[0].setName("user0");
5.users[1]=new User();
6.users[1].setName("user1");
7.users[2]=new User();
8.users[2].setName("user2");
9.distObject.put("abc",users);
10.Object result = Ognl.getValue("abc[^].name",distObject);
11.System.out.println("***测试数组**********abc[^].name:"+result);
12.//输出:***测试数组**********abc[^].name:user0
13.result = Ognl.getValue("abc[$].name",distObject);
14.System.out.println("***测试数组**********abc[$].name:"+result);
15. //输出:***测试数组**********abc[$].name:user2
16.result = Ognl.getValue("abc[|].name",distObject);
17.System.out.println("***测试数组**********abc[|].name:"+result);
18. //输出:***测试数组**********abc[|].name:user1

    OGNL把ArrayList也当作数组,下面的代码演示了OGNL如何访问ArrayList。


Java代码
1.Map distObject=new HashMap();
2.List users=new ArrayList();
3.User user0=new User();
4.user0.setName("user0");
5.users.add(user0);
6.User user1=new User();
7.user1.setName("user1");
8.users.add(user1);
9.User user2=new User();
10.user2.setName("user2");
11.users.add(user2);
12.distObject.put("abc",users);
13.Object result = Ognl.getValue("abc[1].name",distObject);//********(1)
14.
15.System.out.println("***测试ArrayList**********abc[1].name:"+result);
16.//输出:***测试数组**********abc[1].name:user1

    Map可以看作下标为字符串的数组。如果id为abc的map,包含key为"user0"的对象,则表达式abc["user0"]可以访问该对象。下面的代码演示了OGNL如何用用字符串下标访问Map。


Java代码
1.Map distObject=new HashMap();
2.Map uMap=new HashMap();
3.User user=new User();
4.user.setName("user0");
5.uMap.put("user0",user);
6.user=new User();
7.user.setName("user1");
8.uMap.put("user1",user);
9.user=new User();
10.user.setName("user2");
11.uMap.put("user2",user);
12.distObject.put("abc",uMap);
13.Object result = Ognl.getValue("abc['user2'].name",distObject);//********(1)
14.
15.System.out.println("***测试字符串下标**********abc['user2'].name:"+result);
16.//输出:***测试字符串下标**********abc['user2'].name:user2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值