如何OGNL理解

一文全解:OGNL表达式以及Mybatis中的OGNL表达式 OGNL(Object-Graph Navigation Language)是一种用于在Java中访问和操作对象图的表达式语言。它提供了一种简洁、灵活的方式来遍历和操作复杂的对象结构,而无需编写大量的代码。OGNL表达式可以用于各种场景,如Web应用、批处理任务、测试等。OGNL表达式是一种强大的工具,尤其在Mybatis中能够极大地简化动态SQL的编写。它的简洁语法和强大功能,使得开发者能够高效地处理复杂的对象操作。然而,在使用OGNL表达式时,也要注意性能和安全性的问题,合理使用表达式,避免潜在的风险。 阅读详情

OGNL全名Object Graph Navigation Language,可认为是更完美EL表达式。

 

它可以真正意义上代替个传统jsp服务器脚本(<%%>)。本文不阐述OGNL的优势,志在为帮助大家理解并学习OGNL。

 

以下是struts2中的OGNL。

OGNL的表达式的资料确实不少,但几乎都是同一个版本,并且笔者真的有怀疑此版本的作者在一些关键问题上要么就是自己也没弄清楚,要么就是表达有问题,总之很容易就把简单的东西放到云里雾里。

 

下面让我来给大家理理思路。

 

1. OGNL有什么内容。

      OGNL的核心结构是OGNL Context,而struts2中的OGNL Context就是ActionContext.参见ActionContext类

而ActionContext包含ValueStack和非ValueStack两部分。非ValueStack部分与传统EL中的4个范围的parameter/attribute的数据,是我们耳熟能详的;而ValueSatck部分则是Action中的属性成员,也就是页面form中的控件数据,众所周知Struts2取消了Struts1中的ActionMap而直接写在Action类上。

 

2. 我们先要明白OGNL能实现到什么程度的功能。

      第一,OGNL是JSP脚本的替代品,又是EL,那么它一定是运行在服务器之上的。

      第二,OGNL可以page,request,session,application的attribute,request的parameter范围的数据,与一般的EL一致

      第三,OGNL可以访问Struts2中Action的属性。非常实用的数据绑定效果。

      第四,OGNL可以创建对象,并且定制对象的数据。一般EL所没有的功能,弥补一大缺陷(在jstl范畴也可以创建对象)

3. OGNL的格式。

      Struts2的OGNL表达式主要涉及#%$三个特殊符号。这里我们需要强调的是实际上OGNL的范畴中只有#%两个特殊符号,而$并不属于OGNL。这是许多OGNL资料中造成误解的主要地方。下面笔者具体说明它们的用法。

 

在讲述其用法前我们需要先说明一个概念:

节点的顶部:OGNL是基于数据间的数量比的概念来扩展视图的。

在这里数量比是狭隘的数量比,它是一种单方向所看到的数量比,我们认为这样数量比关系只有1:1和1:n

当对象视图扩展到某个节点时,如果该节点是集合,而要访问的是集合中的元素,那么我们说这个元素不在该节点的顶部,当然如果访问的是集合本身而不涉及其元素,那么我们说它在顶部。简单的理解就是目标为元素类型的一定不在顶部,不是元素类型的在顶部。

  • #  是OGNL查找符,当目标对象顶部,可直接使用对象名,并且必须只写对象名,不可使用#,以作为区分。

struts2 OGNL的查找范围为OGNL context/ActionContext,其包含下面是顶节点:

名称

作用 例子
parameters包含当前HTTP请求参数的Map#parameters.id[0]作用相当于request.getParameter("id")
request包含当前HttpServletRequest的属性(attribute)的Map#request.userName相当于request.getAttribute("userName")
session包含当前HttpSession的属性(attribute)的Map#session.userName相当于session.getAttribute("userName")
application包含当前应用的ServletContext的属性(attribute)的Map#application.userName相当于application.getAttribute("userName")
attr用于按request > session > application顺序访问其属性(attribute)#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
(value Stack)Action类的属性

#login.name相当于对应的Action类的name属性访问,可省略#

如name但要求其actionName为login

 

其中parameters,request,session,application属于非ValueStack范畴。

parameters,request,session,application都是Map类型,这就是为什么使用他们时总要#,因为查找的目标是其Map的元素。当然使用parameters,request,session,application本身是不必给出#符号的。

 

ValueStack是Action中的属性,访问他们可以不用使用#,除非它们也是集合,而访问的是集合的元素。

 

另外以'?#'的格式可以指出筛选元素的条件,如books.{?#this.price<100}                //其中books是Action类的集合元素

 

格式#{数据1,数据2...}可以创建集合对象并引用其值

  • %   将字符串变量的值按照OGNL表达式解析。也就是说字符串中#将按照特殊字符处理,仅此作用。

以上是OGNL的内容,接下来我们说说$的用法。

需要注意的是OGNL目前只能运行在标签中取值处,笔者认为未来的OGNL一定可以脱离标签项EL表达式的写法那样,这已经是大势所趋了

 

$ {}实际上传统EL的写法,是告知服务器在后台运行.

OGNL需要联合<s:property/>等标签库使用就拥有了OGNL表达式的运行环境,但离开标签库表达式只是普通的字符串,所以${}目前尚未提供OGNL表达式的运行环境。

 

这里简单的介绍EL:

struts的EL与OGNL的概念上有重复,其操作符号为. 并且预设了page,request,sesion等AtrributeMap,parameterMap对象限定只能查询Map所包含的内容,仅提供pageContext对象可使用javaBean的getter;操作上不分层必须以预设对象开始

 

 

 

总结:OGNL实际上最终发挥作用的是#,而%按照字符串转换#(省略#是顶节点),${}是传统的EL表达式

Linux8.3上装Oracle 19c RAC,ssh互信总报INS-06006?别急着下补丁,试试这个临时替换scp的骚操作 本文针对在Linux 8.3上安装Oracle 19c RAC时遇到的SSH互信报错INS-06006问题,提供了一个无需官方补丁的临时解决方案。通过创建SCP包装脚本并添加-T参数,有效解决了OpenSSH 8.x版本与Oracle安装程序的兼容性问题,帮助用户顺利完成安装流程。 阅读详情

相关推荐

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

使用OGNL解析json格式字符串,直接取值json中某个字段的值,并对数据的类型进行转换

data.msg.name:测试。一、引入maven依赖。二、使用以下代码解析。

qq_41573661的博客 788

新装Win10/Win11后VMware虚拟机连不上网?手把手教你排查‘网络信息不可用’(从服务检查到网段配置)

本文详细介绍了在Windows 10/11系统上安装VMware Workstation后虚拟机无法联网的排查方法。从检查VMware NAT Service、DHCP Service等关键服务状态,到重置虚拟网络编辑器配置,再到内核设备驱动问题解决,手把手教你解决‘网络信息不可用’问题。特别针对VMCI驱动故障提供了实用解决方案,帮助用户快速恢复虚拟机网络连接。

weixin_28736335的博客 770

OGNL使用详解一:原理与常用语法方式

OGNL使用详解一:原理与常用语法方式          OGNL:Object-Graph Navigation Language,一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。       以上关于OGNL

我是Alvin家鸡鸭鱼的小米米 1520

告别调试烦恼:用Lattice Diamond手把手教你JTAG烧录FPGA(附SRAM/Flash模式详解)

本文详细介绍了使用Lattice Diamond软件进行JTAG烧录FPGA的全流程,包括SRAM临时调试和Flash固化的核心区别。从环境准备、硬件连接到文件准备、烧录模式选择,再到典型问题排查和高级技巧,手把手教你快速掌握FPGA烧录技术,提升开发效率。

weixin_42569329的博客 495

使用mne包来对脑电数据进行预处理(一)

MNE(MNE-Python)是一个用于处理脑电(EEG)、磁图(MEG)和其他神经科学数据的Python库。它提供了丰富的功能,包括数据加载、预处理、分析和可视化,旨在帮助研究人员和神经科学家更轻松地进行脑电数据的处理和分析。在本文中,我们使用mne来对不同的格式的脑电数据集进行数据读取。

m0_71596228的博客 4303

Ognl介绍

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

m0_53151031的博客 2249

初识数据结构之入门必懂——线性表(顺序表)

本文将介绍数据结构中的线性表与线性表中最简单的结构——顺序表

m0_64705485的博客 904

OGNL 理解

h1. 一个例子 请看下面的需求,假设有如下用户对象模型: Java代码 public   interface  User {       public  String getName();       public  Date getRegisterDate();       public  Customer getCu...

john521 150

快手极速版抓包实战:安卓/iOS双端获取client_salt全流程解析(避坑指南)

本文详细解析了在安卓和iOS平台上获取快手极速版关键参数`client_salt`的全流程,包括环境配置、抓包工具使用、参数识别与转换等实战技巧。特别针对双端差异和反抓包机制提供了避坑指南,帮助开发者高效安全地完成数据获取任务。

weixin_29021195的博客 714

iStoreOS等软路由插件卸载的残留?分享一款软路由高级卸载工具,自定义卸载,轻松解决卸载残留问题

iStoreOS用户看过来!👀 还在被插件包残留困扰吗?本文分享一款“高级卸载”的插件,助你深度清理iStoreOS系统,彻底解决软件卸载不净的痛点,告别频繁恢复出厂设置的烦恼!🚀

XiaoqiangClub的博客 1537

对struts2的OGNL的理解

OGNL:Object-Graph Navigation Language.对象图形化导航语言 OGNL是集成进struts2框架中比較强大的技术有助于传输数据和类型转换,OGNL由表达式语言和类型装换器组成。 表达式语言: 我们已经在jsp表单input名和jsp标签使用该语言了.他用来绑定java端的数据属性和基于字符串的 视图层表示.表达式语言甚至能够进行方法调用,目的就在于...

weixin_34129145的博客 78

ROS从入门到精通0-4:VSCode 搭建 ROS 工程环境

为了提高开发效率,可以先安装集成开发工具和使用方便的工具,本教程用VSCode搭建ROS工程环境

FRIGIDWINTER的博客 1万+

OGNL的理解

1. 什么是OGNL OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,是一个第三方开源项目。 OGNL本身是与Struts2没有任何关系的。但Struts框架使用了OGNL用于进行表达式的计算工作。Struts2通过使用OGNL简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等...

I_AM_good_boy的博客 1010

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Ognl的理解

OGNL   OGNL全称Object-Graph Navigation Language,是一种用于读取和设置java对象属性的描述语言。WebOGNL是一种构建以servlet为基础的组件化应用的web表现层框架,它的模板语言建立在OGNL表达式的基础上,具有别的web层框架不能匹敌的适应性。OGNL可以让我们用非常简单的表达式访问对象层,例如,当前环境的根对象为user1,则表达式per

Myself_jgl的专栏 830

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

理解Struts2中OGNL的使用

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

liaochangfa的专栏 764

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入理解Struts2的ognl标签

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。 此外,还得先需弄懂OGNL的一些知识:   1.OGNL表达式的计算是围绕OGNL上下文进行的。 OGNL上下文实际上就是一个Map对象,

一个执着的程序员 1484

简单理解OGNL、ActionContext、ValueStack

Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。 可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。 Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。 OGNL中重要的3个符号:#、%、$: 1.#符号 #符号的用途一般有三种。

老杨的专栏 1156

Ognl理解版

1、学习Ognl语法 学习OGNL语法 - 掘金

weixin_35821291的博客 73

java el ognl_EL与OGNL以及值栈的理解

这里先添加下在项目遇到的问题:这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到。困扰了许久:总结如下:(1)每个action对应相应页面的值栈中值的获取,在属于此action的页面上面如果采用OGNL或者EL表达式获取的值都是从此action中获取的。不要将action对应的页面搞乱了(2)关于EL表达式获取值栈中心的:map和对象栈stack中的值的获取方式:对于...

weixin_34108829的博客 150

struts2之ognl(偏理解方面)

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

men_ma的博客 297

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 or...

john521 129

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理解
下一篇: 如何选择集合
wankaiming
博客等级 码龄15年 49粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值