OGNL

OGNLObject-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

   本文主要通过一个例子讲述通过Java Main函数如何使用ognl.jar    建立工程,然后把ognl.jar引入到你的类路径中。同时把junit.jar也引入到你的类路径,因为本文的例子的测试代码需要用到junit.jar 然后建立JavaCompany.java,User.java。这两个类只是简单的JavaBean。代码如下:

/**  

 * 公司对象  

 * */  

public class Company {   

    private String companyName;   

    public String getCompanyName() {   

        return companyName;   

    }   

    public void setCompanyName(String companyName) {   

        this.companyName = companyName;   

    }   

}   

/**  

 * 用户对象  

 * */  

public class User {   

    private String name;   

    private Company company;   

    public String getName() {   

        return name;   

    }   

    public void setName(String name) {   

        this.name = name;   

    }   

    public Company getCompany() {   

        return company;   

    }   

    public void setCompany(Company company) {   

        this.company = company;   

    }     

}   

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

public class TestOngl extends TestCase{   

    //此处为类中的代码。   

}  

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

/**  

     * 测试简单属性  

     * */  

    public void testOgnlSimpleProperty(){   

        User user=new User();   

        user.setName("abc");   

        try {   

                   Object result = Ognl.getValue("name",user);// 获取user实例的name属性

                  Company com=new Company();   

                   com.setCompanyName("某某科技有限公司");   

                   user.setCompany(com);              

                   result=Ognl.getValue("company.companyName",user);

//  获取user实例company属性的companyName属性

        } catch (OgnlException e) {    }   

    }  

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

Java代码

/**  

     * 测试从Map中取  

     * */  

    public void testFromMap() throws OgnlException   {   

        Map distObject=new HashMap();   

        distObject.put("abc","10000");   

        Object result = Ognl.getValue("abc",distObject);   

        User user=new User();   

        user.setName("myName");   

        distObject.put("user",user);   

        result = Ognl.getValue("user.name",distObject);

//这个太霸道了

    }  

        其实,现在流行的MVC框架webwork,struts2都用到了OGNL,如果你学会了OGNL的基础知识,那么你在学webwork中的OGNL时,或者struts2中的OGNL时,也就轻车熟路了。OGNL可以用索引来访问数组,比如表达式abc[1].name,表示取得idabc的数组的第1维的对象的name属性,注意,OGNL中的数组索引与Java一样,是从0开始的,下面的代码演示了如何访问数组:

Java代码

Map distObject=new HashMap();   

        User[] users=new User[3];   

        users[0]=new User();   

        users[0].setName("user0");   

        users[1]=new User();   

        users[1].setName("user1");   

        users[2]=new User();   

        users[2].setName("user2");   

        distObject.put("abc",users);   

        Object result = Ognl.getValue("abc[1].name",distObject);

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

Java代码

Map distObject=new HashMap();   

User[] users=new User[3];   

users[0]=new User();   

users[0].setName("user0");   

users[1]=new User();   

users[1].setName("user1");   

users[2]=new User();   

users[2].setName("user2");   

distObject.put("abc",users);   

Object result = Ognl.getValue("abc[^].name",distObject);   

System.out.println("***测试数组**********abc[^].name:"+result);   

//输出:***测试数组**********abc[^].name:user0   

result = Ognl.getValue("abc[$].name",distObject);   

System.out.println("***测试数组**********abc[$].name:"+result);   

 //输出:***测试数组**********abc[$].name:user2   

result = Ognl.getValue("abc[|].name",distObject);   

System.out.println("***测试数组**********abc[|].name:"+result);   

//输出:***测试数组**********abc[|].name:user1  

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

Java代码

Map distObject=new HashMap();   

List users=new ArrayList();   

User user0=new User();   

user0.setName("user0");   

users.add(user0);   

User user1=new User();   

user1.setName("user1");   

users.add(user1);   

User user2=new User();   

user2.setName("user2");   

users.add(user2);   

distObject.put("abc",users);   

Object result = Ognl.getValue("abc[1].name",distObject);//********(1)   

  System.out.println("***测试ArrayList**********abc[1].name:"+result);   

//输出:***测试数组**********abc[1].name:user1  

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

Java代码

Map distObject=new HashMap();   

Map uMap=new HashMap();   

User user=new User();   

user.setName("user0");   

uMap.put("user0",user);   

user=new User();   

user.setName("user1");   

uMap.put("user1",user);   

user=new User();   

user.setName("user2");   

uMap.put("user2",user);   

distObject.put("abc",uMap);   

Object result = Ognl.getValue("abc['user2'].name",distObject);//********(1)   

System.out.println("***测试字符串下标**********abc['user2'].name:"+result);   

//输出:***测试字符串下标**********abc['user2'].name:user2  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值