OGNL学习(一)Ognl和OgnlContext
来源:互联网 发布:淘宝嘉年华在哪里 编辑:程序博客网 时间:2024/05/22 00:48
各种表达式如下:(导入相关jar包,OGNL.jar 和javassist.jar)
package com.ognl;import java.util.ArrayList;import java.util.List;import ognl.Ognl;import ognl.OgnlContext;public class OgnlTest {public static void main(String[] args) throws Exception {Person person = new Person();person.setName("zhangsan");Dog dog = new Dog();dog.setName("wangcai");Dog dog2 = new Dog();dog2.setName("maomao");person.setDog(dog2);OgnlContext context = new OgnlContext();//实现了map接口context.put("person", person);context.put("dog", dog);context.setRoot(person);Object object = Ognl.parseExpression("name");System.out.println(object);//name/* * Ognl.getValue(object,context,context.getRoot()) * 它会到指定的上下文context中去寻找object,默认是到根元素中寻找 * 在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get() * 方法,如果寻找的不是根对象的中的属性,那么需要以#开头,告诉OGNL,去寻找指定对象中的属性 */Object object2 = Ognl.getValue(object, context,context.getRoot());System.out.println(object2);//zhangsanObject o = Ognl.getValue("name", context,context.getRoot());System.out.println(o);//zhangsanObject object3 = Ognl.getValue("#dog.name",context,context.getRoot());System.out.println(object3);//wangcaiObject object4 = Ognl.getValue("#person.dog.name", context,context.getRoot());System.out.println(object4);//maomao/* * 调用属性所用的方法 */System.out.println("-------------------------------");//Object obj = Ognl.getValue("getName().toUpperCase()", context,context.getRoot());//效果同下Object object5 = Ognl.getValue("name.toUpperCase()", context,context.getRoot());System.out.println(object5);//ZHANGSANSystem.out.println("--------------------------------");/* * 当使用OGNL调用静态方法的时候,需要按照如下的语法编写表达式 * @package.classname@method(parameters) * 较特殊的类:对OGNL来说,java.lang.Math是其默认的类,即调用java.lang.Math的静态方法时, * 无需指定类的名称 */Object object6 = Ognl.getValue("@java.lang.Integer@toBinaryString(10)",context,context.getRoot());System.out.println(object6);//1010Object object7 = Ognl.getValue("@@min(7,10)", context,context.getRoot());System.out.println(object7);//7System.out.println("----------------------------");/* * 数组和集合 * 都是通过下标索引访问 */Object object8 = Ognl.getValue("{'aa','bb','cc'}[2]", context,context.getRoot());System.out.println(object8);//ccSystem.out.println("-------------------------");/* * 映射Map * 语法格式如下: * #{'key1':'value1','key2':'value2'} */Object object9 = Ognl.getValue("#{'key1':'value1','key2':'value2'}['key2']", context,context.getValues());System.out.println(object9);//value2System.out.println("--------------------------");/* * 过滤 * 格式: * collection.{? expression} * 返回的是集合 * #this表示遍历时每个对象(联想增强for循环) */List<Person> list = new ArrayList<Person>();Person p1 = new Person();Person p2 = new Person();Person p3 = new Person();p1.setName("hehe");p2.setName("xixi3");p3.setName("haha333");list.add(p1);list.add(p2);list.add(p3);context.put("list",list);System.out.println(Ognl.getValue("#list.{? #this.name.length() > 4}.size()", context,context.getRoot()));//2/* * 过滤获取集合中的第一个元素 * 表达式: * collection.{^ expression} * 返回值为集合 */System.out.println(Ognl.getValue("#list.{^ #this.name.length() > 4}.get(0).getName()", context,context.getRoot()));//xixi3/* * 过滤器取得集合中最后一个元素 * 表达式: * collection.{$ expression} */System.out.println(Ognl.getValue("#list.{$ #this}[0].name", context,context.getRoot()));//haha333/* * 投影 * 表达式: * collection.{expression} * 返回集合,返回集合长度和原来集合的长度相等 * 返回的集合中的对象是原来对象的子集 * * 过滤与投影的区别: * 类比于数据库中的表,过滤是取行,而投影是取列的操作 */System.out.println(Ognl.getValue("#list.{name}", context,context.getValues()));//[hehe, xixi3, haha333]System.out.println(Ognl.getValue("#list.{#this.name.length()>4?'Hello world':#this.name}", context,context.getRoot()));//[hehe, Hello world, Hello world]}}
在Struts2中,根对象就是ValueStack(一个堆栈),在Struts2的任何流程中,ValueStack中的最顶层对象一定是Action对象。
以下几个对象,叫做“命名对象” ,不在ValueStack中:
类名访问方式parameters(客户端传向服务器端的参数)#parameters.uernmerequest#request.usernameapplication
#application.username
访问 静态方法或静态成员变量的改进@vs@method(其中vs表示ValueStack)
- OGNL学习(一)Ognl和OgnlContext
- OGNL框架学习(一)
- ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z
- ognl.SimpleNode.isSequence(Lognl/OgnlContext;)Z
- struts2中OGNL和 ValueStack(一)
- struts2中OGNL和 ValueStack(一)
- struts2中OGNL和 ValueStack(一)
- SSH框架之Struts的Ognl表达式语言(1)、OgnlContext对象
- Ognl学习
- OGNL学习
- ognl
- ognl
- OGNL
- OGNL
- OGNL
- OGNL
- OGNL
- ognl
- PHP如何实现给定日期的若干天以后的日期
- python 学习笔记
- Android源码编译make的错误处理
- HDU2844 Coins
- Jquery中使用setInterval和setTimeout
- OGNL学习(一)Ognl和OgnlContext
- PHP缓存之redis中文文档(收集整理)
- rails+mysql环境
- 怎样编写出优雅代码
- 自己用
- JAVA RandomAccessFile 类
- 杭电ACM 2036 改革春风吹满地
- Archie osgEarth Step By Step②Earth File分析
- SAP HANA HDB 命令