`
tangyi198388
  • 浏览: 18012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ognl的学习例子

阅读更多
原贴见:http://blog.csdn.net/upccpu/archive/2005/10/09/498407.aspx

在解释OGNL表达式的时候,是在当前对象上下文中的。在一个链中,前一个对象做为解释下一个对象的上下文。你可以任意扩展这个链。例如:
name.toCharArray()[0].numericValue.toString()
解释步骤如下:
1)   从跟或初始对象提取name属性(初始或跟对象可以通过OGNL Context设置)
2)   调用name的toCharArray()方法
3)   取toCharArray()方法返回的第一个字符对象(Character)
4)   调用Character的getNumericValue()方法
最后调用toString()方法

一、OGNL处理不同对象的属性是不一样的。
1.   Map的属性就是key
2.   Lists和Array的属性就是下标index
3.   String的属性也是下标
4.   普通对象只能处理string属性,这个属性具有set/get或is/set方法。

属性名可以是任何类型,而不仅仅是“字符串类型的名字”(注意区别属性名和属性值的类型,这里是说这个属性的名字可以是非字符串的,例如这个属性的名字可以是一个数字),对于非字符串类型的属性名,我们访问属性值的时候要用下标的形式。例如对一个数组array:
它的长度是array的一个属性,这个属性名字叫做length,这个名字是一个字符串,因此可以用下面的方式访问:
array.length

现在要访问第0个元素,那么这个属性名是0,它是数字,应该按下下标方式访问
array[0]
OGNL内部是将array.length
做为array[“length”]形式的,同时也等价于array[“len”+”gth”]


OGNL对index方式访问属性做了扩展,它不仅仅可以用整数下标,也可以使用任意的对象做index。OGNL将匹配java对象中下列形式的方法:
public PropertyType getPropertyName(IndexType index)
public void setPropertyName(IndexType index, PropertyType value)
PropertyType 和 IndexType必须在相应的set和get方法中匹配。在webwork中的Session对象就有:
    public Object getAttribute(String name)

public void setAttribute(String name, Object value)

来设置任意类型的属性值。使用OGNL表达式来访问就是:
    session.attribute[“foo”]

反应ognl特点的例子:
public class Root {
    public static final String      SIZE_STRING = "size";

    private int[]  array = { 1, 2, 3, 4 };

    private Map  map = new HashMap(23);

    private List list = Arrays.asList(new Object[] { null, this, array });

    public Root(){

         map.put( "test", this );

         map.put( "array", array );

         map.put( "list", list );

         map.put( "size", new Integer(5000) );

         map.put( DynamicSubscript.first, new Integer(99) );

    }
      .......set,get方法
}

测试:
public class RootTest extends TestCase {

    private OgnlContext context;

    private static Root ROOT = new Root();

    public void testProperties()throws Exception{
        SimpleNode expression;

        //直接用Root中map属性的名字来访问
        expression = (SimpleNode) Ognl.parseExpression("map");
        assertTrue(Ognl.getValue(expression, context, ROOT) == ROOT.getMap());
        //访问Root中map属性的test属性
        expression = (SimpleNode) Ognl.parseExpression("map.test");
        assertTrue(Ognl.getValue(expression, context, ROOT).equals(ROOT));
        //上面用map.test来访问,现在用下标形式访问
        expression = (SimpleNode) Ognl.parseExpression("map[\"test\"]");
        assertTrue(Ognl.getValue(expression, context, ROOT).equals(ROOT));
        //跟上面的是一样的,这里演示了下标计算之后,访问到的值
        expression = (SimpleNode) Ognl.parseExpression("map[\"te\" + \"st\"]"");
        assertTrue(Ognl.getValue(expression, context, ROOT).equals(ROOT));
        /*来看看对size的访问,这里有看头,在初始化的时候是map.put( "size", new Integer(5000) );
         *很自然我们会想到用map.size或者map["size"]来访问,显然没有问题
         *这里要演示的是,怎样访问静态变量,在Root中定义了:
         *public static final String      SIZE_STRING = "size";
         *我们不可以用map[Root.SIZE_STRING]的形式访问吗?写成下面的形式:
         *expression = (SimpleNode) Ognl.parseExpression("map[Root.SIZE_STRING]");
         *OGNL就会认为有Root.SIZE_STRING这样一个对象是map的属性,而不是先去解释Root.SIZE_STRING为字符串size的
         *看看下面是怎么办的,@做为静态导航
         */
        expression = (SimpleNode) Ognl.parseExpression("map[@net.wide.ognl.bean.Root@SIZE_STRING]");
        System.out.println(Ognl.getValue(expression, context, ROOT));

        //下面通过下标访问List或者数组
        expression = (SimpleNode) Ognl.parseExpression("map.array[0]");//map.list[1]
        System.out.println(Ognl.getValue(expression, context, ROOT));

        /*对DynamicSubscript的测试
         * 先看看它的代码:
         * switch (flag)
          {
            case FIRST: return "^";
            case MID:   return "|";
            case LAST:  return "$";
            case ALL:   return "*";
            default:    return "?"; // Won't happen
          }
          很清楚了!下面来试试
          在Root中有这么一个初始化的地方:
          map.put( DynamicSubscript.first, new Integer(99) );
          我们通过OGNL表达式怎么访问呢?

          对于一个数组或List应用上面的表达式,则是取出在这个列表中对应位置的元素
          在Map中我们需要显示地使用DynamicSubscript.first等做为key才能取得到值
         */
        expression = (SimpleNode) Ognl.parseExpression("map[^]");

        System.out.println("first-^:" + Ognl.getValue(expression, context, ROOT));

        expression = (SimpleNode) Ognl.parseExpression("map.array[|]");

        System.out.println("middle-|:" + Ognl.getValue(expression, context, ROOT));

        expression = (SimpleNode) Ognl.parseExpression("map.array[$]");

        System.out.println("last-$:" + Ognl.getValue(expression, context, ROOT));

        expression = (SimpleNode) Ognl.parseExpression("map.array[*]");

        System.out.println("all-*:" + Ognl.getValue(expression, context, ROOT));

        //测试数组或列表的伪属性
        expression = (SimpleNode) Ognl.parseExpression("map.array.length");

        System.out.println("array length:" + Ognl.getValue(expression, context, ROOT));


        /* 看看下面有这么一个东东:
         * map.(array[2] + size()).doubleValue()
         * 在前面的学习中,我们了解了OGNL的导航链,解析链中的属性或方法都是基于当前解释出来的结果的
         * 因此array[2]就是map.array[2]
         * size()就是map.size()
         * 他们相加转换成Double型。
         * 看看结果是:8.0
         */
        expression = (SimpleNode) Ognl.parseExpression("map.(array[2] + size()).doubleValue()");

        System.out.println("map.(array[2] + size()).doubleValue():" + Ognl.getValue(expression, context, ROOT));

        //map.(#this),this是对自身的引用,另外注意在变量名前加#符号,这个变量在这个表达式里面是全局的

        expression = (SimpleNode) Ognl.parseExpression("map.(#this)");

        System.out.println("map.(#this):" + Ognl.getValue(expression, context, ROOT));

        //几个OGNL表达式,下面的意思是,测试map的第一个元素是否为空,如果为空则返回empty否则返回该对象

        //这个写法我们非常熟悉,无论是java还是c都有这种写法

        expression = (SimpleNode) Ognl.parseExpression("map[^].(#this == null ? 'empty' : #this)");

        System.out.println("map[^].(#this == null ? 'empty' : #this):" + Ognl.getValue(expression, context, ROOT));

    }

}

分享到:
评论
2 楼 airlink 2009-11-17  
例子疑似不完整,缺少对context的初始化。
查了其他例子才知道是这样的:
context = (OgnlContext)Ognl.createDefaultContext(null);

可在setUp中做
1 楼 xiongpf88 2008-01-30  
呵呵,有空教我

相关推荐

    学习OGNL在Struts2中工作原理

    ### 学习OGNL在Struts2中的工作原理 #### OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架的一个核心特性之一,被广泛应用于框架的...

    学习Ognl 这是为初学Ognl者提供的一个小例子,本人也在学习中,希望通过它能让你认识 Ognl ,送达到入门!!

    通过深入学习和实践,你可以掌握Ognl的核心概念,理解其在Web开发中的重要作用,并能够安全有效地使用Ognl表达式进行数据访问和控制逻辑的实现。这个压缩包中的例子是一个很好的起点,可以帮你快速上手Ognl,开启你...

    OGNL表达式的使用及文档

    三、OGNL在实际应用中的例子 1. **Spring MVC**:在Spring MVC中,OGNL用于视图层的数据绑定,如`<form:input path="user.name"/>`。 2. **Struts 2**:Struts 2的Action对象和视图之间的数据传递也依赖于OGNL。 ...

    ognl-2.6.11.jar源码

    总的来说,对ognl-2.6.11.jar源码的学习有助于我们深入理解OGNL的内部机制,提升在Struts2框架下工作的能力,以及更好地处理与之相关的性能和安全问题。同时,这也有助于我们拓展对Java表达式语言的理解,以及在其他...

    JS:ognl表达式

    OGNL 表达式的语法非常直观且易于学习。下面是一些基本概念: - **属性访问**:`object.property`,用于获取对象的属性值。 - **方法调用**:`object.method()`,用于调用对象的方法。 - **数组和集合访问**:`...

    Struts2_OGNL

    在掌握Struts2和OGNL的基础上,开发者可以进一步学习Struts2的其他组件和特性,如标签库、异常处理、国际化支持、拦截器机制、输入校验、文件上传和下载等,这些都是构建复杂Web应用不可或缺的组件和功能。

    ognl.zip_ognl

    **正文** OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。...通过对压缩包中的例子进行实践,你将能更好地理解和掌握OGNL的用法,并将其运用到实际项目中。

    Ognl_JSTL_学习笔记.zip

    5. **实战演练**:通过实际项目或例子,练习使用Ognl和JSTL组合处理动态数据和页面渲染。 通过深入学习和实践《Ognl_JSTL_学习笔记.doc》,开发者可以熟练掌握这两种技术,提高在Java Web开发中的效率和代码质量。...

    Struts2 OGNL示例(Maven项目)

    Struts2是一个非常流行的Java Web框架,它极大地简化了开发基于MVC模式的Web应用程序的过程。...通过这个项目,开发者可以深入学习如何在实际项目中利用OGNL的强大功能,提高代码的简洁性和可维护性。

    拦截器+ognl+aop

    通过学习这些示例,你可以深入理解这三者如何协同工作,以及在实际项目中如何应用它们。拦截器通常用于处理HTTP请求,OGNL用于视图和模型间的数据传递,而AOP则负责管理和插入全局性的行为。这个小例子虽然可能不...

    struts2.0学习例子

    本学习例子将带你深入理解Struts2的核心概念和用法。 1. **Struts2的基本架构** Struts2的核心组件包括Action类、配置文件(struts.xml)、拦截器(Interceptors)和结果类型(Result)。Action类是业务逻辑的载体...

    ssh框架学习例子

    这个"ssh框架学习例子"是一个基于这三个框架的学习项目,旨在帮助开发者理解和掌握如何将它们集成到一个实际应用中。下面我们将深入探讨这三个框架以及它们在项目中的作用。 **Struts2** 是一个MVC(Model-View-...

    strust2的各种学习例子

    以下是对"strust2的各种学习例子"中可能包含的知识点的详细解释: 1. **MVC模式**:Struts2基于MVC设计模式,使得业务逻辑、数据和用户界面分离,提高了代码的可维护性和可重用性。模型负责业务逻辑,视图负责展示...

    搭建SSH框架的学习例子

    以下是对这些框架及其在"搭建SSH框架的学习例子"中所涉及的知识点的详细说明。 **Struts** Struts是MVC(Model-View-Controller)设计模式的一种实现,主要用于处理HTTP请求和控制应用的流程。它通过Action类来接收...

    struts2 ognl

    Struts2 OGNL(Object-Graph ...通过学习和掌握Struts2中的OGNL,开发者能够更高效地实现MVC架构中的数据交互,提高开发效率和代码的可读性。同时,理解OGNL的工作原理也有助于排查和解决与表达式相关的错误和问题。

    struts2中ognl的使用

    在这个例子中,`user.name`和`user.roles`都是OGNL表达式,分别显示用户的名字和角色列表。 ### 结论 OGNL是Struts2中不可或缺的一部分,它的强大功能使得开发者能更轻松地处理数据绑定和视图呈现。理解并熟练使用...

    struts2标签使用例子

    在压缩包中的"example"文件可能包含了一个或多个使用Struts2标签的实际示例,可以参考这些示例来理解和学习Struts2标签的用法。通过实践,你会更好地掌握这些标签的功能和用法,从而在开发过程中更加得心应手。

    struts2 经典学习小例子

    在这个"struts2 经典学习小例子"中,我们将探讨以下几个关键知识点: 1. **拦截器(Interceptors)**: 拦截器是Struts2框架的核心特性之一,它允许开发者在Action执行前后插入自定义逻辑。在这个实例中,我们可能...

    Struts用的ognl和valueStack(vs)实例

    Struts是Java Web开发中的一个开源框架,它主要用于构建基于MVC(Model-View-Controller)模式的应用程序。...在学习过程中,可以结合Struts_Study中的例子进行实践,这将有助于更好地掌握这些概念。

    struts2按阶段学习的具体例子

    这个"struts2按阶段学习的具体例子"压缩包显然包含了逐步学习Struts2的资源,帮助初学者从基础到进阶掌握这个框架。在接下来的内容中,我们将深入探讨Struts2的关键知识点,以期为你提供一个全面的学习路径。 1. **...

Global site tag (gtag.js) - Google Analytics