首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

ognl框架应用入门

2012-07-15 
ognl框架使用入门OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expressio

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 

热点排行