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哪一种方法更为简捷,相信大家已经一目了然了。
OGNL表达式语言详解--OGNL学习(1)
OGNL表达式语⾔详解--OGNL学习(1)众所周知,OGNL充斥在Struts2前后台数据传递与存储的⽅⽅⾯⾯,给Struts2中数据的处理带来了极⼤的⽅便,所以,本次打算以两篇博客来介绍OGNL,第⼀篇就是脱离MVC框架,单纯介绍OGNL的⼀般⽤法和语法,在第⼆篇博客⾥⾯,介绍OGNL的实际应⽤,本篇是第⼀篇,以介绍OGNL的语法和⼀般⽤法为主;OGNL(Object- Graph Navigation Language的简称),对象图导航语⾔,它是⼀门表达式语⾔,除了⽤来设置和获取Java对象的属性之外,另外提供诸如集合的投影和过滤以及 la 接下来给⼤家展⽰两个JavaBean类,整个OGNL的介绍,将围绕着这两个类展开package com.ognl.domain;import java.util.HashSet;import java.util.Set;public class SlDept implements java.io.Serializable {private static final long serialVersionUID = 3537237434024057830L;private String name;private Set<SlEmployee> slEmployees = new HashSet<SlEmployee>(0);public SlDept() {}public String getName() {return name;}public void setName(String name) { = name;}public Set<SlEmployee> getSlEmployees() {return slEmployees;}public void setSlEmployees(Set<SlEmployee> slEmployees) {this.slEmployees = slEmployees;}}package com.ognl.domain;public class SlEmployee implements java.io.Serializable {private static final long serialVersionUID = 4873217019660076767L;private SlDept slDept;private String name;public SlEmployee() {}public SlDept getSlDept() {return slDept;}public void setSlDept(SlDept slDept) {this.slDept = slDept;}public String getName() {return name;}public void setName(String name) { = name;}}下⾯编写⼀个类,代码如下:package com.ognl.test;import com.ognl.domain.SlDept;import com.ognl.domain.SlEmployee;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;public class OgnlTest {public static void main(String[] args) throws OgnlException {// 新建⼀个部门对象并设置部门名称SlDept dept = new SlDept();dept.setName("销售部");// 新建⼀个员⼯对象并设置员⼯姓名SlEmployee emp = new SlEmployee();emp.setName("张三");// 构建⼀个OgnlContext对象OgnlContext context = new OgnlContext();// 将上述部门和员⼯对象放⼊Ognl上下⽂环境中context.put("dept", dept);context.put("emp", emp);// 将员⼯设置为根对象context.setRoot(emp);// 构建Ognl表达式的树状表⽰,⽤来获取Object expression = Ognl.parseExpression("#");// 解析树状表达式,返回结果Object deptName = Ognl.getValue(expression, context, context.getRoot());System.out.println(deptName);}}最终输出结果为销售部,需要注意的是看到上述的"#"是不是特别眼熟,对在Struts2中特别常见,⽽且⼤家应该发现所谓的对象图导航语⾔指的就是通过 "放置到OgnlContext中的名字.属性名字" 的⽅式去获取对应对象的属性值;⾸先介绍⼀下Ognl中,常⽤到的两个类:ognl.Ognl类:这个类主要⽤来解析和解释执⾏Ognl表达式ognl.OgnlContext 类:这个类为Ognl表达式提供了⼀个执⾏环境,这个类实现了Map接⼝,所以允许通过put(key,obj)⽅法向OgnlContext环境中⽅式各种类型的对象,需要注意的是1、获取普通对象的属性值⽅式;⽐如上述例⼦当中,dept对象就是放置到OgnlContext中的普通对象,对于这种普通对象,只能通过“#”的⽅式去获取属性值,需要注意的是dept指的是放置到上下⽂中key 2、获取根对象的属性值的⽅式,有两种,第⼀种也是跟上述⽅式⼀样,不多做叙述Object expression = Ognl.parseExpression("#");第⼆种,直接写属性名称就可以,注意:这个时候就不要加“#”,如下expression = Ognl.parseExpression("name");原理是这样的,如果Ognl在解析表达式的时候发现表达式开头带有"#",会去普通对象中,去寻找,如果没有"#",则会默认去根对象中去寻找,由于根对象只有⼀个,所以只需要属性名字综合上述两种⽅式,通过⼀个直观的例⼦,理解⼀下:package com.ognl.test;import com.ognl.domain.SlDept;import com.ognl.domain.SlEmployee;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;public class OgnlTest {public static void main(String[] args) throws OgnlException {// 新建⼀个部门对象并设置部门名称SlDept dept = new SlDept();dept.setName("软件开发部");// 新建⼀个员⼯对象并设置员⼯姓名SlEmployee emp = new SlEmployee();emp.setName("李四");emp.setSlDept(dept);// 构建⼀个OgnlContext对象OgnlContext context = new OgnlContext();// 将上述部门和员⼯对象放⼊Ognl上下⽂环境中context.put("dept", dept);context.put("emp", emp);// 将员⼯设置为跟对象context.setRoot(emp);// 从普通对象中直接获取部门名称Object expression = Ognl.parseExpression("#");Object deptName = Ognl.getValue(expression, context, context.getRoot());System.out.println(deptName);System.out.println("-------------------------------------------");// 间接获取部门名称expression = Ognl.parseExpression("#");deptName = Ognl.getValue(expression, context, context.getRoot());System.out.println(deptName);System.out.println("-------------------------------------------");// 从根对象中直接获取部门名称expression = Ognl.parseExpression("");deptName = Ognl.getValue(expression, context, context.getRoot());System.out.println(deptName);}}通过例⼦可以发现,咱们主要⼯作就是⽤来学习如何让表达式合法,能够被正确解析且解释执⾏就可以了;下⾯,相信通过上⾯的例⼦,我们对Ognl表达式有了⼀个认识,下⾯开始学习如何在Ognl表达式⽤调⽤⽅法,⼤家都知道⽅法分为静态⽅法和⾮静态⽅法,好的,看例⼦:package com.ognl.test;import com.ognl.domain.SlDept;import com.ognl.domain.SlEmployee;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;public class OgnlTest2 {public static void main(String[] args) throws OgnlException {// 新建⼀个部门对象并设置部门名称SlDept dept = new SlDept();dept.setName("上海-软件技术⽀持部");// 新建⼀个员⼯对象并设置员⼯姓名SlEmployee emp = new SlEmployee();emp.setName("李⼩龙");emp.setSlDept(dept);emp.setAge("22");// 构建⼀个OgnlContext对象OgnlContext context = new OgnlContext();// 将上述部门和员⼯对象放⼊Ognl上下⽂环境中context.put("dept", dept);context.put("emp", emp);// 将员⼯设置为跟对象context.setRoot(emp);// 从根对象中直接获取部门名称长度,⾮静态⽅法Object expression = Ognl.parseExpression(".length()");Object length = Ognl.getValue(expression, context, context.getRoot());System.out.println(length);// 在Ognl表达式中使⽤静态⽅法expression = Ognl.parseExpression("@ng.Integer@valueOf(age)");length = Ognl.getValue(expression, context, context.getRoot());System.out.println(length);}}第三、接下来介绍,Ognl表达式中如何处理数组、集合和Map对象package com.ognl.test;import java.util.ArrayList;import java.util.List;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;public class OgnlTest3 {public static void main(String[] args) throws OgnlException {OgnlContext context = new OgnlContext();// 通过Ognl表达式构建⼀个LinkedList对象,这注意:⼀定是包名+类名的形式Object list = Ognl.parseExpression("new java.util.LinkedList()");Object obj = Ognl.getValue(list, context, context.getRoot());System.out.println(obj);System.out.println("----------------------------");// 在Ognl中提供了⼀种类似数组索引的⽅式访问集合指定位置的元素// 下述例⼦直接构建了⼀个包含aa, bb, cc, dd四个元素的集合,然后访问集合中的第三个元素Object object15 = Ognl.getValue("{'aa', 'bb', 'cc', 'dd'}[2]", context, context.getRoot());System.out.println(object15);System.out.println("----------------------------");// 处理数组类型String[] strs = new String[] { "aa", "bb", "cc" };context.put("strs", strs);System.out.println(Ognl.getValue("#strs[1]", context, context.getRoot()));System.out.println("----------------------------");// 处理集合类型List<String> words = new ArrayList<String>();words.add("hello");words.add("world");words.add("hello world");context.put("words", words);System.out.println(Ognl.getValue("#words[0]", context, context.getRoot()));System.out.println("----------------------------");// 处理Map类型,注意的是为了与集合区分开,在⼤括号前⾯加"#"System.out.println(Ognl.getValue("#{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4'}['key3']",context, context.getRoot()));}}第四、下⾯介绍Ognl中的过滤和投影两个概念,简单介绍下,⽆论过滤还是投影都是针对于数组、集合和Map⽽⾔的;过滤指的是将原集合中不符合条件的对象过滤掉,然后将满⾜条件的对象,构建⼀个新的集合对象返回,Ognl过滤表达式的写法是:collection.{?|^|$ expression};投影指的是将原集合中所有对象的某个属性抽取出来,单独构成⼀个新的集合对象返回,基础语法为:collection.{expression};⽰例代码如下:package com.ognl.domain;public class Student {private String name;private int age;private double height;public Student() {super();}public Student(String name, int age, double height) {super(); = name;this.age = age;this.height = height;}public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", height=" + height + "]";}}package com.ognl.test;import java.util.ArrayList;import java.util.Collections;import java.util.List;import com.ognl.domain.Student;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;public class OgnlTest4 {public static void main(String[] args) throws OgnlException {Student s1 = new Student("Tom", 22, 170.3);Student s2 = new Student("Jack", 21, 176.2);Student s3 = new Student("Tomas", 23, 180.1);Student s4 = new Student("Lucy", 20, 163.3);List<Student> stus = new ArrayList<Student>();Collections.addAll(stus, s1, s2, s3, s4);// 新建OgnlContext对象OgnlContext context = new OgnlContext();context.put("stus", stus);// 过滤(filtering),collection.{? expression}// 利⽤过滤获取⾝⾼在175以上的所有学⽣集合// 输出结果:[Student [name=Jack, age=21, height=176.2], Student [name=Tomas, age=23, height=180.1]]System.out.println(Ognl.getValue("#stus.{? #this.height > 175.0}", context, context.getRoot()));// 过滤(filtering),collection.{^ expression}// 利⽤过滤获取⾝⾼在175以上的所有学⽣集合中第⼀个元素// 输出结果:[Student [name=Jack, age=21, height=176.2]]System.out.println(Ognl.getValue("#stus.{^ #this.height > 175.0}", context, context.getRoot()));// 过滤(filtering),collection.{$ expression}// 利⽤过滤获取⾝⾼在175以上的所有学⽣集合的最后⼀个元素// 输出结果:[Student [name=Tomas, age=23, height=180.1]]System.out.println(Ognl.getValue("#stus.{$ #this.height > 175.0}", context, context.getRoot()));// 投影(projection), collection. {expression}// 获取集合中的所有学⽣的姓名// 输出结果:[Tom, Jack, Tomas, Lucy]System.out.println(Ognl.getValue("#stus.{name}", context, context.getRoot()));}}本篇博客从Ognl中对java对象属性值的访问,静态和⾮静态⽅法的调⽤,Ognl如何处理数组、集合和Map类型的数据以及集合的投影、过滤等⼏个⽅⾯介绍了⽇常⽤到的OGNL知识,这是基础,但却⼜是最关键的东西,牢记!转:。
OGNL表达式基本语法与用法详解
OGNL表达式基本语法与⽤法详解⼀.OGNL中的#、%和$符号#、%和$符号在OGNL表达式中经常出现,⽽这三种符号也是开发者不容易掌握和理解的部分。
在这⾥我们简单介绍它们的相应⽤途。
1.#符号的三种⽤法1)访问⾮根对象属性,例如⽰例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他⾮根对象时,需要加#前缀。
实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。
2)⽤于过滤和投影(projecting)集合,如⽰例中的persons.{?#this.age>20}。
3)⽤来构造Map,例如⽰例中的#{'foo1':'bar1', 'foo2':'bar2'}。
2.%符号%符号的⽤途是在标志的属性为字符串类型时,计算OGNL表达式的值。
如下⾯的代码所⽰:<h3>构造Map</h3><s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /><p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p><p>不使⽤%:<s:url value="#foobar['foo1']" /></p><p>使⽤%:<s:url value="%{#foobar['foo1']}" /></p>运⾏界⾯如下所⽰。
Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使⽤⽅法Ognl表达式基本原理和使⽤⽅法1.Ognl表达式语⾔1.1.概述OGNL表达式OGNL是Object Graphic Navigation Language(对象图导航语⾔)的缩写,他是⼀个开源项⽬。
Struts框架使⽤OGNL作为默认的表达式语⾔。
OGNL优势⽀持对象⽅法调⽤,如:×××.doSomeSpecial();⽀持类静态的⽅法调⽤和值访问,表达式的格式@[类全名(包括包路径)]@[⽅法名 | 值名],例如:@ng.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;⽀持赋值操作和表达式串联,如price=100, discount=0.8,calculatePrice(),这个表达式会返回80;访问OGNL上下⽂(OGNL context)和ActionContext;操作(创建)集合对象。
总结:OGNL 有⼀个上下⽂(Context)概念,说⽩了上下⽂就是⼀个MAP结构,它实现了java.utils.Map 的接⼝。
Struts框架默认就⽀持Ognl表达式语⾔。
(从struts项⽬必须引⼊ognl.jar包可以看出)Ognl表达式语⾔的作⽤:jsp页⾯取值⽤EL表达式语⾔,也⽤于页⾯取值,是jsp页⾯取值的标准(默认就可以使⽤)Ognl表达式语⾔,Struts标签默认⽀持的表达式语⾔,必须配置Struts标签⽤,不能离开Struts标签直接使⽤,就是说Ognl必须在Struts 中使⽤对⽐来看,EL使⽤范围更⼴,项⽬中不限制使⽤哪⼀种,哪⼀种熟悉就使⽤哪⼀种1.2.OgnlContext对象(了解)OgnlContext对象是ognl表达式语⾔的核⼼。
但是项⽬中不会要求写OgnlContext的代码,Ognl标签其实是调⽤了OgnlContext对象。
mybatis ognl 高级用法
MyBatis OGNL 高级用法1. 什么是 MyBatis OGNLMyBatis是一个开源的持久层框架,它可以将数据库操作和Java对象之间的映射进行简化。
OGNL(Object-Graph Navigation Language)是MyBatis中用于表达式求值的一种语言。
它可以在MyBatis的配置文件中使用,用于动态地生成SQL语句和进行数据处理。
2. OGNL 表达式基础OGNL表达式由一系列的属性、方法和操作符组成,用于对Java对象进行读取和操作。
下面是一些常用的OGNL表达式示例:2.1 访问对象属性使用点号(.)可以访问Java对象的属性。
例如,对于一个名为user的对象,可以使用来获取该对象的name属性的值。
2.2 调用对象方法使用小括号(())可以调用Java对象的方法。
例如,对于一个名为user的对象,可以使用user.getName()来调用该对象的getName方法。
2.3 数组访问使用方括号([])可以访问Java对象中的数组元素。
例如,对于一个名为numbers的整型数组,可以使用numbers[0]来获取数组中的第一个元素。
2.4 算术操作OGNL支持常见的算术操作,例如加法、减法、乘法和除法。
可以使用+、-、*和/来进行相应的操作。
2.5 逻辑操作OGNL支持逻辑操作,例如与(&&)、或(||)和非(!)。
可以使用这些操作符来对布尔值进行操作。
3. MyBatis 中的 OGNL 用法在MyBatis中,OGNL主要用于两个方面:动态SQL和结果映射。
3.1 动态SQLMyBatis的动态SQL功能允许根据不同的条件生成不同的SQL语句。
OGNL在动态SQL中发挥着重要的作用,可以使用OGNL表达式来判断条件和拼接SQL语句。
3.1.1 if 条件判断使用<if>标签可以在SQL语句中进行条件判断。
可以使用OGNL表达式来指定条件。
ognl java 例子
ognl java 例子OGNL是一个功能强大的Java表达式语言,可用于访问Java对象的属性、方法和操作符。
它的全称是Object-Graph Navigation Language,即对象图导航语言。
在Java应用程序中,OGNL常用于表达式求值、表单验证、模板引擎和Spring等框架中。
本文将介绍OGNL在Java中的具体应用示例,包括OGNL表达式的基本语法和相关概念、如何在Java中使用OGNL表达式进行属性读写、方法调用和集合访问等操作。
1. OGNL表达式基本语法OGNL表达式由许多不同的语法组成,包括:- 文字和数字:例如“Hello world”,123等。
- 属性路径:一个属性路径由一系列属性名组成,表示对象之间的关系。
例如“person.address.street”表示一个人的居住地址的街道名称。
- 索引器:允许按位置或键访问集合、数组或Map等对象。
例如“items[0]”表示返回一个集合中第一个元素。
- 操作符:比较运算符、算术运算符、逻辑运算符等。
2. 在Java中使用OGNL表达式2.1 获取属性值通过OGNL表达式可以获取对象的属性值,例如获取一个人对象的姓名:String expression = "";String name = (String) Ognl.getValue(expression, context, root);System.out.println("姓名:" + name);2.2 设置属性值通过OGNL表达式可以设置对象的属性值,例如设置一个人对象的年龄:String expression = "person.age";Ognl.setValue(expression, context, root, 28);System.out.println("年龄:" + person.getAge());2.3 调用方法通过OGNL表达式可以调用对象的方法,例如调用一个人对象的sayHello()方法:String expression = "person.sayHello()";String result = (String) Ognl.getValue(expression, context, root);System.out.println("结果:" + result);2.4 访问集合通过OGNL表达式可以访问集合对象中的元素,例如获取一个集合中的第一个元素:String expression = "items[0]";Object item = Ognl.getValue(expression, context, root); System.out.println("集合第一个元素:" + item);通过OGNL表达式可以访问Map对象中的键值对,例如获取一个Map中的value:String expression = "map.key1";Object value = Ognl.getValue(expression, context, root); System.out.println("Map value:" + value);3. 示例代码下面是一个使用OGNL表达式访问对象的示例代码:public class Person {private String name;private int age;private Address address;// 省略getter和setter方法public String sayHello() {return "Hello, my name is " + name;}}public class Address {private String street;private String city;// 省略getter和setter方法}public class Example {public static void main(String[] args) throws OgnlException {Person person = new Person();person.setName("张三");person.setAge(26);Address address = new Address();address.setStreet("长安街");address.setCity("北京市");person.setAddress(address);List<String> items = new ArrayList<String>();items.add("item1");items.add("item2");items.add("item3");Map<String, String> map = new HashMap<String, String>();map.put("key1", "value1");map.put("key2", "value2");OgnlContext context = new OgnlContext();context.setRoot(person);context.put("items", items);context.put("map", map);// 获取属性值String expression = "";String name = (String) Ognl.getValue(expression, context, context.getRoot());System.out.println("姓名:" + name);// 设置属性值expression = "person.age";Ognl.setValue(expression, context, context.getRoot(),28);System.out.println("年龄:" + person.getAge());// 调用方法expression = "person.sayHello()";String result = (String) Ognl.getValue(expression, context, context.getRoot());System.out.println("结果:" + result);// 访问集合expression = "items[0]";String item = (String) Ognl.getValue(expression, context, context.getRoot());System.out.println("集合第一个元素:" + item);// 访问Mapexpression = "map.key1";String value = (String) Ognl.getValue(expression, context, context.getRoot());System.out.println("Map value:" + value);}}以上就是使用OGNL表达式在Java中访问对象的示例代码,希望能对您的学习有所帮助。
第四章:Struts2中的OGNL专题知识讲座
IBM Software Group
OGNL上下文概念详解
➢ OGNL上下文概IB念M详S解oftware Group
我们前面说上下文就是一组名称-对象正确集合,如下图所示就是一种简朴旳上下文:
➢ Java代码 user ---> User(name:"jack", ...) request ---> HttpServletRequest(header: ...)
struts2对OGNL上下文旳概念又做了进一步扩充,在struts2中,OGNL上下文一般如下 所示: Java代码
|-- application | |-- session |
context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ] | |-- request | |--parameters
➢ OGNL体现式最大旳优点就是:*简朴* 和 *直观*,你不这么以为吗? 假如你觉得上面旳体现式还不 够简朴和直观,那我们再来看:
➢ Java代码 name
这也是一种OGNLftware Group
OGNL基本概念
➢ 我们前面看到了IBOMGSNoLf旳tw一ar种e最G简ro朴up旳例子,实际上OGNL确实很简朴,假如能了解上面
IBM Software Group
为何要使用OGNL
➢ 视图层旳体现式语IB言M一S般of是tw用ar来e 简G化ro数up据旳访问操作,取代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); %> ➢ 哪一种措施更为简捷,相信大家已经一目了然了。 ➢ 既然JSP2.0已经内置了一种体现式语言,那么为何还要使用OGNL呢? ➢ 相对于其他旳体现式语言而言,OGNL旳功能更为强大,它提供了诸多高级而必须旳特征, 例如强大旳类型转换功能,静态或实例措施旳执行,跨集合投影(projection),以及动态 lambda体现式定义等。
ognl 调用方法
OGNL 调用方法什么是 OGNL?OGNL(Object-Graph Navigation Language)是一个用于对象图导航的表达式语言。
它可以通过简洁的语法来访问和操作 Java 对象的属性、方法和索引。
OGNL 最初是为 Struts 框架设计的,但现在已经被广泛应用于其他 Java 框架和工具中,如Spring、Hibernate 等。
OGNL 的特性OGNL 具有以下特性:1.简洁:OGNL 的语法非常简洁,使用起来非常方便。
2.强大:OGNL 支持访问对象的属性、方法和索引,还支持条件判断、循环等复杂表达式。
3.安全:OGNL 提供了安全机制,可以限制表达式的访问权限,防止恶意代码执行。
4.扩展性:OGNL 可以通过自定义函数和操作符来扩展其功能。
如何使用 OGNL?1. 引入依赖首先,在你的项目中引入 OGNL 的依赖。
如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖项:<dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.2.26</version></dependency>2. 创建一个对象在使用 OGNL 之前,我们需要先创建一个 Java 对象。
假设我们有一个名为Person的类,包含了name和age两个属性:public class Person {private String name;private int age;// 省略构造函数和 getter/setter 方法}3. 使用 OGNL 表达式接下来,我们可以使用 OGNL 表达式来访问和操作对象的属性、方法和索引。
访问属性使用 OGNL 表达式可以直接访问对象的属性:Person person = new Person("Alice", 25);String name = (String) Ognl.getValue("name", person); // 获取 name 属性的值int age = (int) Ognl.getValue("age", person); // 获取 age 属性的值调用方法使用 OGNL 表达式可以调用对象的方法:Person person = new Person("Alice", 25);String greeting = (String) Ognl.getValue("sayHello()", person); // 调用 sayHel lo() 方法并获取返回值如果方法有参数,可以在表达式中传递参数:Person person = new Person("Alice", 25);String message = (String) Ognl.getValue("getMessage('Hello')", person); // 调用 getMessage(String) 方法并传递参数访问索引如果对象是一个数组或集合,可以使用索引来访问其中的元素:List<String> names = Arrays.asList("Alice", "Bob", "Charlie");String name = (String) Ognl.getValue("[1]", names); // 获取索引为 1 的元素,即 "Bob"4. OGNL 表达式的语法OGNL 表达式的语法非常简洁,下面是一些常用的语法规则:•访问属性:使用点号.来访问对象的属性,如。
OGNL教程
struts2中#、%和$这三个符号的使用方法【摘自max struts2教程】要谈OGNL在Struts2中的应用,首先得明白OGNL到底是什么OGNL 的历史OGNL 最初是为了能够使用对象的属性名来建立UI 组件(component) 和控制器(controllers) 之间的联系,简单来说就是:视图与控制器之间数据的联系。
后来为了应付更加复杂的数据关系,Drew Davidson 发明了一个被他称为KVCL(Key-Value Coding Language) 的语言。
Luke 参与进来后,用ANTLR 来实现了该语言,并给它取了这个新名字,他后来又使用JavaCC 重新实现了该语言。
目前OGNL 由Drew 来负责维护。
目前很多项目中都用到了OGNL,其中不乏为大家所熟知的,例如几个流行的web 应用框架:WebWork 【当然struts2也可以说是WebWork升级版】,Tapestry 等。
什么是OGNL?OGNL 是Object-Graph Navigation Language 的缩写,从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置java 对象的属性, 它旨在提供一个更高抽象度语法来对java 对象图进行导航,OGNL 在许多的地方都有应用,例如:1)作为GUI 元素(textfield,combobox, 等)到模型对象的绑定语言。
2)数据库表到Swing 的TableModel 的数据源语言。
3)web 组件和后台Model 对象的绑定语言(WebOGNL,Tapestry,WebWork,WebObjects) 。
4)作为Jakarata Commons BeanUtils 或者JSTL 的表达式语言的一个更具表达力的替代语言。
另外,java 中很多可以做的事情,也可以使用OGNL 来完成,例如:列表映射和选择。
对于开发者来说,使用OGNL,可以用简洁的语法来完成对java 对象的导航。
SSH-18-第9章-OGNL表达式-1
第9章OGNL表达式本章目标1、值栈(ValueStack)是什么?一个容器,用于存放(1)Web对象(request、session、application等)的数据(2)Action中的数据(对象、集合)生命周期?与Action实例相同。
Struts会为每一个Action实例创建一个值栈。
获取值栈(在Action中)存入值(1)存入对象User u =new User("李四",22,"北京");ActionContext.getContext().getValueStack().set("user",u);(2)存入集合List<User> list=new ArrayList<User>();User u1 =new User("张三",23,"广州");list.add(u1);User u2 =new User("李四",23,"深圳");list.add(u2);ActionContext.ge tContext().getValueStack().set("list",list);2、OGNL简介含义:OGNLObject Graphic Navigation Language作用:(1)在jsp页面中,从值栈中取数据(web对象、Action类中的属性、集合)(2)调用java对象的方法(3)进行类型转换3、OGNL从值栈数据总结:需要加# 的2种情形:(1)object是集合中的元素的时候,是<s:iterator value="list"var="h" status="x"><s:property value="#x.getCount()"/>---<s:property value="#h.toString()"/><br/> </s:iterator>(2)访问ServletAPI的对象时(request, session, application)4、OGNL中的特殊字符# 构建map集合作用:(1)获取web对象、获取的数据(2)构建一个map集合举例:<div><h5>#号构建的ognl集合</h5><s:iterator value="#{'name':'张三','age':23,'address':'广州'}" var="n"> <s:property value="key"/>--<s:property value="value"/> </s:iterator></div>效果:--(3)延伸,list集合的表示<div><h5>list集合</h5><s:iterator value="{'张三','李四','王五'}"var="n"><s:property value="n"/></s:iterator></div>% 强制解析成ognl表达式<h5>%强制解析成ognl表达式</h5><% request.setAttribute("name", "张三");%><s:textfield value="#"></s:textfield><br/><s:textfield value="%{#}"></s:textfield></div>说明:默认情况下,只有<s:property value=””> 的value会被解析成ognl表达式$ 配置文件中使用ognl表达式(了解)//使用在哪里?.xml中、.properties中//根据session中的用户名,显示欢迎信息message_zh_CN.propertiesuser.welcome=欢迎${#ername}在a标签的href 属性使用OGNL模板:Struts2内置的类型转换功能(1)在Action类中,struts2 会自动将浏览器传过来的参数,转换成同名参数对应的类型。
MyBatis中OGNL的使用教程详解
MyBatis中OGNL的使⽤教程详解前⾔本⽂主要给⼤家讲如何在MyBatis中使⽤OGNL的相关内容,分享出来供⼤家参考学习,感兴趣的朋友们下⾯来⼀起看看详细的介绍:如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis有关的,虽然和Struts中的⽤法类似但是换种⽅式理解起来就有难度。
MyBatis常⽤OGNL表达式e1 or e2e1 and e2e1 == e2,e1 eq e2e1 != e2,e1 neq e2e1 lt e2:⼩于e1 lte e2:⼩于等于,其他gt(⼤于),gte(⼤于等于)e1 in e2e1 not in e2e1 + e2,e1 * e2,e1/e2,e1 - e2,e1%e2!e,not e:⾮,求反e.method(args)调⽤对象⽅法e.property对象属性值e1[ e2 ]按索引取值,List,数组和Map@class@method(args)调⽤类的静态⽅法@class@field调⽤类的静态字段值上述内容只是合适在MyBatis中使⽤的OGNL表达式,完整的表达式点击。
MyBatis中什么地⽅可以使⽤OGNL?如果你看过,也许会有印象,因为这篇⽂章中提到了OGNL和⼀些特殊⽤法。
如果没看过,建议找时间看看,上⾯这篇博客不是很容易理解,但是理解后会很有⽤。
MyBatis中可以使⽤OGNL的地⽅有两处:动态SQL表达式中${param}参数中上⾯这两处地⽅在MyBatis中处理的时候都是使⽤OGNL处理的。
下⾯通过举例来说明这两种情况的⽤法。
1.动态SQL表达式中例⼀,MySQL like 查询:<select id="xxx" ...>select id,name,... from country<where><if test="name != null and name != ''">name like concat('%', #{name}, '%')</if></where></select>上⾯代码中test的值会使⽤OGNL计算结果。
mybatis ognl调类方法
mybatis ognl调类方法Mybatis OGNL调用类方法Mybatis是一种持久层框架,它的主要作用是将数据库操作与Java代码分离,简化了数据访问层的编写。
OGNL(Object-Graph Navigation Language)是Mybatis中用于实现动态SQL的表达式语言。
在Mybatis中,可以使用OGNL表达式来调用Java类的方法。
下面我将介绍如何使用OGNL调用类方法。
首先,在Mybatis的SQL映射文件中,可以使用OGNL表达式来调用类方法。
例如,假设有一个User类,其中有一个静态方法getNameById,用于根据用户ID获取用户名。
可以在SQL映射文件中使用OGNL表达式调用该方法:```xml<select id="selectUserById" resultType="String">SELECT ${className}.getNameById(${userId})FROM usersWHERE id = #{userId}</select>```上述代码中,`${className}`是一个OGNL表达式,用于获取User类的类名。
`${userId}`是一个参数占位符,用于获取用户ID。
通过使用OGNL表达式调用类的静态方法,可以实现根据ID获取用户名的功能。
其次,在代码中使用OGNL表达式调用类方法也非常简单。
可以使用OGNL的`@class@methodName(args)`语法来调用类方法。
例如,假设有一个User类,其中有一个实例方法getAge,用于获取用户的年龄。
可以使用OGNL表达式调用该方法:```javaMap<String, Object> parameter = new HashMap<>();parameter.put("user", user);int age = (int) Ognl.getValue("@class@getAge()", parameter, user);```上述代码中,`user`是一个实例对象,`parameter`是一个存储OGNL表达式参数的Map,并且将`user`对象存入Map中。
- 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将其取回。