OGNL的概念

合集下载

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对象内部,这样初始化⼯作就完成了。

ognl用法

ognl用法

ognl用法
OGNL(Object-Graph Navigation Language)是一种基于Java的表达式语言,用于在对象图中导航和操作对象属性。

它提供了一种简洁、灵活和强大的方法来访问和操作Java对象。

使用OGNL,我们可以通过简单的语法来访问对象的属性。

OGNL表达式由对象和属性组成,通过点号来连接它们。

例如,""表示访问user对象的name属性。

除了访问属性,OGNL还提供了一些运算符和函数,以便执行各种操作。

一些常见的操作包括算术运算、逻辑运算、比较运算和类型转换。

OGNL还支持访问列表、数组和Map等集合类型的元素。

我们可以使用索引或键来获取集合中的元素。

例如,"users[0]"表示获取列表users的第一个元素。

同时,OGNL还支持条件表达式和循环控制结构,使我们能够根据条件执行不同的操作或重复执行一段代码。

除了简单的属性访问和操作,OGNL还提供了一些高级功能,例如动态方法调用、获取静态字段和方法等。

这使得我们能够在OGNL中执行更复杂的操作,如调用对象的方法或访问类的字段。

总的来说,OGNL是一个功能强大的表达式语言,它提供了一种便捷的方式来访问和操作Java对象。

无论是在编写Web应用程序、设计页面模板还是进行对象导航和操作,OGNL都是一个非常有用的工具。

它的简洁语法和丰富功能使得我们能够更轻松地进行开发。

arthas ognl 执行方法

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数组,其中包含了调用方法的返回值。

Ognl概述

Ognl概述

OGNL表达式为了解决数据从View层传递到Controller层时的不匹配性,Struts2采纳了XWork的OGNL方案。

并且在OGNL的基础上,构建了OGNLValueStack的机制,从而比较完美的解决了数据流转中的不匹配性。

OGNL(Object Graph Navigation Language),是一种表达式语言。

使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java对象树的方法、同时能够自动实现必要的类型转化。

如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。

如何使用OGNL让我们先研究一下OGNL的API,他来自于Ognl的静态方法:Java代码1.2.3.public static Object getValue( Object tree, Map context, Object root ) throws OgnlException;4.5.6.public static void setValue( Object tree, Map context, Object root, Object value ) throws OgnlException我们可以看到,OGNL的API其实相当简单,你可以通过传递三个参数来实现OGNL的一切操作。

而这三个参数,被我称为OGNL的三要素。

简单的API,就已经能够完成对各种对象树的读取和设值工作了。

这也体现出OGNL的学习成本非常低。

在上面的测试用例中,需要特别强调进行区分的,是在针对不同内容进行取值或者设值时,OGNL表达式的不同。

Struts2 Reference 写道The framework uses a standard naming context to evaluate OGNL expressions. The top level object dealing with OGNL is a Map (usually referred as a context map or context). OGNL has a notion of there being a root (or default) object within the context. In expression, the properties of the root object can be referenced without any special "marker" notion. References to other objects are marked with a pound sign (#).上面这段内容摘自Struts2的Reference,我把这段话总结为以下2条规则:A)针对根对象(Root Object)的操作,表达式是自根对象到被访问对象的某个链式操作的字符串表示。

ognl表达式

ognl表达式

ognl1,OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。

Struts 2框架使用OGNL作为默认的表达式语言。

2,ognl与El不同的地方有:比如ognl可以支持对象方法的调用,静态方法的调用,对集合的投影等功能3,Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了ϕαϖα.υτιλσ.Mαπ接口,在∑τρυτσ2中上下文(Xοντεξτ)的实现为AχτιονXοντεξτ,下面是上下文(Context)的结构示意图当struts2接收到请求的时候,会迅速的创建ActionContext, ValueStack, action , 然后会把Action放入到ValueStack中,所以action的实例变量就会被访问到了4,ognl表达式要结合<s:property value=””/>标签才能使用1,访问Action中的普通属性:<s:property value="username"/> | ${username }<br/> <!-- 访问parameters,request,session,application,attr的时候以#开头,加上范围,但是如果访问的是值栈的话,那么不需要可以直接访问-->2,访问URL中的参数:<s:property value="#ername"/><br/>3,访问request中的属性:<s:property value="#request.sex2"/><br/>4,访问Action中的对象的属性:<s:property value="person.id"/>||<s:property value=""/><br/>5,访问Action中对象中对象的属性:<s:propertyvalue="person.friend.dname"/><br/>6,访问Action中的普通方法:<s:property value="greeting()"/><br/>7,访问Action中的对象的普通方法:<s:property value="person.sayHello()"/><br/><!-- 如果要访问静态的方法,需要在strut中设置一个常量:struts.ognl.allowStaticMethodAccess为true ,访问的方法为@全类名@方法名()--> 8,访问Action中的静态方法:<s:propertyvalue="@hwt.action.OgnlAction@staticMethod()"/><br/>9,访问其他对象的静态方法:<s:propertyvalue="@hwt.service.OgnlService@getDname()"/><br/>10,访问其他对象的静态方法返回的对象的属性:<s:propertyvalue="@hwt.service.OgnlService@getDog().dname"/><br/><!-- 要将静态的属性设置为public -->11,访问静态的属性:<s:property value="@hwt.service.OgnlService@str"/><br/> 12,访问Math的方法:<s:property value="@@max(2,3)"/><br/>-------------------------------<br/><!-- 需要注意的是在ognl表达式中,{}代表的是一个集合 -->13,访问list:<br/>list: <s:property value="list"/><br/>list中的一个对象:<s:property value="list[0]"/><br/>list中某个属性的集合:<s:property value="list.{dname}"/><br/>list中的一个对象的属性:<s:property value="list[0].dname"/><br/>循环list:<s:iterator value="list" var="l"><s:property value="#l.dname"/></s:iterator><br/><s:iterator value="strs" var="s" status="st"><font color=<s:iftest="#st.odd">red</s:if><s:else>black</s:else>><s:propertyvalue="#st.index"/>,<s:property value="s"/></font></s:iterator><br/>-------------------------------<br/>set集合和list集合一样的<br/>-------------------------------<br/>14,map集合:<br/>map: <s:property value="map"/><br/>map中某一个对象:<s:property value="map.key1"/><br/>map中所有的key:<s:property value="map.keys"/><br/>map中所有的值:<s:property value="map.values"/><br/>循环map:<s:iterator value="map" status="s"><s:property value="key"/>-<s:property value="value"/></s:iterator><br/>15,集合的个数:<br/><s:property value="map.size()"/><s:property value="list.size"/><br/>---------------<br/>16,投影:<!-- -只循环年龄=5的所有对象的名字,投影中:#this表示每次循环到的对象?表示要筛选的条件^表示满足后面条件的第一个$表示满足后面条件的最后一个--><s:iterator value="list.{?#this.age==5}”><s:property value="dname"/></s:iterator><br/><s:iterator value="list.{^#this.age>5}"><s:property value="dname"/></s:iterator><br/><s:iterator value="list.{$#this.age>5}"><s:property value="dname"/></s:iterator><br/>。

OGNL及其表达式

OGNL及其表达式
OGNL及其表达式
目标
初步理解使用OGNL的优势, 简单的OGNL表达式
初步掌握索引访问
掌握对集合进行操作 OGNL的值栈特性;
lambda表达式
2
一.ቤተ መጻሕፍቲ ባይዱGNL简介
1.OGNL概念 1)对象图导航语言,获取和设置属性的Java对象。 示例:在JSP页面中使用表达式语言获取user对象的 username <%@ page language="java" import="java.util.*,er" %> <% User user = (User)request.getAttribute("user"); out.print(username); %>
1 7
5.访问JavaBean的属性表达式
例如:有两个JavaBean类,并有一个employee对象作为OGNL上下 文的根对象? Public class Address{
Private String country; Private String city; Private String street; ……
表达式指要取谁的姓名呢?即获取在那个范围/环境的姓名 对于不同的环境/上下文,相同的表达式会有不同的结果!
4
4)OGNL表达式语言结构 Struts 2中的OGNL Context实现者为ActionContext
ValueStack(值栈,它是根对象) parameters OGNL Context request session application attr
1 0
二.简单的OGNL表达式
1.作用
表达式的计算在当前对象的上下文中,一个链简 单地使用链中先前链接的结果用作下一步计算的当 前对象 示例:导航链表达式 name.toCharArray()[0].numericValue.toString() ? 2.导航链的组成 计算: 1)属性名A. 获取根对象的name; B. 在String结果上调用toCharArray()方法 2)方法调用 C. 从char数组结果中提取第一个字符? 3)数组索引 D. 从提取的字符对象上得到numericValue属性

Struts2 OGNL表达式语言

ONGL表达式OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,OGNL是一个开源项目,读者可以访问其官方站点以获得源代码和相关资料。

OGNL是一种功能强大的EL(Expression Language,表达式语言),可以通过简单的表达式来访问Java对象中的属性,而不是直接调用对象的获取和设置方法可以提供许多应用。

比如在XML文件或者脚本文件中嵌入OGNL表达式语法,在JSP页面展现层使用OGNL表达式语法。

类似的应用有Velocity,Freemark,Webwork。

OGNL先在WebWork项目中得到应用,也是Struts 2框架视图默认的表达式语言,可以说,OGNL表达式是Struts 2框架的特点之一。

一、OGNL基础知识OGNL是将视图元素(例如textfield、combobox等)同模型对象绑定在一起的一种语言。

使用OGNL的类型转换功能,会使类型转换变得更加简单(例如将一个字符串类型转换为一个整数类型)。

表格元素同Swing TableModel对应的一种数据源语言。

可以将Web页面元素同后台服务器业务对象对应起来。

比JSTL(JSP标准标签库)表达更加丰富。

OGNL 语法OGNL支持丰富的表达式,单语法很简单。

例如有一个man对象,该对象有一个name属性,那么使用OGNL来获得该name 属性可以使用如下表达式:OGNL表达式的基础单元称为导航链,简称为链。

一个最简单的链由如下部分组成。

△说明OGNL表达式基于OGNL上下文中的当前对象,一个“链”将使用上一个“链”的处理结果,开发者可以任意扩展该链的长度,OGNL 没有限制。

例如,一个OGNL表达式如下:name.toCharArray()[0].numericValue.toString()该表达式将按照如下步骤求值。

(1)获得OGNL Context中初始对象或者是根对象(root对象)的name对象。

ognl 规则表达式解析

ognl 规则表达式解析OGNL(Object-Graph Navigation Language)是一种用于Java 语言的表达式语言,它被广泛应用于各种框架和工具中,如Struts2、Spring等。

本文将探讨OGNL规则表达式的用法和应用。

一、OGNL简介OGNL是一种基于Java的表达式语言,它提供了一种简洁而灵活的方式来访问和操作Java对象的属性和方法。

通过OGNL表达式,我们可以在运行时动态地获取、设置对象的属性,调用对象的方法,甚至进行条件判断和循环控制等操作。

二、OGNL表达式的基本语法1. 访问对象属性OGNL表达式使用"."来访问对象的属性。

例如,对于一个名为"person"的对象,我们可以使用如下的OGNL表达式来获取其属性:``````2. 调用对象方法OGNL表达式使用"()"来调用对象的方法。

例如,对于一个名为"person"的对象,我们可以使用如下的OGNL表达式来调用其方法:```person.getName()```3. 条件判断OGNL表达式使用"?"和":"来进行条件判断。

例如,我们可以使用如下的OGNL表达式来判断一个数字是否为正数:```number > 0 ? "positive" : "negative"```4. 数组和集合访问OGNL表达式使用"[]"来访问数组和集合中的元素。

例如,对于一个名为"list"的集合,我们可以使用如下的OGNL表达式来访问其中的元素:```list[0]```5. 运算符OGNL表达式支持常见的算术运算符、逻辑运算符和比较运算符。

例如,我们可以使用如下的OGNL表达式来进行加法运算:```a + b```三、OGNL在框架和工具中的应用1. Struts2Struts2是一个基于OGNL的MVC框架,它使用OGNL表达式来实现数据的绑定和动态结果的定位。

ognl 数组

OGNL 数组什么是 OGNL?OGNL(Object-Graph Navigation Language)是一种用于对象图导航的表达式语言。

它最初是为了在Java平台上访问和操作对象图而开发的,但现在也可以在其他编程语言中使用。

OGNL 具有简洁、直观和强大的特性,使得它成为了许多Java框架和库的重要组成部分。

例如,在Struts、Hibernate和Spring等框架中,OGNL 被广泛用于处理对象图。

数组操作数组是一种用于存储多个相同类型数据的数据结构。

在 OGNL 中,我们可以使用一些内置函数和语法来操作数组。

创建数组使用 OGNL 可以轻松地创建数组。

以下是创建一个包含整数的数组的示例:int[] numbers = {1, 2, 3, 4, 5};访问数组元素要访问数组中的特定元素,我们可以使用索引。

索引从0开始,并按照元素在数组中出现的顺序递增。

int firstNumber = numbers[0]; // 访问第一个元素(索引为0)int secondNumber = numbers[1]; // 访问第二个元素(索引为1)更新数组元素可以通过将新值赋给指定索引位置来更新数组中的元素。

numbers[0] = 10; // 更新第一个元素(索引为0)为10数组长度可以使用length属性获取数组的长度。

int length = numbers.length; // 获取数组的长度遍历数组OGNL 提供了一种简单的方式来遍历数组并访问每个元素。

for (int number : numbers) {System.out.println(number);}数组切片可以使用 OGNL 的切片语法来获取数组中的子数组。

切片语法使用:分隔起始索引和结束索引(不包括)。

int[] subArray = numbers[1:4]; // 获取从第二个元素到第四个元素(不包括)数组操作函数OGNL 还提供了一些有用的函数来操作数组。

OGNL表达式语言-类似EL、ValueStack、Action

1.OGNL2.ValueStack3.ValueStack4.重构资费列表5.Action基本原理1. OGNL1.1. OGNL介绍1.1.1. 什么是OGNLObject Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。

1.1.2. 为什么用OGNLOGNL表达式功能很强大,后面我们会重点阐述。

而Struts2默认采用OGNL 表达式访问Action的数据,实际上是通过ValueStack用封装后的OGNL来访问的Action。

1.1.3. OGNL原理OGNL是独立的开源组件,Struts2对其进行了改造及封装,要想了解Struts2中OGNL的运行原理,需参考ValueStack。

1.2. OGNL用法1.2.1. Struts2显示标签Struts2中,OGNL表达式要结合Struts2标签来访问数据,即OGNL表达式要写在Struts2标签内,因此我们先来介绍第一个Struts2的标签——显示标签。

1、语法<s:property value="OGNL"/>2、解释该标签的作用是根据OGNL表达式访问Action,并将取出的数据替换标签本身。

如下图,实际上该标签类似于EL表达式中的${ }。

图-11.2.2. 2个常用的OGNL表达式OGNL表达式一共有8种使用方法,其中前2种要求大家必须掌握,是经常要用到的方式,后6种了解即可,下面我们来介绍这2种必须掌握的OGNL。

1、访问基本属性语法:<s:property value="属性名"/>∙解释:这种方式的作用是将Action中的基本属性直接显示到标签的位置,属性名指的是Action中的属性。

∙举例:<s:property value="name"/>2、访问实体对象∙语法:<s:property value="对象名.属性名"/>∙解释:这种方式的作用是将Action中的实体对象属性显示到标签的位置,对象名指的是Action中的实体对象,属性名指的是实体对象中的属性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

首先了解下OGNL的概念:OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

此外,还得先需弄懂OGNL的一些知识:1.OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。

它里面可以存放很多个JavaBean对象。

它有一个上下文根对象。

上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。

否则要加前缀“#key”。

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。

如:<s:propertyvalue="xxx"/>。

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

4.值栈(ValueStack) :可以在值栈中放入、删除、查询对象。

访问值栈中的对象不用“#”。

Struts2总是把当前Action实例放置在栈顶。

所以在OGNL中引用Action中的属性也可以省略“#”。

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……1.#符号#符号的用途一般有三种。

—访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。

实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#=='pla1'}.{age}[0]。

—用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符号%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号$符号主要有两个方面的用途。

—在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—在Struts 2框架的配置文件中引用OGNL表达式,例如:view plain1.<validators>2. <field name="intb">3. <field-validator type="int">4. <param name="min">10</param>5. <param name="max">100</param>6. <message>BAction-test校验:数字必须为${min}为${max}之间!</message>7. </field-validator>8. </field>9.</validators>下面通过代码对OGNL有更深的了解:action类OgnlAction.java:view plain1.package com.tjcyjd.test.action;2.3.import java.util.Date;4.import java.util.LinkedList;5.import java.util.List;6.7.import javax.servlet.http.HttpServletRequest;8.9.import org.apache.struts2.ServletActionContext;10.import org.apache.struts2.convention.annotation.Action;11.import space;12.import org.apache.struts2.convention.annotation.ParentPackage;13.import org.apache.struts2.convention.annotation.Result;14.import org.apache.struts2.convention.annotation.Results;15.import org.springframework.stereotype.Controller;16.17.import com.opensymphony.xwork2.ActionContext;18.import com.opensymphony.xwork2.ActionSupport;19.20.@Controller21.@Namespace("/test")22.@ParentPackage("struts-default")23.@Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),24. @Result(name = "fail", location = "/bbs/admin_login.jsp"),25. @Result(name = "input", location = "/bbs/admin_login.jsp") })26.public class OgnlAction extends ActionSupport {27. private static final long serialVersionUID = -1494290883433357310L;28. private List<Person> persons;29.30. @Action("ognlTest")31. public String ognlTest() throws Exception {32. // 获得ActionContext实例,以便访问Servlet API33. ActionContext ctx = ActionContext.getContext();34. // 存入application35. ctx.getApplication().put("msg", "application信息");36. // 保存session37. ctx.getSession().put("msg", "seesion信息");38. // 保存request信息39. HttpServletRequest request = ServletActionContext.getRequest();40. request.setAttribute("msg", "request信息");41. // 为persons赋值42. persons = new LinkedList<Person>();43. Person person1 = new Person();44. person1.setName("pla1");45. person1.setAge(26);46. person1.setBirthday(new Date());47. persons.add(person1);48.49. Person person2 = new Person();50. person2.setName("pla2");51. person2.setAge(36);52. person2.setBirthday(new Date());53. persons.add(person2);54.55. Person person3 = new Person();56. person3.setName("pla3");57. person3.setAge(16);58. person3.setBirthday(new Date());59. persons.add(person3);60.61. return SUCCESS;62.63. }64.65. public List<Person> getPersons() {66. return persons;67. }68.69. public void setPersons(List<Person> persons) {70. this.persons = persons;71. }72.}jsp页面showognl.jsp:view plain1.<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>2.3.<%@ taglib prefix="s" uri="/struts-tags" %>4.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w/TR/ xhtml1/DTD/xhtml1-transitional.dtd">5.6.<html xmlns="/1999/xhtml">7.8.<head>9.10. <title>Struts2 OGNL 演示</title>11.12.</head>13.14.<body>15.16. <h3>访问OGNL上下文和Action上下文</h3>17.18. <!-使用OGNL访问属性值-->19.20. <p>parameters: <s:property value="#parameters.msg" /></p>21.22. <p>request.msg: <s:property value="#request.msg" /></p>23.24. <p>session.msg: <s:property value="#session.msg" /></p>25.26. <p>application.msg: <s:property value="#application.msg" /></p>27.28. <p>attr.msg: <s:property value="#attr.msg" /></p>29.30. <hr />31.32. <h3>用于过滤和投影(projecting)集合</h3>33.34. <p>年龄大于20</p>35.36. <ul>37.38. <!-判断年龄-->39.40. <s:iterator value="persons.{?#this.age>20}">41.42. <li><s:property value="name" /> - 年龄:<s:property value="age" /></li>43.44. </s:iterator>45.46. </ul>47.48. <p>姓名为pla1的年龄: <s:property value="persons.{?#=='pla1'}.{age}[0]"/></p>49.50. <hr />51.134. </s:iterator>135. <br />136. <hr>137. 6.通过ognl表达式访问某个类的静态方法和值138. <br>139. <s:property value="@ng.Math@floor(32.56)" />140.141. <s:property value="@com.rao.struts2.action.OGNL1Action@aa" /> 142. <br />143. <br />144. <hr>145. 7.ognl表达式迭代标签详细146. <br>147. <s:set name="list2"148. value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s :set>149. <table border="1">150. <tr>151. <td>索引 </td>152. <td>值</td>153. <td>奇?</td>154. <td> 偶?</td>155. <td>首?</td>156. <td> 尾?</td>157. <td>当前迭代数量</td>158. </tr>159. <s:iterator value="#list2" var="o" status="s">160. <tr bgcolor="<s:if test="#s.even">pink</s:if>">161. <td>162. <s:property value="#s.getIndex()" />163. </td>164. <td>165. <s:property />166. </td>167. <td>168. <s:if test="#s.odd">Y</s:if>169. <s:else>N</s:else>170. </td>171. <td>172. <s:if test="#s.even">Y</s:if>173. <s:else>N</s:else>174. </td>175. <td>176. <s:if test="#s.first">Y</s:if>177. <s:else>N</s:else>178. </td>179. <td>180. <s:if test="#s.isLast()">Y</s:if>181. <s:else>N</s:else>182. </td>183. <td>184. <s:property value="#s.getCount()"/>185. </td>186. </tr>187. </s:iterator>188. </table>189. <br>190. <hr>191.192.193. 8.ognl表达式: if/else if/else 详细<br>194. <% request.setAttribute("aa",0); %>195. <s:if test="#request.aa>=0 && #request.aa<=4">196.在0-4之间;197. </s:if>198. <s:elseif test="#request.aa>=4 && #request.aa<=8">199.在4-8之间;200. </s:elseif>201. <s:else>202.大于8;203. </s:else>204. <br>205. <hr>206. 9.ognl表达式: url 详细<br>207. <% request.setAttribute("aa","sss"); %>208. <s:url action="testAction" namespace="/aa/bb">209. <s:param name="aa" value="#request.aa"></s:param> 210. <s:param name="id">100</s:param>211. </s:url>212. <br/>213. <s:set name="myurl" value="''"></s:set> 214. value以字符处理: <s:url value="#myurl"></s:url><br> 215. value明确指定以ognl表达式处理: <s:url value="%{#myurl}"></s:url>216. <br>217. <hr>218. 10.ognl表达式: checkboxlist 详细<br>219. 1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>220. name:checkboxlist的名字<br>221. list:checkboxlist要显示的列表<br>222. value:checkboxlist默认被选中的选项,checkedchecked=checked<br> 223. <s:checkboxlist name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>224. <br>225.以上生成代码:<br>226. <xmp>227. <input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/>228. <label for="checkbox1-1" class="checkboxLabel">上网</label> 229. <input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/>230. <label for="checkbox1-2" class="checkboxLabel">看书</label> 231. <input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/>232. <label for="checkbox1-3" class="checkboxLabel">爬山</label> 233. <input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/>234. <label for="checkbox1-4" class="checkboxLabel">游泳</label> 235. <input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/>236. <label for="checkbox1-5" class="checkboxLabel">唱歌</label>"237. </xmp>238. 2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>239. name:checkboxlist的名字<br>240. list:checkboxlist要显示的列表<br>241. listKey:checkbox 的value的值<br>242. listValue:checkbox 的lablel(显示的值)<br>243. value:checkboxlist默认被选中的选项,checkedchecked=checked<br> 244. <s:checkboxlist name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist> 245. <br>246.以上生成代码:<br>247. <xmp>248. <input type="checkbox" name="checkbox2" value="1" id="checkbox2 -1" checked="checked"/>249. <label for="checkbox2-1" class="checkboxLabel">上网</label>250. <input type="checkbox" name="checkbox2" value="2" id="checkbox2 -2" checked="checked"/>251. <label for="checkbox2-2" class="checkboxLabel">看书</label> 252. <input type="checkbox" name="checkbox2" value="3" id="checkbox2 -3"/>253. <label for="checkbox2-3" class="checkboxLabel">爬山</label> 254. <input type="checkbox" name="checkbox2" value="4" id="checkbox2 -4"/>255. <label for="checkbox2-4" class="checkboxLabel">游泳</label> 256. <input type="checkbox" name="checkbox2" value="5" id="checkbox2 -5" checked="checked"/>257. <label for="checkbox2-5" class="checkboxLabel">唱歌</label> 258. </xmp>259. <hr>260.</body>261.</html>总结OGNL的使用方法:访问属性访问方法访问静态属性和方法访问构造方法1.5. 访问数组访问集合–投影、选择(? ^ $)集合的伪属性OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.Lambda :[…]格式::[…]OGNL中#的使用#可以取出堆栈上下文中的存放的对象.获取Paraments对象的属性:<s:property value="#ername"/> OGNL中%的使用用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.OGNL中$的使用“$”有两个主要的用途l 用于在国际化资源文件中,引用OGNL表达式l 在Struts 2配置文件中,引用OGNL表达式值栈ValueStack对象。

相关文档
最新文档