`
nanjingjiangbiao_T
  • 浏览: 2739800 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

ognl 介绍

 
阅读更多

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

下面在普通的project中,看一下ognl的各种表达式的运用。

复制代码
public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
复制代码

复制代码
public class Dog {
    private String name;
    private String[] friends;
    
    public String[] getFriends() {
        return friends;
    }

    public void setFriends(String[] friends) {
        this.friends = friends;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
复制代码

复制代码
package com.suo.ognl;

import java.util.ArrayList;

public class OgnlTest {
    public static void main(String[] args) throws OgnlException {
        Person person=new Person();
        person.setName("suo");
        
        Dog dog=new Dog();
        dog.setName("aHuang");
        
        OgnlContext context=new OgnlContext();//Ognl的上下文环境
        context.put("person", person);
        context.put("dog", dog);
        
        context.setRoot(person);//设置person为根元素
        
        /**
         * 若访问的是根元素中的属性,那么在解析的表达式中,只需要直接指定属性名就可以了。
         */
        Object object1=Ognl.parseExpression("name");//此处写为getName()也可以
        System.out.println(object1);
        
        Object object2=Ognl.getValue(object1, context, context.getRoot());
        System.out.println(object2);
        
        /**
         * 若访问的不是根元素的属性,那么在解析的表达式中,就要用“#”来指定访问哪个元素的属性。<br>
         * 当然,访问根元素的属性,也可以用这种方式。
         */
        Object object3=Ognl.parseExpression("#dog.name.toUpperCase()");//这里会调用get方法来获得属性
        System.out.println(object3);
        
        Object object4=Ognl.getValue(object3, context, context.getRoot());
        System.out.println(object4);
        
        Object object5=Ognl.parseExpression("#person.name");
        System.out.println(object5);
        
        Object object6=Ognl.getValue(object5, context, context.getRoot());
        System.out.println(object6);
        
        /**
         * 调用静态方法的表达式为:@package.classname@methodname(parameter)
         */
        Object object7=Ognl.parseExpression("@java.lang.Integer@toBinaryString(5)");
        System.out.println(object7);
        
        Object object8=Ognl.getValue(object7, context, context.getRoot());
        System.out.println(object8);
        
        
        /**
         * Ognl默认的类是java.lang.Math,所以调用它中的静态方法或静态变量,无需指定类名
         */
        Object object9=Ognl.parseExpression("@@min(4,8)");
        System.out.println(object9);
        
        Object object10=Ognl.getValue(object9, context, context.getRoot());
        System.out.println(object10);
        
        /**
         * ognl还可以通过表达式来新建一个对象
         */
        Object object11=Ognl.parseExpression("new java.util.LinkedList()");
        System.out.println(object11);
        
        Object object12=Ognl.getValue(object11, context, context.getRoot());
        System.out.println(object12);
        
        /**
         * 还可以将上面的两个方法合二为一<br>
         * ognl中,数组和集合是一样的,都是通过下标索引去访问的,构造集合使用“{}”的形式。
         */
        Object object13=Ognl.getValue("{'aa','bb','cc','dd'}[3]", context, context.getRoot());
        System.out.println(object13);
        
        //数组
        dog.setFriends(new String[]{"a","b","c"});
        Object object14=Ognl.getValue("#dog.friends[1]", context, context.getRoot());
        System.out.println(object14);
        
        List<String> list=new ArrayList<String>();
        list.add("suo");
        list.add("love");
        list.add("piao");
        context.put("list", list);
        
        //集合
        Object object15=Ognl.getValue("#list[1]", context, context.getRoot());
        System.out.println(object15);
        
        //Map,此处的#号和以上的#号意义不同。
        Object object16=Ognl.getValue("#{'k1':'v1','k2':'v2','k3':'v3'}['k2']", context, context.getRoot());
        System.out.println(object16);
        
        
        /**
         * 对List的过滤,即将符合条件的元素过滤出来。
         * 相当于取出表中的一行行符合条件的完整的记录,是原有集合的一个子集。
         * 过滤的表达式的格式为:collection.{? expression}。
         * #this表示当前正在迭代的对象。
         */
        List<Person> persons=new ArrayList<Person>();
        
        Person p1=new Person();
        Person p2=new Person();
        Person p3=new Person();
        
        p1.setName("suo");
        p2.setName("piao");
        p3.setName("rachel");
        
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        
        context.put("persons", persons);
        
        //获得符合条件的所有元素:collection.{? expression}
        System.out.println(Ognl.getValue("#persons.{? #this.name.length() > 3}", context, context.getRoot()));
        
        //获得符合条件的第一个元素:collection.{^ expression}
        System.out.println(Ognl.getValue("#persons.{^ #this.name.length() > 3}[0].name", context, context.getRoot()));
        
        //获得符合条件的最后一个元素:collection.{$ expression}
        System.out.println(Ognl.getValue("#persons.{$ #this.name.length() > 3}[0].name", context, context.getRoot()));
        
        /**
         * 投影,取出集合中对象的统一属性,所得的集合大小和原集合大小肯定是一样的。
         * 格式为:collection.{expression}
         * 这相当于是取表中的所有集合的相同的列。
         */
        //取得集合中的所有对象的name属性
        System.out.println(Ognl.getValue("#persons.{name}",context,context.getRoot()));
        
        //若集合中的对象的name值长度小于等于4,那么将其替换成World
        System.out.println(Ognl.getValue("#persons.{#this.name.length()<=4 ? 'World' : #this.name}",context,context.getRoot()));
    }
}
分享到:
评论

相关推荐

    ognl表达式 ognl表达式

    ### OGNL表达式的理解和应用 ...通过上述介绍可以看出,OGNL作为一种强大的表达式语言,在Struts2框架中扮演着非常重要的角色,不仅可以方便地访问和操作对象属性,还能有效地处理复杂的业务逻辑。

    OGNL表达式的使用及文档

    本篇将详细介绍OGNL的使用方法及其核心概念。 一、OGNL的基础知识 1. **表达式语法**:OGNL表达式通常由对象名、点号和属性名组成,例如`user.name`,表示获取`user`对象的`name`属性。也可以通过索引访问集合元素...

    ognl英文帮助文档

    1. **OGNL基本语法**:介绍OGNL的基本表达式,包括访问对象属性(如`obj.property`),调用方法(如`obj.method()`),以及数组和集合的操作(如`array[0]`,`collection.size()`)。 2. **OGNL的上下文(Context)...

    ognl-2.6.11.jar 官方源码

    3. **学习文档**:官方文档会详细介绍OGNL的语法和用法,是学习的基础。 4. **参与社区**:加入OGNL相关的开发者社区,讨论问题,分享经验,获取最新的信息和更新。 总而言之,ognl-2.6.11.jar的源码提供了深入了解...

    OGNL学习笔记,包含struts2中ognl的各种用法

    本篇笔记主要介绍了在Struts2中使用OGNL的一些基本用法。 首先,OGNL可以用来获取不同范围内的属性值。在Java Web开发中,有四种常见的作用域:Request、Session、Application和Page。在示例代码中,`&lt;s:property&gt;`...

    java的Struts中的OGNL标签的使用,详细介绍

    本篇文章将详细介绍如何在Struts2中使用OGNL标签。 OGNL作为Struts2的核心部分,允许我们在JSP页面上直接访问Action类中的属性,甚至可以进行复杂的运算和控制流程。它的主要优点在于简洁和灵活,能够轻松处理Java...

    ognl.rar_OGNL API_og_ognl

    5. **OGNL API**:API文档会详细介绍如何在Java代码中使用OGNL,包括解析和评估表达式,设置和获取值,以及与其他Java对象交互的方法。 6. **安全考虑**:由于OGNL的强大功能,如果不正确地使用,可能会导致安全...

    struts2 ognl的用法

    ### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式...通过本文对OGNL在Struts2中的应用场景和使用技巧的介绍,希望能帮助开发者更好地利用这一强大工具。

    Ognl的扩展

    - **调试OGNL**:介绍一些工具和技巧,帮助开发者调试和理解复杂的OGNL表达式。 在提供的压缩包文件`OGNL.asta`中,可能包含的是OGNL的语法树表示,用于解析和分析OGNL表达式。这样的文件通常由语法分析工具生成,...

    传智168期JavaEE struts2杜宏 day32~day33笔记

    #### OGNL介绍与简单使用 ##### OGNL概述 OGNL(Object Graphic Navigation Language)即对象图导航语言,是Struts2框架中使用的默认表达式语言。作为一种强大的表达式语言,OGNL具有以下特性: 1. **对象方法调用*...

    struts2讲义_吴峻申

    1.2.5 OGNL介绍和类型转换目的 15 1.2.6 进行校验 16 1.2.7 Web项目国际化根由 16 1.2.8 SiteMesh页面布局框架简介 17 1.3 我们为什么要用Struts2 17 1.4 Web项目中使用Struts2初探 20 第2章 Web基础技术简介 31 2.1...

    ognl表达式教程

    ognl表达式的详细教学描述,介绍如何使用ognl表达式和ognl的运行原理

    Struts2 ognl

    这篇博文可能详细介绍了Struts2框架中OGNL的使用、工作原理以及相关安全问题。 OGNL是一个轻量级的表达式语言,它的主要功能是获取和设置对象属性,支持复杂的运算符和函数调用,使得开发者能够在模板中灵活地访问...

    struts2讲义

    - **1.2.5 OGNL介绍和类型转换目的** - **知识点**: 介绍了OGNL(Object-Graph Navigation Language)及其在Struts2中的用途。 - **核心内容**: - OGNL是一种强大的表达式语言,用于访问和操作Java对象图。 - ...

    Struts2.1讲义

    - **1.2.5 OGNL介绍与类型转换** OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于访问和操作对象图。Struts 2通过OGNL支持动态的数据绑定和类型转换,使得开发者能够轻松地处理复杂的业务...

    strus2讲义

    - **1.2.5 OGNL介绍和类型转换目的** - **知识点**: OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于访问和设置Java对象属性。Struts2利用OGNL进行数据绑定和类型转换。 - **重要性**: 了解...

    Struts2深入理解

    OGNL介绍:** - **OGNL全称对象图形导航语言:** 它是一种强大的表达式语言,用于获取或设置Java对象的属性。 - **OGNL在Struts2中的作用:** - **访问Action中的成员:** 开发者可以通过OGNL在JSP页面中轻松访问...

    struts2 讲义完整版

    1.2.5 OGNL介绍和类型转换目的 OGNL是Struts2中的表达式语言,用于在视图层和模型层之间传递数据,支持复杂的数据绑定和动态方法调用。同时,OGNL也负责类型转换,自动将字符串转换为对应的Java类型。 1.2.6 进行...

    Strust-2.3.4.1帮助文档html形式

    - **OGNL介绍**:讲解OGNL的基本语法和在Struts 2中的应用。 - **视图技术**:说明如何结合JSP、FreeMarker等技术来构建视图。 - **插件使用**:详述各种插件的功能和配置方法,如struts2-convention-plugin、struts...

Global site tag (gtag.js) - Google Analytics