`

OGNL入门

阅读更多
package org.darkness.ognl.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;
import ognl.Ognl;

import org.darkness.oa.model.Person;
import org.darkness.oa.model.User;

public class OgnlTest extends TestCase {
	
	// ***************** root对象的概念 ******************* //
	public void testOgnl_01() throws Exception{
		User user = new User();
		user.setUsername("暗之幻影");
		
		//相当于调用user.getUsername()方法
		String value = (String)Ognl.getValue("username", user);
		System.out.println(value);
	}
	
	public void testOgnl_02() throws Exception{
		User user = new User();
		Person p = new Person();
		p.setName("暗之幻影");
		user.setPerson(p);
		
		//相当于调用user.getPerson().getName()方法
		String value = (String)Ognl.getValue("person.name", user);
		System.out.println(value);
	}
	
	public void testOgnl_03() throws Exception{
		User user = new User();
		Person p = new Person();
		p.setName("暗之幻影");
		user.setPerson(p);
		
		//可以使用#root来引用根对象,相当于调用user.getPerson().getName()方法
		String value = (String)Ognl.getValue("#root.person.name", user);
		System.out.println(value);
	}
	
	// *********************** context的概念 **********************//
	public void testOgnl_04() throws Exception{
		Person p1 = new Person();
		Person p2 = new Person();
		p1.setName("风");
		p2.setName("云");

		Map<String,Person> context = new HashMap<String,Person>();
		context.put("p1", p1);
		context.put("p2", p2);
		
		// 需要加上#才表示到context中取数据,否则表示从根目录下取值
		String value = (String)Ognl.getValue("#p1.name + ',' + #p2.name", context, new Object());
		System.out.println(value);
	}
	
	public void testOgnl_05() throws Exception{
		Person p1 = new Person();
		Person p2 = new Person();
		p1.setName("风");
		p2.setName("云");
		
		Map<String,Person> context = new HashMap<String,Person>();
		context.put("p1", p1);
		context.put("p2", p2);
		
		User root = new User();
		root.setUsername("雨");
		
		String value = (String)Ognl.getValue("#p1.name + ',' + #p2.name + ',' + username", context, root);
		System.out.println(value);
	}
	
	// ******************* OGNL赋值操作 ************************//
	public void testOgnl_06() throws Exception{
		User user = new User();
		
		//给root对象的属性赋值,相当于调用user.setUsername()
		Ognl.setValue("username", user, "暗之幻影");
		
		System.out.println(user.getUsername());
	}
	
	public void testOgnl_07() throws Exception{
		User user = new User();

		Map<String, User> context = new HashMap<String, User>();
		context.put("u", user);
		
		//给context中的对象属性赋值,相当于调用user.setUsername()
		Ognl.setValue("#u.username", context, new Object(), "暗之幻影");
		
		System.out.println(user.getUsername());
	}
	
	public void testOgnl_08() throws Exception{
		User user = new User();
		
		Map<String, User> context = new HashMap<String, User>();
		context.put("u", user);
		
		//给context中的对象属性赋值,相当于调用user.setUsername()
		//在表达式中使用=赋值操作符来赋值
		Ognl.getValue("#u.username = '暗之幻影'",context, new Object());
		
		System.out.println(user.getUsername());
	}
	
	public void testOgnl_09() throws Exception{
		User user = new User();
		Person p = new Person();
		
		Map<String,Object> context = new HashMap<String,Object>();
		context.put("u", user);
		context.put("p", p);
		
		//给context中的对象属性赋值,相当于调用user.setUsername()
		//在表达式中使用=赋值操作符来赋值
		Ognl.getValue("#u.username = '风',#p.name = '云'",context, new Object());
		
		System.out.println(user.getUsername()+","+p.getName());
	}
	
	//****************** 使用OGNL调用对象的方法 **********************//
	public void testOgnl_10() throws Exception{
		User user = new User();
		user.setUsername("暗之幻影");
		
		String value = (String)Ognl.getValue("getUsername()", user);
		System.out.println(value);
	}
	
	public void testOgnl_11() throws Exception{
		User user = new User();
		
		Ognl.getValue("setUsername('暗之幻影')", user);
		System.out.println(user.getUsername());
	}
	
	// ******************* OGNL调用类变量、静态方法 *************************//
	public void testOgnl_12() throws Exception{
		User user = new User();
		
		Ognl.getValue("setUsername('暗之幻影')", user);
		Ognl.getValue("@System@out.println(username)", user);
	}
	
	public void testOgnl_13() throws Exception{
		User user = new User();
		
		Ognl.getValue("setUsername('暗之幻影')", user);
		Ognl.getValue("@System@out.println(@org.darkness.struts2.test.Utils@toLowerCase(username))", user);
	}
	
	// ********************* OGNL中的this表达式 **********************//
	public void testOgnl_14() throws Exception{
		Object root = new Object();
		Map context = new HashMap();
		
		List values = new ArrayList();
		for(int i=0; i<11; i++){
			values.add(i);
		}
		context.put("values", values);
		
		Ognl.getValue("@System@out.println(#values.size.(#this > 10 ? \"大于10\" : '不大于10'))", context, root);
		
	}
	
	public void testOgnl_15() throws Exception{
		User user = new User();
		
		Ognl.getValue("setUsername('暗之幻影')", user);
		Ognl.getValue("@System@out.println(#this.username)", user);
	}
	
	public void testOgnl_16() throws Exception{
		User user = new User();
		
		Ognl.getValue("setUsername('暗之幻影')", user);
		Ognl.getValue("@System@out.println(username.(#this.toLowerCase()))", user);
	}
	
	// ******************* 如何把表达式的解释结果作为另外一个表达式,OGNL中括号的使用 **********************//
	public void testOgnl_17() throws Exception{
		Object root = new Object();
		Map context = new HashMap();
		User u = new User();
		u.setUsername("暗之幻影");
		context.put("u", u);
		context.put("fact", "username");
		
		/**
		 * 1、首先把#fact表达式进行解释,得到一个值:username
		 * 2、解释括号中的表达式#u,其结果是user对象
		 * 3、把括号中表达式的结果作为root对象,解释在第一步中得到的结果(即把第一步的结果看成另外一个表达式) 
		 */
		String value = (String)Ognl.getValue("#fact(#u)", context, root);
		System.out.println(value);
	}
	
	public void testOgnl_18() throws Exception{
		Person person = new Person();
		Map context = new HashMap();
		User u = new User();
		u.setUsername("暗之幻影");
		context.put("u", u);
		
		/**
		 * 相当于调用person这个根对象的fact方法,并把#u的解释结果作为参数传入此方法 
		 */
		String value = (String)Ognl.getValue("fact(#u)", context, person);
		System.out.println(value); //输出是 "暗之幻影,"
	}
	
	public void testOgnl_19() throws Exception{
		Person person = new Person();
		Map context = new HashMap();
		User u = new User();
		u.setUsername("暗之幻影");
		context.put("u", u);
		
		/**
		 * 1、先计算表达式fact,得到结果是:username
		 * 2、解释括号中的表达式#u,其结果是user对象
		 * 3、把括号中表达式的结果作为root对象,解释在第一步中得到的结果(即把第一步的结果看成另外一个表达式)
		 */
		String value = (String)Ognl.getValue("(fact)(#u)", context, person);
		System.out.println(value); //输出"暗之幻影"
	}
	
	// ********************* OGNL访问集合元素 **************************//
	public void testOgnl_20() throws Exception{
		Object root = new Object();
		Map context = new HashMap();
		
		//用OGNL创建List对象
		List listvalue = (List)Ognl.getValue("{123,'暗之幻影','风之水影'}", context, root);
		context.put("listvalue", listvalue);
		
		//用OGNL创建数组
		int[] intarray= (int[])Ognl.getValue("new int[]{23,45,67}", context, root);
		context.put("intarray", intarray);
		
		//用OGNL创建Map对象
		Map mapvalue = (Map)Ognl.getValue("#{'listvalue':#listvalue,'intarray':#intarray}", context, root);
		context.put("mapvalue", mapvalue);
		
		Ognl.getValue("@System@out.println(#listvalue[0])", context, root);
		Ognl.getValue("@System@out.println(#intarray[1])", context, root);
		Ognl.getValue("@System@out.println(#mapvalue['intarray'][2])", context, root);
		Ognl.getValue("@System@out.println(#mapvalue.intarray[0])", context, root);
	}
}

分享到:
评论
2 楼 cl1154781231 2011-01-14  
不错!很好!
1 楼 thebye85 2010-05-14  
 

相关推荐

    GB∕T 35294-2017 信息技术 科学数据引用.pdf

    GB∕T 35294-2017 信息技术 科学数据引用.pdf

    node-v7.1.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.8.0-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    GA 214.12-2004 常住人口管理信息规范 第12部:宗教信仰.pdf

    GA 214.12-2004 常住人口管理信息规范 第12部:宗教信仰.pdf

    高分项目 基于STM32单片机的交通灯控制程序源代码+项目资料齐全+教程文档.zip

    【资源概览】 高分项目 基于STM32单片机的交通灯控制程序源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的交通灯控制程序源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的交通灯控制程序源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    node-v5.5.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    【AOMDV仿真】基于matlab自组织按需多路径距离矢量(AOMDV)【含Matlab源码 4458期】.mp4

    Matlab研究室上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    电信2102班-邓佳龙210802059.zip

    电信2102班-邓佳龙210802059.zip

    基于python U2Net 深度学习的证件照生成.zip

    基于python U2Net 深度学习的证件照生成.zip

    visio下载安装的概要介绍与分析

    关于Visio下载与安装的资源描述如下: Visio是一款由微软公司开发的流程图软件,旨在帮助用户轻松创建、编辑和共享各种流程图,如组织结构图、流程图、地图、网络图和平面图等。以下是关于Visio下载与安装的资源描述。 首先,用户需要访问微软官方网站或其他可信的软件下载平台,找到Visio的下载链接。在下载前,用户应确认自己的操作系统版本与Visio的版本兼容。 下载完成后,用户需要解压下载的软件安装包。解压后,用户将看到一个包含Visio安装程序的文件夹。此时,用户应右击安装程序(通常是名为“setup”的可执行文件),选择“以管理员身份运行”来启动安装过程。 在安装过程中,用户需要接受软件许可协议,并选择安装选项。Visio提供了多种安装选项,用户可以根据自己的需求选择完全安装、自定义安装或仅安装某些组件。同时,用户还可以设置软件的安装路径。 安装完成后,用户可以在桌面左下角的开始菜单栏中找到Visio的快捷方式。点击快捷方式即可启动Visio软件。在软件界面中,用户可以创建新的流程图,也可以打开已存在的流程图进行编辑和共享。 总之,Visio是一款功能强大的流程图软件

    通过python编写sftp上传和下载

    #!/usr/bin/python # -*- coding:utf-8 -*- #参考:https://blog.csdn.net/qq_43057091/article/details/82179301 import os,sys import paramiko #创建transport对象 t = paramiko.Transport(('192.168.56.102',22)) #连接服务器 #创建sftp对象 #将temp.txt上传到服务器/home/redhat/Documents目录 # 将sftp.txt下载到本机桌面

    python实现基于SDN架构的网络流量监控和控制源码.zip

    python实现基于SDN架构的网络流量监控和控制源码.zip,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 python实现基于SDN架构的网络流量监控和控制源码.zip,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 python实现基于SDN架构的网络流量监控和控制源码.zip,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 python实现基于SDN架构的网络流量监控和控制源码.zip,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 python实现基于SDN架构的网络流量监控和控制源码.zip,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学

    node-v7.7.1-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    HTML+CSS+JS精品网页模板H90.rar

    HTML+CSS+JS精品网页模板,设置导航条、轮翻效果,鼠标滑动效果,自动弹窗,点击事件、链接等功能;适用于大学生期末大作业或公司网页的设计制作。响应式网页,可以根据不同的设备屏幕大小自动调整页面布局; 支持如Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件进行编辑修改; 支持包括IE、Firefox、Chrome、Safari主流浏览器浏览; 下载文件解压缩,用Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件打开,只需更改源代码中的文字和图片可直接使用。图片的命名和格式需要与原图片的名字和格式一致,其他的无需更改。如碰到HTML5+CSS+JS等专业技术问题,以及需要对应行业的模板等相关源码、模板、资料、教程等,随时联系博主咨询。 网页设计和制作、大学生网页课程设计、期末大作业、毕业设计、网页模板,网页成品源代码等,5000+套Web案例源码,主题涵盖各行各业,关注作者联系获取更多源码; 更多优质网页博文、网页模板移步查阅我的CSDN主页:angella.blog.csdn.net。

    信息办公个人求职管理系统-jobgljsp.rar

    javaweb登录注册页面,[信息办公]个人求职管理系统,jsp开发源码。

    node-v7.7.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    susecap-demostore

    SUSE Store示例应用程序显示了SUSE云应用程序平台(SUSE CAP)的一些强大功能和简单使用

    node-v7.0.0-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    linux大纲资料.txt

    linux操作系统

    node-v6.11.0-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics