Ognl的底层用法

今天学了下ognl的运用,在这里和大家分享一下。希望对大家有所帮助。

package com.hcj.test;

import java.util.ArrayList;
import java.util.List;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

public class Test {
	public static void main(String[] args) throws OgnlException {
		Person p = new Person();
		p.setName("张三");

		Cat cat = new Cat();
		cat.setName("花猫");

		//创建ognl上下文
		OgnlContext ognlContext = new OgnlContext();
		ognlContext.put("person", p);
		ognlContext.put("cat", cat);
		//设置person根对象
		ognlContext.setRoot(p);
		//获取根对象
		Object root = ognlContext.getRoot();

		//获取根对象的属性
		Object obj1 = Ognl.parseExpression("name");
		System.out.println(obj1);
		Object value1 = Ognl.getValue(obj1, ognlContext, root);
		System.out.println(value1);
		System.out.println("==========");

		//访问非根对象的属性
		Object obj2 = Ognl.parseExpression("#cat.name");
		System.out.println(obj2);
		Object value2 = Ognl.getValue(obj2, ognlContext, root);
		System.out.println(value2);
		System.out.println("==========");

		//访问类的静态方法
		Object obj3 = Ognl.parseExpression("@[email protected]");
		System.out.println(obj3);
		Object value3 = Ognl.getValue(obj3, ognlContext, root);
		System.out.println(value3);
		System.out.println("======");

		//访问math方法
		Object obj4 = Ognl.parseExpression("@@max(1,3)");
		System.out.println(obj4);
		Object value4 = Ognl.getValue(obj4, ognlContext, root);
		System.out.println(value4);
		System.out.println("======");

		//创建对象
		Object obj5 = Ognl.parseExpression("new com.hcj.test.Cat()");
		System.out.println(obj5);
		Object value5 = Ognl.getValue(obj5, ognlContext, root);
		System.out.println(value5);
		System.out.println("======");

		//创建list对象
		Object obj6 = Ognl.parseExpression("{'a','b','c'}");
		System.out.println(obj6);
		Object value6 = Ognl.getValue(obj6, ognlContext, root);
		System.out.println(value6);
		System.out.println("======");

		//访问list对象属性
		Object obj7 = Ognl.parseExpression("{'a','b','c'}[1]");
		System.out.println(obj7);
		Object value7 = Ognl.getValue(obj7, ognlContext, root);
		System.out.println(value7);
		System.out.println("======");

		//创建map对象
		Object obj8 = Ognl.parseExpression("#{'1':'aa', '2':'bb', '3':'cc'}");
		System.out.println(obj8);
		Object value8 = Ognl.getValue(obj8, ognlContext, root);
		System.out.println(value8);
		System.out.println("======");

		//访问map对象属性
		Object obj9 = Ognl.parseExpression("#{'1':'aa', '2':'bb', '3':'cc'}['3']");
		System.out.println(obj9);
		Object value9 = Ognl.getValue(obj9, ognlContext, root);
		System.out.println(value9);
		System.out.println("======");

		//选择,格式: collection.{? expression}
		List<Person> persons = new ArrayList<Person>();
		Person p1 = new Person();
		p1.setName("zz12345");
		Person p2 = new Person();
		p2.setName("aa121312");
		Person p3 = new Person();
		p3.setName("bb");

		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
		//将persons放入ognl上下文中
		ognlContext.put("persons", persons);

		Object obj10 = Ognl.parseExpression("#persons.{? #this.name.length() > 2}");
		System.out.println(obj10);
		Object value10 = Ognl.getValue(obj10, ognlContext, root);
		System.out.println(value10);
		System.out.println("======");

		//投影,格式: collection.{? expression}
		Object obj11 = Ognl.parseExpression("#persons.{#this.name}");
		System.out.println(obj11);
		Object value11 = Ognl.getValue(obj11, ognlContext, root);
		System.out.println(value11);
		System.out.println("======");

	}
}

输出结果:

name
张三
==========
#cat.name
花猫
==========
@[email protected]
3.141592653589793
======
@[email protected](1, 3)
3
======
new com.hcj.test.Cat()
[email protected]
======
{ 'a', 'b', 'c' }
[a, b, c]
======
{ 'a', 'b', 'c' }[1]
b
======
#{ '1' : "aa", '2' : "bb", '3' : "cc" }
{1=aa, 2=bb, 3=cc}
======
#{ '1' : "aa", '2' : "bb", '3' : "cc" }['3']
cc
======
#persons.{? (#this.name.length() > 2) }
[[email protected], [email protected]]
======
#persons.{ #this.name }
[zz12345, aa121312, bb]
======
时间: 2024-10-09 01:33:54

Ognl的底层用法的相关文章

Struts2中OGNL表达式的用法

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,能通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能. 一.为什么要使用OGNL 视图层的表达式语言通常是用来简化数据的访问操作,取代Java脚本代码,提供更清晰的视图层实现.比如,要获取user对象的age属性,利用OGNL表达式可以写成: <s:property value="user.age&

Struts2入门---常用的OGNL标签的用法

<%@page import="com.struts.valueStack.PersonComparator"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@page import="com.struts.valueStack.Person"%> <%@ page

与MVC框架解耦的OGNL:前世今生及其基本用法

摘要: 虽然我们一般都是通过学习MVC框架而结缘OGNL,但它并没有与MVC框架紧紧耦合在一起,而是一个以独立的库文件出现的一种功能强大的表达式语言,也是字符串与Java对象之间沟通的桥梁.特别地,正因为它的独立性,使得我们可以十分方便地利用它构建我们自己的框架.在充分理解和掌握 OGNL 三要素 后,我们就可以通过简单一致的语法去存取Java对象树中的任意属性.调用Java对象树的方法并自动实现必要的类型转化.本文首先概述了Ognl的前世今生,并结合具体实例和源码阐述了OGNL的实质和OGNL

数据:OGNL表达式是

核心:后台将数据放入OGNL,前台通过OGNL取数据 ActionContext.getContext().getValueStack().push(fu);     ActionContext.getContext().getValueStack().set("key","value"); ServletContext就是application 获取值: saleName = request.getParameter("saleName");

(转) STRUTS2中的OGNL

OGNL表达式是(Object-Graph Navigation Language)是对象图形化导航语言.OGNL是一个开源的项目,struts2中默认使用OGNL表达式语言来显示数据.与serlvet中的el表达式的作用是一样的.OGNL表达式有下面以下特点: 支持对象方法调用,例如:objName.methodName(); 支持类静态的方法调用和值访问,表达式的格式为 @[类全名(包括包路经)] @[方法名 |  值名] 例如: @[email protected]('foo%s','ba

深入分析JavaWeb 48 -- Struts2中OGNL表达式与ValueStack

一.OGNL表达式 1.OGNL表达式介绍 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语言. OGNL相对其它表达式语言具有下面几大优势: 1.支持对象方法调用,如xxx.doSomeSpecial(): 2.支持类静态的方法调用和值访问,表达式的格式: @[类全名(包括包路径)]@[方法名 | 值名],例如:@[email protected]('foo %s', '

Struts2 (三) — OGNL与值栈

一.OGNL表达式 1.概述 1.1什么是OGNL ? OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. ? Eg: hibernate 查询方式 : 对象导航查询. ? 其实就是查询出来了一个对象之后,通过对象里面的getXXX() 来获取关联的对象. ? 它是一个开源项目,并不是struts发明

关于Struts2的碎碎念

一:安全,还是安全 我入行比较晚,那会Spring MVC什么的都很流行了,一直觉得struts2作为一个Web MVC框架实在太笨重了点.所以虽然之前一直在用,但是其实没有真正研究过. 今天公司又遇到一个比较严重的struts的安全问题,最后检查了很久,换最新版也无效.但是因为公司一直在用strtus2,作为一个爱着自己工作的人(逃),还是决定大致了解一下struts2的源码了. 直接读代码难免一头雾水,这里推荐一本书<Struts2技术内幕>,有书上的理论作指导就容易得多.这本书讲的挺详细

Struts2框架学习(三) 数据处理

Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技