`
kidiaoer
  • 浏览: 805891 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

OGNL表达式语言介绍

阅读更多
OGNL表达式语言介绍

OGNL介绍
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
XWork遵循“不要重复地发明同一个轮子”的理论,它的表达式语言核心用的就是这个OGNL。我们先来看看一个简单的例子:
还记得我们用户注册的那个例子吗?我们输入框的name用到的名字就是OGNL的表达式,比如:用户名的输入框:“<input type="text" name="user.username">”,在用户注册成功之后我们要显示用户注册的信息,用了“<ww:property value="user.username"/>”。Input输入框里的“user.username”,它解析成Java语句为:getUser().setUsername();,property标签里的“user.username”解析为Java语句:getUser.getUsername();。
我们的两个表达式都是相同的,但前一个保存对象属性的值,后一个是取得对象属性的值。表达式语言简单、易懂却又功能强大,关于OGNL更多的介绍可以去http://www.ognl.org,那里有很详细的文档
 
值堆栈-OgnlValueStack
OGNL在框架中的应用,最主要是支持我们的值堆栈(Value Stack)——OgnlValueStack,它主要的功能是通过表达式语言来存取对象的属性。用户界面输入数据,它会根据保存表达式将数据依次保存到它堆栈的对象中,业务操作完成,结果数据会通过表达式被获取、输出。
还记得我们用户注册的例子吗?下面我们用一段程序来演示它向 OgnlValueStack中保存、取得数据的步骤:
 
// DemoRegisterValueStack
package example.register;
import com.opensymphony.xwork.util.OgnlValueStack;
 
public class DemoRegisterValueStack {
    public void demo(){
        RegisterAction action = new RegisterAction();
        OgnlValueStack valueStack= new OgnlValueStack();
        valueStack.push(action);
       
        valueStack.setValue("user.username","Babydavic");
        System.out.println("username = "+valueStack.findValue("user.username"));
    }
 
    public static void main(String[] args) {
DemoRegisterValueStack demoValueStack = new DemoRegisterValueStack();
        demoValueStack.demo();
    }
}
 
我们来看一看它的demo()方法:
1、   创建我们的Action(RegisterAction)类的对象action,将action对象压入堆栈valueStack中。在WebWrok中 Action的创建、入栈是在DefaultActionInvocation构造函数中进行的,详细介绍见:ServletDispatcher原理。
2、   通过表达式语言,调用堆栈对象的get()、set()方法,设置该对象的值。
   public void setValue(String expr, Object value)
   语句:valueStack.setValue("user.username","Babydavic");
   的作用等同于:action.getUser().setUsername("Babydavic");
3、   通过表达式语言,去堆栈对象中查找我们前面保存的值,并在控制台打印。valueStack.findValue("user.username")等同与语句:
action.getUser().getUsername()
最后控制台打印的结果:
         username = Babydavic
 
 
CompoundRoot
在OgnlValueStack中,一个堆栈其实是一个List。查看OgnlValueStack你会发现,堆栈就是 com.opensymphony.xwork.util.CompoundRoot类的对象:
 
public class CompoundRoot extends ArrayList {
    //~ Constructors /////////////////////////////////////
    public CompoundRoot() {
}
 
    public CompoundRoot(List list) {
        super(list);
}
 
    //~ Methods ////////////////////////////////////////////
    public CompoundRoot cutStack(int index) {
        return new CompoundRoot(subList(index, size()));
}
 
    public Object peek() {
        return get(0);
    }
    public Object pop() {
        return remove(0);
    }
    public void push(Object o) {
        add(0, o);
    }
}

我们通过表达式向堆栈对象操作时,我们并不知道堆栈中有哪些对象。OgnlValueStack会根据堆栈由上向下的顺序(先入栈在下面,最后入栈在最上面)依次去查找与表达式匹配的对象方法,找到即进行相应的存取操作。假设后面对象也有相同的方法,将不会被调用。
下面我们看一个对 OgnlValueStack操作的程序,它主要演示了如何对Map对象的存取和OgnlValueStack堆栈的原理
 
package example.register;
 
import com.opensymphony.xwork.util.OgnlValueStack;
 
public class DemoGroupValueStack {
   
    public void demoAction(){
        DemoGroupAction action = new DemoGroupAction();
        OgnlValueStack valueStack= new OgnlValueStack();
        valueStack.push(action);
       
        User zhao = new User();
        zhao.setUsername("zhao");
        zhao.setEmail("zhao@yahoo.com.cn");
       
        User qian = new User();
        qian.setUsername("qian");
        qian.setEmail("qian@yahoo.com.cn");
       
        valueStack.setValue("users['zhao']",zhao);
        valueStack.setValue("users['qian']",qian);
       
       
        System.out.println("users['zhao'] = "+valueStack.findValue("users['zhao']"));
        System.out.println("users['qian'] = "+valueStack.findValue("users['qian']"));
        System.out.println("users size = "+valueStack.findValue("users.size"));
       
        System.out.println("allUserName[0] = "+valueStack.findValue("allUserName[0]"));
    }
   
    public void demoModels(){
       
        User model_a = new User();
        model_a.setUsername("model_a");
        User model_b = new User();
        model_b.setUsername("model_b");
        User model_c = new User();
        model_c.setUsername("model_c");
       
        OgnlValueStack valueStack= new OgnlValueStack();
        valueStack.push(model_a);
        valueStack.push(model_b);
        valueStack.push(model_c);
       
        System.out.println("username = "+valueStack.findValue("username"));
        System.out.println("[1].username = "+valueStack.findValue("[1].username"));
        System.out.println("[0].toString = "+valueStack.findValue("[0]"));
        System.out.println("[1].toString = "+valueStack.findValue("[1]"));
        System.out.println("[2].toString = "+valueStack.findValue("[2]"));
       
    }
    public static void main(String[] args) {
        DemoGroupValueStack demoValueStack = new DemoGroupValueStack();
        demoValueStack.demoAction();
        demoValueStack.demoModels();
    }
}
 
 
package example.register;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class DemoGroupAction {
   
    private Map users = new HashMap();
   
    public Map getUsers(){
        return this.users;
    }
   
    public List getAllUserName(){
        return new ArrayList(users.keySet());
    }
    public String execute(){
        //执行业务操作
        return null;
    }
    public String toString(){
        return users.toString();
    }
}
注意:1、 Map属性的存取,它的表达式语言如:users['zhao'],注意它用’’来引用HashMap的key字符串。
2、 demoModels()方法演示了OgnlValueStack中堆栈的原理,请特别注意它的 [0].toString、[1].toString、[2].toString,它们依次调用堆栈中对象的toString()方法,并逐一的减少堆栈最上面的对象。
控制台输出的结果如下:
users['zhao'] = username=zhao;password=null;email=zhao@yahoo.com.cn;age=0
users['qian'] = username=qian;password=null;email=qian@yahoo.com.cn;age=0
users size = 2
allUserName[0] = qian
 
username = model_c
[1].username = model_b
[0].toString = [username=model_c;password=null;email=null;age=0, username=model_b;password=null;email=null;age=0, username=model_a;password=null;email=null;age=0]
[1].toString = [username=model_b;password=null;email=null;age=0, username=model_a;password=null;email=null;age=0]
[2].toString = [username=model_a;password=null;email=null;age=0]

分享到:
评论

相关推荐

    Struts2的标签库及OGNL表达式语言

    Struts2的标签库及OGNL表达式语言

    ognl表达式java使用案例详解(测试通过)

    Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1、 支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@...

    OGNL表达式语言学习

    NULL 博文链接:https://huguifuture.iteye.com/blog/761843

    OGNL表达式语言浅谈.pdf

    OGNL表达式语言浅谈.pdf

    实验4 Struts2的类型转换与OGNL表达式语言.doc

    1、 理解Struts2的类型转换类型 2、 理解局部类型转换器与全局类型转换器的区别 3、 掌握Struts2的自定义类型转换 4、 理解OGNL表达式语言

    OGNL表达式语言.txt

    OGNL表达式语言: 相对EL表达式,它提供了平时我们需要的一些功能,如: ? 支持对象的方法调用 ,如 xxx.sayHello(); ? 支持类静态方法调用和值的访问,表达式的格式为@[类全名]@[方法名|值名],例如:@java....

    struts2_OGNL表达式ActionContext及valuesStack

    struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号

    OGNL表达式struts2标签

    是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点: 1、支持对象方法调用,形式如:objName.methodName(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 | 值名]...

    关于国际化、OGNL表达式语言

    本篇文章,小编为大家介绍关于国际化、OGNL表达式语言,有需要的朋友可以参考一下

    struts2 OGNL表达式使用

    OGNL是对象图导航语言(即该表达式访问的是对象及对象的属性)

    OGNL表达归纳

    1.OGNL表达式语言 2.访问上下文(Context)中的对象需要使用#符号标注命名空间 3.由于ValueStack(值栈)是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问...

    Struts2表达式语言----OGNL语言指南

    Struts 2默认的表达式语言,

    struts2 OGNL语言学习笔记

    本人在学习struts2框架时的学习笔记,主要是ognl表达式语言的运用。希望对大家有所帮助!

    ognl表达式详解

    应用于Java中的一个开源的表达式语言,它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。

    Struts2-OGNL.rar_ognl

    Struts2的OGNL表达式语言Object-Graph Navigation Language

    struts2讲义_吴峻申

    5.2 OGNL表达式语言介绍 75 5.3 Struts2控制标签简介 79 5.3.1 append标签使用介绍 79 5.3.2 generator标签使用介绍 80 5.3.3 if、else、elseif标签使用介绍 81 5.3.4 iterator标签使用介绍 82 5.3.5 merge标签使用...

    OGNL中文版详细文档

    目录 1. 简介 2. 历史 3. 语法 4. 表达式 常数 属性引用 索引 数组(Array)与列表(List)的索引 JavaBean中的索引属性(Indexed Properties) ...3.1. OGNL 表达式元素 4.1. 集合的特殊伪属性 A.1. OGNL 操作符

    OGNL - 功能强大的表达式语言

    NULL 博文链接:https://topmanopensource.iteye.com/blog/378904

    struts2项目

    Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP... 二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。

    最新Struts2 jar 架包

    整理了1个上午 Oracle+Weblogic,主要内容如下: struts2-core-2.1.8.jar Struts2的核心包 struts2-json-plugin-2.1.8.jar json进行异步...ognl-2.7.3.jar OGNL表达式语言,struts2支持该EL antlr-2.7.6.jar HQL解析

Global site tag (gtag.js) - Google Analytics