OGNL 教程
OGNL(取值、赋值、调用普通方法、静态方法、创建对象)

OGNL(取值、赋值、调⽤普通⽅法、静态⽅法、创建对象)1、OGNL表达式(1)概念OGNL:对象导航图语⾔(Object Graph Navigation Language),是⼀种表达式语⾔,功能⽐EL表达式更为强⼤,它是集成在Struts中的。
在创建Struts项⽬的时候已经将OGNL有关的包导⼊了,所以,这⾥不需要重复导包。
(2)OGNLContext对象:EL表达式从是⼀个内置对象中取值,⽽OGNL表达式只从OGNLContext对象中取值,该对象可以分为两部分,其中root部分可以存放任何对象,Context部分只能存放键值对。
2、OGNL初始化和取值public class OgnlTest {public void test() throws OgnlException {User rootuser=new User("zhai","123",12);//root部分Map<String,User> context=new HashMap<String, User>();//context部分context.put("user1",new User("user1","111",12));context.put("user2",new User("user2","222",13));OgnlContext ognlContext=new OgnlContext();//创建OGNLContext对象ognlContext.setRoot(rootuser);ognlContext.setValues(context);//将root和context部分放⼊到OGNLContext内部String name= (String)Ognl.getValue("username",ognlContext,ognlContext.getRoot());//取值Integer age=(Integer)Ognl.getValue("userage",ognlContext,ognlContext.getRoot());String password=(String)Ognl.getValue("password",ognlContext,ognlContext.getRoot());System.out.println("⽤户名:"+name+",年龄"+age+",密码:"+password);String name1= (String)Ognl.getValue("#ername",ognlContext,ognlContext.getRoot());Integer age1=(Integer)Ognl.getValue("#erage",ognlContext,ognlContext.getRoot());System.out.println("⽤户名:"+name1+",年龄"+age1);}(1)在初始化部分,需要先对root和context分别做初始化操作,然后将root和context放⼊到OGNLContext对象内部,这样初始化⼯作就完成了。
arthas ognl 执行方法

arthas ognl 执行方法Arthas是一款开源的Java诊断工具,由阿里巴巴开发。
它可以帮助开发者快速定位Java应用程序的问题,并提供了强大的诊断和调试功能。
其中,OGNL执行方法是Arthas的一项重要功能,能够帮助开发者更快速地定位问题。
一、什么是OGNLOGNL是Object-Graph Navigation Language的缩写,即对象图导航语言。
它是一种基于Java语言的表达式语言,用于在Java 对象图中查询和操作对象。
OGNL提供了一种简洁、灵活的语法,可以方便地访问对象属性、调用对象方法、执行算术运算和逻辑运算等。
OGNL的语法类似于EL表达式,但它更加强大和灵活。
OGNL支持的操作符更加丰富,可以进行更复杂的运算。
同时,OGNL也支持调用静态方法、访问静态属性等操作,使得它更加适合在Java应用程序中使用。
二、Arthas的OGNL执行方法Arthas的OGNL执行方法是一种基于OGNL语法的命令,用于在Java应用程序中执行方法。
它可以帮助开发者在运行时动态地执行Java方法,以快速定位问题。
Arthas的OGNL执行方法支持的语法与OGNL基本一致,可以进行属性访问、方法调用、运算等操作。
Arthas的OGNL执行方法可以在命令行中直接输入,也可以在Arthas的web界面中使用。
在命令行中,可以使用ognl命令来执行OGNL表达式。
例如,我们可以使用以下命令来执行一个简单的OGNL表达式:```bash$ ognl -e '@ng.System@currentTimeMillis()'```这个表达式的含义是调用System类的currentTimeMillis方法,返回当前时间的毫秒数。
执行结果如下:```[INFO] [2022-02-01 17:54:49] [arthas-NettyClientCommandCenter-1] [System.out][ng.Object;@5f6c2c6b```可以看到,执行结果返回了一个Object数组,其中包含了调用方法的返回值。
第06讲 OGNL及其表达式

电子信息工程系
1)逗号“,”操作符 )逗号 操作符 作用: 作用:用于分隔两个以上独立的表达式,整个表达式的值是 最后一个子表达式的值 例如:name, # 例如 2)花括号{}操作符 )花括号 操作符 作用: 作用:用于创建列表,其中元素之间使用逗号分隔。 集合中 例如:判断一个对象是否存在List集合中 集合中? 例如:判断一个对象是否存在
作用: 作用: ActionContext是Action上下文,可以得到request, session ,application ValueStack是值栈 存放表单中的值 ,可以是一组值
9
Stack Context 栈上下文 也是用来存值的
电子信息工程系
2.优势 . 1)支持对象方法调用,如xxx.doSomeSpecial(); 2)支持类静态的方法调用和值访问 格式: 格式:@[类全名(包括包路径)]@[方法名 | 值名] 示例: 示例:@ng.String@format(‘foo %s’, ‘bar’) 或者 @tutorial.MyConstant@APP_NAME; 3)支持赋值操作和表达式串联 示例:price=100, discount=0.8, calculatePrice(),这个表达 示例 式会返回80;
对于不同的环境/上下文,相同的表达式会有不同的结果!
5
电子信息工程系
4)OGNL表达式语言结构 ) 表达式语言结构 Struts 2中的OGNL Context实现者为ActionContext
ValueStack(值栈,它是根对象) parameters OGNL Context request session application attr
4
电子信息工程系
OGNL教程

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
它使用相同的表达式去存取对象的属性。
OGNL特性:1,一个OGNL 表达式的基本组成是:navigation chain。
组成如下:Properity nameMethod callsArray Indices如:name.toCharArray()[0].numericValue.toString()name.toCharArray()转化为数组;numericValue相当于Character类的getNumericValue()方法:static int getNumericValue(char ch);2,简化JavaBeans的get/set机制如:public Object getAttribute(String name)public void setAttribute(String name, Object value)简化为:session.attribute[“foo”]3,OGNL有一个简化变量机制(在变量前加符号#),所有OGNL变量在整个表达式里是全局的。
如:#var#var = 99listeners.size().( #this > 100 ? 2 * #this : 20 + #this ) 调用listeners的size()并与100比较。
4,chain subexpressions如:headline.parent.(ensureLoaded(), name)headline.parent<-root objectensureLoaded()被root object调用,然后set/get name property。
OGNL语言指南

第1章、简介
OGNL 表示 Object Graph Navigation Language,对象图形导航语言。它是一种对 Java 对象的 getter 和 setter 属性的表示和绑定语言。通常,相同的表达式被用来获取和设置属性的值。
我们把 OGNL 当成一个单词来发音,有点像“orthogonal”(垂直的)这个词 drunken pronunciation 的最后一个音节的发音。
l public PropertyType getPropertyName(int index) l public void setPropertyName(int index, PropertyType value)
OGNL 可以对其翻译并且通过下标标记对其提供无缝访问。例如下面: someProperty[2]
则是调用一个参数的方法。 变量引用
OGNL 变量模式比较简单,它允许你存储中间结果,然后回头再用,或者仅仅是命名用使得 表达式变得简单易懂。所有 OGNL 的变量对整个表达式来说都是全局的。可以通过一个井 号加上变量名来引用: #var
OGNL 也在变量所处表达式求值过程中的每个点存储当前对象,使其能够像其他对象一样被 引用。例如,下面的表达式对听众的数量进行运算,如果大于 100 则返回双倍,否则加 20 处理: listeners.size().(#this > 100? 2*#this : 20+#this)
OGNL 表达式对这些属性 set 和 get 都可以做: session.attribute["foo"]
调用方法 OGNL 的方法调用与 Java 有所不同,因为 OGNL 是解释型的,必须在运行时选择正确的方 法,而没有任何来自参数的额外的类型信息。OGNL 总是选择能够匹配传递过来参数类型的
第5章 OGNL表达式和值栈 教学PPT

ValueStack valueStack = (ValueStack)ServletActionContext.getRequest() .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); 该常量的值是 “struts.valueStack”
案例代码
接下来,通过一个案例来演示Root对象,如文件5-1~5-4所示。
✎
3
5.1 OGNL表达式
Context 对象对象 Context 表达式
实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对
Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境( Context)。上下文环境规定了OGNL的操作“在哪里进行”。上下文环境 Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用 “#”号加上对象名称,即“#对象名称”的形式。
✎
5.2 值栈
案例代码
举个例子
For example
接下来,通过运行项目来查看 ValueStack中的信息,如文件5-10所示。
✎
5.2 值栈
值栈在开发中的应用
其实Strus2引入值栈最主要的目的,就是在页面与Action之间进行数
据交换。采用以下两种方式交换数据时,Struts2会将对象自动存储到 ValueStack中:
✎
2
5.1 OGNL表达式
Root 对象 表达式
OGNL的getValue()方法中的第二个参数就是Root对象,Root对象可以理解
为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“对谁操 作”。OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过 OGNL可以访问与这个对象关联的其它对象。
ognl 三目表达式判断字符串参数拼接

ognl 三目表达式判断字符串参数拼接1.引言1.1 概述在本文中,将会介绍OGNL(Object-Graph Navigation Language)以及如何利用三目表达式来判断字符串参数拼接的方法。
OGNL是一种强大的表达式语言,可以用于访问和操作对象的属性、方法和索引,是很多Java框架(如Struts2、JSP等)中常用的表达式语言之一。
三目表达式是一种简洁的条件表达式,由三个部分组成:条件部分、真值部分和假值部分。
根据条件的真假情况,表达式可以返回真值部分或假值部分的值。
在本文中,我们将会利用三目表达式来判断字符串参数的情况,并实现相应的拼接方法。
本文的目的是为读者提供一个深入理解OGNL和三目表达式的文章,帮助读者在实际项目中更好地应用这两种技术。
在接下来的章节中,我们将首先介绍OGNL的基本概念和用法,然后深入探讨三目表达式的工作原理和常见用法。
最后,我们将给出一些例子,帮助读者更好地理解和运用OGNL和三目表达式。
在这篇文章中,我们将从基础知识开始,逐步向高级内容过渡。
无论您是初学者还是有一定经验的开发者,本文都会为您提供有价值的信息和实用的技巧。
希望读者通过本文的阅读,能够更加了解OGNL和三目表达式,并能够在实际项目中灵活运用这些技术。
接下来,我们将进入正文部分,首先介绍OGNL的简介和基本概念。
让我们一起开始这段令人兴奋的学习之旅吧!1.2 文章结构该篇文章主要围绕OGNL 和三目表达式展开讨论,并介绍了如何使用这两者来判断字符串参数拼接的方法。
文章结构如下所示:第一部分为引言,主要包括概述、文章结构和目的。
1.1 概述:介绍文章的主题和背景,提出需要解决的问题。
1.2 文章结构:本部分,即本文所在的部分,将详细介绍文章的结构和内容布局。
1.3 目的:阐明文章的目标和意义,以及解决问题的重要性。
第二部分为正文,主要分为三个小节,分别是OGNL 简介、三目表达式概述和字符串参数拼接方法。
第04章 OGNL表达式的使用

Inspur Education第四章OGNL表达式的使用©2012 Inspur Group知识点回顾u了解Struts2标签库的组成u掌握表单标签的使用u了解非表单标签的使用本章内容u了解什么是OGNL;u了解为什么使用OGNL;u了解struts2增强OGNL的原理。
u掌握OGNL的语法规则;u掌握struts2对OGNL表达式的使用OGNL简介u Struts2的一个关键特性就是它可以对Action携带的数据进行读写访问,例如在前面我们在表单中使用ername指定数据传递给Action的user对象的username属性,在<s:property>元素中使用ername来获取用户的名字,这是通过表达式语言(Expression Language,EL)来实现的,这种表达式语言就是OGNL。
u OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。
为什么要使用OGNLu视图层的表达式语言通常是用来简化数据的访问操作,取代Java脚本代码,提供更清晰的视图层实现。
例如,在JSP页面中使用JSP2.0内置的表达式语言获取user对象的username属性,可以简写为${ername},如果换作Java脚本代码,则需要写为:<%@ page language="java"import="java.util.*,er"pageEncoding="gbk"%><%User user = (User)request.getAttribute("user");String username = user.getUsername();out.print(username);%>为什么要使用OGNL哪一种方法更为简捷,相信大家已经一目了然了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用表达式语言的一个目的就是避免在JSP页面中出现过多的<%%>的语句,使页面与后台代码分离。
表达式语言主要有以下几大好处:1.避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;2.支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;3.简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts 2中的表达式语言Struts 2支持以下几种表达式语言:1.OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;2.JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;3.Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;4.Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:1.支持对象方法调用,如xxx.doSomeSpecial();2.支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@ng.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;3.支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;4.访问OGNL上下文(OGNL context)和ActionContext;5.操作集合对象。
OGNL的用法OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等。
大家经常遇到的问题是#、%和$这三个符号的使用。
下面我想通过例子讲述这个问题:首先新建名为Struts2_OGNL的Web工程,配置开发环境。
之前很多朋友在使用Struts 2的过程中都遇到乱码问题。
当然乱码问题由来已久,而且涉及多方面的知识,所以并非三言两语可以说明白,而且互联网上也已经有很多这方便的文章,大家可以Google一下。
不过,如果你在开发的过程,多注意一下,避免乱码问题也不难。
乱码多数是由于编码与解码所使用的方式不同造成的,所以我建议大家将编码方式都设为“utf-8”,如<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>。
另外,在配置web.xml时使用ActionContextCleanUp过滤器(Filter),如下面代码所示:<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_9" version="2.4"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Struts 2 OGNL</display-name> <filter> <filter-name>struts-cleanup</filter-name><filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class></filter> <filter-mapping><filter-name>struts-cleanup</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list></web-app>“#”主要有三种用途:1.访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:名称 作用 例子parameters 包含当前HTTP请求参数Map #parameters.id[0]作用相当于request.getParameter("id")request 包含当前HttpServletRequest的属性(attribute)Map #erName相当于request.getAttribute("userName")session 包含当前HttpSession的属性(attribute)的Map #erName相当于session.getAttribute("userName")application 包含当前应用的ServletContext的属性(attribute)的Map #erName 相当于application.getAttribute("userName")attr 用于按request > session > application顺序访问其属性(attribute) #erName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止2.用于过滤和投影(projecting)集合,如books.{?#this.price<100};3.构造Map,如#{‘foo1′:’bar1′, ‘foo2′:’bar2′}。
下面让我们它们的具体写法,首先是Action类代码:package tutorial.action;import java.util.LinkedList;import java.util.List;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import tutorial.model.Book;import com.opensymphony.xwork2.ActionSupport;public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware {private static final long serialVersionUID = 1L;private HttpServletRequest request;private Map<String, String> session;private ServletContext application;private List<Book> books;public void setServletRequest(HttpServletRequest request) {this.request = request; }@SuppressWarnings("unchecked")public void setSession(Map session) {this.session = session; }public void setServletContext(ServletContext application) {this.application = application;}public List<Book> getBooks() {return books;}@Overridepublic String execute() {request.setAttribute("userName", "Max From request");session.put("userName", "Max From session");application.setAttribute("userName", "Max From application");books = new LinkedList<Book>();books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));books.add(new Book("978-020*******", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));return SUCCESS;}}以上代码分别在request、session和application的范围内添加“userName”属性,然后再在JSP页面使用OGNL将其取回。