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);
 }
}

【Arthas】命令之ognl使用姿势 金三银四到了,送上一个小福利!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-EOawtU8q-1713522149003)][外链图片转存中…(img-mD1CvYLL-1713522149004)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 阅读详情

相关推荐

OGNL中文版详细文档

目录 1. 简介 2. 历史 3. 语法 4. 表达式 常数 属性引用 索引 数组(Array)与列表(List)的索引 JavaBean中的索引属性(Indexed Properties) OGNL特有的对象索引属性(Object Indexed Properties) 调用方法 变量引用 带括号的表达式 子表达式(Subexpressions)链 构造集合(Collection) 列表(Lists) 数组 映射表(Maps) 对集合的投影(Project) 在集合中查询 查找第一个匹配项 查找最后一个匹配项 调用构造方法 调用静态方法 读取静态域(Static Fields) 表达式计算 伪Lambda表达式 供集合使用的伪属性 与Java语言不同的操作符 赋值与取值 5. 对象到数据类型的强制转换 将对象解释为布尔值 将对象解释为数值 将对象解释为整数 将对象解释为集合 附录A. OGNL语言参考 操作符 表格一览 3.1. OGNL 表达式元素 4.1. 集合的特殊伪属性 A.1. OGNL 操作符

Java程序员从笨鸟到菜鸟之(四十九)细谈struts2(十一)OGNL表达式的基本语法和用法...

在上篇博客,我们一起看了《ognl概念和原理详解》,我们大约的知道了ognl的基本实现原理和一些基本概念,这节我们一起来学习一下OGNL表达式的基本语法和基本用法,首先我们一起来看一下OGNL中的#、%和$符号。 一.OGNL中的#、%和$符号 #、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里我们简单介绍它们的相应用途。 1.#符号的三种用...

long_yu2的专栏 295

从KVM虚拟化到Openstack云化架构综述

目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上...

liyunpeng229的博客 2051

Ognl 使用实例手册

上一篇博文介绍了ongl的基础语法,接下来进入实际的使用篇,我们将结合一些实际的case,来演示ognl究竟可以支撑到什么地步 在看本文之前,强烈建议先熟悉一下什么是ognl,以及其语法特点,减少阅读障碍,五分钟入门系列: 191129-Ognl 语法基础教程 I. 基本使用 1. 配置 我们选用的是java开发环境,使用maven来进行包管理,首先在pom文件中添加依赖 <!-- h...

小灰灰blog的专栏 1197

使用相对路径设置IAR的Additional include directories 以及 $PROJ_DIR$ 的用法

新建IAR工程时免不了要导入工程用到的头文件,那么导入头文时是用相对路径还是绝对路径呢?当然是相对路径了,因为绝对路径会有弊端,那就是,如果将来更换了工程放置的路径,那么这个相对路径就凉凉了,编译必然报错。所以最好还是用相对路径,那么相对路径怎么用呢? 请看以下 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 版权声明 本博文系广州欧科曼科技有限公司所有,转载请注明出处。 广州欧科曼科技有限公司致力于瑞萨MCU及周边相关产品开发设计。 ema

announced1的博客 5391

TEC控制器芯片 ADN8835 中文数据手册

ADN8835是一款高集成度的单芯片TEC控制器。它包括线性电压调节模块脉冲宽度调制(PWM) 电压调节模块和两个零漂移、轨到轨斩波放大器。线性控制器和PWM驱动器用于控制H桥配置中的内部功率MOSFET。通过测量热传感器反馈电压,并使用集成的运算放大器作为比例-积分-微分(PID)补偿器来调理信号,ADN8835通过TEC驱动电流,将连接至TEC模块的激光二极管或无源组件的温度稳定到编程的目标温度。

lu2289504634的博客 9532

OGNL入门

------------------siwuxie095 OGNL 入门 1、OGNL 支持对象方法调用,即 objName.methodName() 如:使用 OGNL 表达式 + Struts2 标签计算字符串长度 2、具体步骤 (1)...

weixin_30668887的博客 108

OGNL 入门教程

ognl是一种表达式语言,感觉跟velocity这些东西差不多 struts2是根据ognl做的,实现mvc   ognl需要两个包ognl包,还有xwork-core包,要不会保存,包什么没有javassit什么滴   下面给出几个ognl的入门小例子 来源 http://blog.youkuaiyun.com/mmm123lmj/article/details/4527898   p...

246

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

ThingsBoard集群部署之k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 1173

struts2-学习笔记(三)

Struts2学习笔记(三) 1.ognl概述: OGNL是ObjectGraphicNavigationLanguage(对象图导航语言)的缩写,它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。 OGNL相对其它表达式语言具有下面几大优势: 1、支持对象方法调用 如xxx.doSomeSpecial(); ...

weixin_30328063的博客 159

华为OD技术面八股文_C++_01

汇总华为OD技术面C++方向八股文真题,并提供详细解答。

qq_45776114的博客 1884

推荐Struts2资料

Struts2专栏: 一步一步跟我学Struts2专栏 摘: 《MVC with Webwork2 – Xwork 》—— potian著  《MVC with Webwork2 – Xwork _下载》这是一本专门讲解Xwork的电子书,作者是potian。关于potian不用费更多口舌去介绍了。这本书对于Xwork讲解之深入要远远超过Xwork自己的文档,特别是Xw...

无忌 128

深入浅出:使用Python爬取链家二手房数据

在数据驱动的时代,房地产数据作为社会经济的重要指标,一直是数据分析师、投资者和研究人员关注的焦点。链家作为国内领先的房产中介平台,其二手房数据具有较高的真实性和时效性。然而,官方API的访问限制和数据获取的门槛,让很多初学者望而却步。本文将带你从零开始,使用Python编写一个符合robots.txt规范的链家二手房爬虫,获取标题、户型、价格等信息。文章不仅会提供完整代码,还会深入讲解反爬策略、请求头伪装、数据解析、异常处理等实战技术。目录前言:为什么要写这篇博客?一、爬虫前的准备:法律与道德。

2201_76125261的博客 90

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Struts2_Day03

文章目录一、OGNL的概述1. 什么是OGNL2. OGNL的作用3. OGNL的要素4. OGNL的入门二、值栈的概述1. 什么是值栈2. 值栈的内部结构3. ActionContext和ValueStack的关系4. 获取值栈对象5. 操作值栈三、EL的特殊字符的使用1. #号的使用2. %号的使用3. $号的使用 一、OGNL的概述 1. 什么是OGNL 2. OGNL的作用 3. OGNL的要素 4. OGNL的入门 二、值栈的概述 1. 什么是值栈 2. 值栈的内部结构 3

巧克力布丁的博客 253

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Struts2入门第七讲——OGNL

OGNL的概述什么是OGNL据度娘所说: OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化功能。它使用相同的表达式去存取对象的属性。 OGNL的全称是对象图导航语言(Object-Graph Navigation Languag

李阿昀的博客 3337

Ognl使用总结

ognl表达式详细总结,价值千金

w727655308的博客 2167

arthas 使用ognl表达式理解【整理】

参考:【Arthas问题排查集】活用ognl表达式 · Issue #11 · alibaba/arthas · GitHub 欢迎大家多多体验牛逼的arthas 0. 背景 Arthas 3.0中使用ognl表达式替换了groovy来实现表达式的求值功能,解决了groovy潜在会出现内存泄露的问题。灵活运用ognl表达式,能够极大提升问题排查的效率。 ognl官方文档:OGNL - Apache Commons OGNL - Language Guide 1. demo https:/.

weixin_35821291的博客 7045

Ognl介绍

前言:上次与大家分享了SSH框架之Struts的知识,今天就接着之前的分享,今天要分享的知识是Ognl。 一、明确目标: 1、弄清楚之前遗留的问题(user中的uname属性有值,而Demo1Action中的uanme属性没有值?) 2、Struts的优先级 二、情景再现: 在之前的demo1action界面中加一个uname属性,并且生成get和set方法。在demo1中再写set方法传值的代码。 Demo1Action界面: Demo1界面...

m0_53151031的博客 2249

理解Struts2中OGNL的使用

关于Struts2标签中,OGNL的使用问题,最近抽空整理了理解和使用OGNL的要点,分享一下1、理解Struts2中的ValueStackValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础。OgnlValueStack类的主要属性关系图如下:          

liaochangfa的专栏 764

struts2之ognl(偏理解方面)

转载请标明出处:https://blog.youkuaiyun.com/men_ma/article/details/106847165. 本文出自 不怕报错 就怕不报错的小猿猿 的博客 struts2之ognl(偏理解方面)一级目录二级目录三级目录 一级目录 二级目录 三级目录 ...

men_ma的博客 297

ognl概念和原理详解

引言:众所周知,在mvc中,数据是在各个层次之间进行流转是一个不争的事实。而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的:   1. 数据在页面上是一个扁平的,不带数据类型的字符串,无论你的数据结构有多复杂,数据类型有多丰富,到了展示的时候,全都一视同仁的成为字符串在页面上展现出来。   2. 数据在Java世界中可以表现为丰富的数据结构和数据类型,你可

黑马蓝梦的专栏 8229

OGNL的基本语法与用法

OGNL表达式的基本语法和基本用法 一.OGNL中的#、%和$符号 #、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里我们简单介绍它们的相应用途。 1.#符号的三种用法 1)访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext...

Tianyi_0801i的博客 8615
上一篇: struts2 工作原理图
下一篇: OGNL
john521
博客等级 码龄20年 17粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值