Struts2中的OGNL详解

合集下载

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利⽤原理及OGNL机制Struts2漏洞利⽤原理及OGNL机制研究概述在MVC开发框架中,数据会在MVC各个模块中进⾏流转。

⽽这种流转,也就会⾯临⼀些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态⽽造成的:View层—表现为字符串展⽰数据在页⾯上是⼀个扁平的、不带数据类型的字符串,⽆论数据结构有多复杂,数据类型有多丰富,到了展⽰的时候,全都⼀视同仁的成为字符串在页⾯上展现出来。

数据在传递时,任何数据都都被当作字符串或字符串数组来进⾏。

Controller层—表现为java对象在控制层,数据模型遵循java的语法和数据结构,所有的数据载体在Java世界中可以表现为丰富的数据结构和数据类型,你可以⾃⾏定义你喜欢的类,在类与类之间进⾏继承、嵌套。

我们通常会把这种模型称之为复杂的对象树。

数据在传递时,将以对象的形式进⾏。

可以看到,数据在不同的MVC层次上,扮演的⾓⾊和表现形式不同,这是由于HTTP协议与java的⾯向对象性之间的不匹配造成的。

如果数据在页⾯和Java世界中互相传递,就会显得不匹配。

所以也就引出了⼏个需要解决的问题:1.当数据从View层传递到Controller层时,我们应该保证⼀个扁平⽽分散在各处的数据集合能以⼀定的规则设置到Java世界中的对象树中去。

同时,能够灵活的进⾏由字符串类型到Java中各个类型的转化。

2.当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进⾏访问。

同时,在⼀定程度上控制对象树中的数据的显⽰格式。

我们稍微深⼊思考这个问题就会发现,解决数据由于表现形式的不同⽽发⽣流转不匹配的问题对我们来说其实并不陌⽣。

同样的问题会发⽣在Java世界与数据库世界中,⾯对这种对象与关系模型的不匹配,我们采⽤的解决⽅法是使⽤如hibernate,iBatis等框架来处理java对象与关系数据库的匹配。

现在在Web层同样也发⽣了不匹配,所以我们也需要使⽤⼀些⼯具来帮助我们解决问题。

OGNL表达式

OGNL表达式

OGNL表达式1.什么是OGNLOGNL:Object Graphic Navigation Language(对象图导航语⾔)它是Struts2中默认的表达式语⾔。

使⽤表达式需要借助Struts2的标签.OGNL与EL的区别:EL/JSTL 数学运算等等表达式: 都有⼀个明确的返回值,都只能取值。

OGNL表达式: 它不仅可以取值,还可以赋值(赋值操作只能由Struts来完成)OGNL表达式的写法: 属性.属性.属性的⽅式 <input type="text" name="er"/>OGNL表达式的基本使⽤:使⽤s:property标签输出内容访问普通⽅法访问静态⽅法访问静态属性操作集合(List AND Map)<title>Struts2OGNL表达式的基本使⽤</title></head><body><!-- a、使⽤s:property标签输出内容:要想输出内容到页⾯得使⽤Struts2的标签库value属性:把value取值所对应的内容输出到页⾯若想直接输出⽂本,则需要⽤引号引起来。

-->输出基本内容:<s:property value="'OGNLExpresession'"/><hr/><!-- b、访问普通⽅法 -->输出字符串的长度:<s:property value="'OGNLExpresession'.length()"/><br/>输出转⼤写字符:<s:property value="'OGNLExpresession'.toUpperCase()"/><br/>切割字符串:<s:property value="'OGNLExpresession'.split('L')"/><hr/><!-- c、访问静态属性语法:@类的全路径@静态字段-->输出整数的最⼤值:<s:property value="@ng.Integer@MAX_VALUE"/><hr/><!-- d、访问静态⽅法语法:@类的全路径@静态⽅法注意:使⽤静态⽅法时,需要在struts.xml中开启静态⽅法调⽤的开关。

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属性

OGNL的概念

OGNL的概念

首先了解下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") 。

常用的ONGL表达式

常用的ONGL表达式

常用ONGL表达式1. 基本对象树的访问对象树的访问就是通过使用点号将对象的引用串联起来进行。

例如:name,,2. 对容器变量的访问对容器变量的访问,通过#符号加上表达式进行。

例如:#name,#,#3. 使用操作符号OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用+, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用mod, in, not in等。

4. 容器、数组、对象OGNL支持对数组和ArrayList等容器的顺序访问:例如:ers[0]同时,OGNL支持对Map的按键值查找:例如:#session['mySessionPropKey']不仅如此,OGNL还支持容器的构造的表达式:例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map你也可以通过任意类对象的构造函数进行对象新建:例如:new .URL("http://localhost/")5. 对静态方法或变量的访问要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources 6. 方法调用直接通过类似Java的方法调用方式进行,你甚至可以传递参数:例如:user.getName(),ers.size(),group.containsUser(#requestUser)7. 投影和选择OGNL支持类似数据库中的投影(projection)和选择(selection)。

el表达式与ognl表达式的区别

el表达式与ognl表达式的区别

8月22日珠海OSC 源创会正在报名,送机械键盘和开源无码内裤ers request.getParameter("username")#username ${username}request request.getAttribute("userName")#erName ${requestScope.username}session session.getAttribute("userName")#erName ${sessionScope.username}applicati on application.getAttribute("userName")#erName ${applicationScername}attr 用于按request > session >application顺序访问其属性(attribute)#erName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为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表达式的值。

如下面的代码所示:构造Map[html]view plain copy print?3.$符号用${}:1,访问Bean属性如:${user.uname}等价于<% User user=(User)request.getAttribute("user");out.print(user.getUname());%>2,获取请求参数,如:${ername}等价于request.getParamter("username");EL表达式是配合JSTL使用的。

Struts2标签库和OGNL

第8章?第9章Struts2标签库和OGNL学习内容Struts 2标签库OGNL能力目标熟练使用Struts 2常用标签熟练使用OGNL本章简介前面我们编写的案例使用的都是HTML 标签,这些标签并不能很好的与Struts 2框架结合,Struts 2和Struts 1一样都自带了功能强大、成熟完善的标签库供我们使用,通过使用这些标签库可以大大提高开发效率和代码的可维护性。

其实Struts 2的标签库是建立在OGNL 基础上的,OGNL 是一种功能强大的表达式语言,通过简单的语法即可存取对象的属性、调用对象的方法、遍历等功能。

本章将学习OGNL 和Struts 2标签库,包括数据访问标签、控制标签、表单标签和非表单标签等。

核心技能部分9.1 OGNL9.1.1 ActionContextStruts 2中的ActionContext 、ValueStack 和StackContext 对象与OGNL 密切相关,理解这三个对象时学习OGNL 的前提。

在前面的学习中,我们已经在使用ActionContext 、ValueStack 和StackContext 对象了,这三个对象的作用及其之间的关系如图8.1.1所示。

图8.1.1ActionContext1. ActionContext 对象ActionContextValueStackStackContextAction 其他Session Request Application Parameters Attribute 其他ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文。

我们可以把上下文可以看作是一个容器,用于存放Action执行时需要使用的对象,例如请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)等。

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 简介、三目表达式概述和字符串参数拼接方法。

s2-052原理

s2-052原理S2-052是指一种计算机安全漏洞,原理是利用Apache Struts 2框架的一个漏洞来执行远程代码。

Apache Struts 2是一个用于构建Web应用程序的开源框架,被广泛使用。

S2-052漏洞是Struts 2框架的一个安全漏洞,其原理是对Struts 2的核心组件——OGNL(Object-Graph Navigation Language)表达式进行了恶意注入。

在受到该漏洞攻击的情况下,攻击者可以构造恶意请求并发送给受影响的服务器。

服务器接收到请求后,会解析请求中的OGNL表达式,并在执行过程中未对其进行充分验证和过滤,导致攻击者可以在服务器上执行任意代码。

通过利用S2-052漏洞,攻击者可以实现远程命令执行,包括任意文件读取、文件删除、命令执行等操作。

这可能导致服务器的敏感数据泄露、系统被入侵、服务被停止等安全问题。

为了修复这个漏洞,Apache Struts 2开发团队发布了针对S2-052漏洞的安全补丁。

用户应该尽快更新Struts 2框架,并确保及时应用最新的安全补丁,以防止受到S2-052漏洞的攻击。

S2-052漏洞的具体原理如下:1. Apache Struts 2框架中的DefaultActionMapper类存在安全问题,攻击者可以通过构造恶意的请求来利用该漏洞。

2. 默认情况下,Struts 2框架使用的是通配符“/*”来匹配URL中的动作(action)。

攻击者可以通过构造特殊的URL,例如“/*/xxx.action”,来绕过框架的安全检查。

3. 在解析请求时,DefaultActionMapper会将URL中的动作部分进行解析。

恶意请求中的动作部分包含OGNL表达式,由${}包裹。

4. OGNL是Struts 2框架中用于动态访问和操作Java对象的表达式语言,可以通过OGNL表达式执行代码。

5. 由于默认配置下Struts 2框架对OGNL表达式的处理不够安全,未对其中的特殊字符进行充分的过滤和验证。

Struts2.0中的重要的jar包简介


6、struts.jar
struts核心包。
其他的一下jar包
7、commons-collections.jar
扩展了标准的Java Collection框架,提供了额外的Map、List 和Set实现以及多个有用的工具类库。功能比java.util.*强大。
8、commons-logging.jar:
struts2 jar包说明
commons-logging-1.0.4.jar 日志包
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar 核心包
xwork-2.0.4.jar xwork所依赖的核心包,strutsቤተ መጻሕፍቲ ባይዱ也依赖于它
struts2.1.6,至少需要如下6 个jar包:
struts2-core-2.1.6.jar
freemarker-2.3.13.jar
commons-logging-1.0.4.jar
ognl-2.6.11.jar
xwork-2.1.2.jar
commons-fileupload-1.2.1.jar
commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。
1、commons-beanutils.jar
Commons-Beanutils 这个是jakarta commons项目中的一个子项目。这个项目开发的目的是帮助开发者动态的获取/设值Java Bean的属性,同时解决每次都要写getXXX和setXXX的麻烦。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts2中的OGNL详解首先了解下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表达式,例如:1.<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:1.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:1.<%@ 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" "/TR/ xhtml1/DTD/xht ml1-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.52. <h3>构造Map</h3>53.54. <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />55.56. <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>57.58. <hr />59.60. <h4>%符号的用法</h4>61.62. <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />63.64. <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>65.66. <p>不使用%:<s:url value="#foobar['foo1']" /></p>67.68. <p>使用%:<s:url value="%{#foobar['foo1']}" /></p>69.70. <hr />71. <%72. request.setAttribute("req", "request scope");73. request.getSession().setAttribute("sess", "session scope");74. request.getSession().getServletContext().setAttribute("app",75. "aplication scope");76. %>77. 1.通过ognl表达式获取属性范围中的值78. <br>79. <s:property value="#request.req" />80. <br />81. <s:property value="#session.sess" />82. <br />83. <s:property value="#application.app" />84. <br />85. <hr>86.87. 2.通过<span style="background-color: #fafafa;">ognl表达式创建list 集合,并且遍历出集合中的值88. <br>89. <s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>90. <s:iterator value="#list" var="o">91.<!-- ${o }<br/> -->92. <s:property />93. <br />94. </s:iterator>95. <br />96. <hr>97.98. 3.通过ognl表达式创建Map 集合,并且遍历出集合中的值99. <br>100. <s:set name="map"101. value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb', '5':'aaaaa'}"></s:set>102. <s:iterator value="#map" var="o">103.<!-- ${o.key }->${o.value }<br/> -->104.<!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/> -->105. <s:property value="key" />-><s:property value="value" />106. <br />107. </s:iterator>108. <br />109. <hr>110. 4.通过ognl表达式进行逻辑判断111. <br>112. <s:if test="'aa' in {'aaa','bbb'}">113. aa 在集合{'aaa','bbb'}中;114. </s:if>115. <s:else>116. aa 不在集合{'aaa','bbb'}中;117. </s:else>118. <br />119. <s:if test="#request.req not in #list">120.不在集合list中;121. </s:if>122. <s:else>123.在集合list中;124. </s:else>125. <br />126. <hr>127.128. 5.通过ognl表达式的投影功能进行数据筛选129. <br>130. <s:set name="list1" value="{1,2,3,4,5}"></s:set>131. <s:iterator value="#list1.{?#this>2}" var="o">132.<!-- #list.{?#this>2}:在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 -->133. ${o }<br />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="che ckbox2-1" checked="checked"/>249. <label for="checkbox2-1" class="checkboxLabel">上网</label>250. <input type="checkbox" name="checkbox2" value="2" id="che ckbox2-2" checked="checked"/>251. <label for="checkbox2-2" class="checkboxLabel">看书</label>252. <input type="checkbox" name="checkbox2" value="3" id="che ckbox2-3"/>253. <label for="checkbox2-3" class="checkboxLabel">爬山</label>254. <input type="checkbox" name="checkbox2" value="4" id="che ckbox2-4"/>255. <label for="checkbox2-4" class="checkboxLabel">游泳</label>256. <input type="checkbox" name="checkbox2" value="5" id="che ckbox2-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 对象。

相关文档
最新文档