OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
OGNL有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图
访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session
另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈)。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。
在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象。
在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:
<s:property value="name"/>
由于ValueStack(值栈)是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性:
${foo} //获得值栈中某个对象的foo属性
如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。
application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用ServletContext的getAttribute("username")。
session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。
request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName")。
parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。
attr对象:用于按page->request->session->application顺序访问其属性。
下面是OGNL表达式的简单例子:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>OGNL表达式入门</title> </head> <body> <% request.setAttribute("request", "request scope"); request.getSession().setAttribute("session", "session scope"); request.getSession().getServletContext() .setAttribute("application", "application scope"); %> 1.通过ognl表达式获取 属性范围中的值 <br> <s:property value="#request.request" /> <br /> <s:property value="#session.session" /> <br /> <s:property value="#application.application" /> <br /> <br /> 2.通过ognl表达式创建list 集合 ,并且遍历出集合中的值 <br /> <s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}" /> <s:iterator value="#list" var="o"> <!-- ${o }<br/> --> <s:property /> <br /> </s:iterator> <br /> 3.通过ognl表达式创建数组 ,并且遍历出集合中的值 <br /> <s:set name="array" value="new int[] { 1, 2, 3 }" /> <s:iterator value="#array" var="o"> <!-- ${o }<br/> --> <s:property /> <br /> </s:iterator> <br /> 4.通过ognl表达式创建Map集合 ,并且遍历出集合中的值 <br> <s:set name="map" value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}" /> <s:iterator value="#map" var="o"> <!-- ${o.key }->${o.value }<br/> --> <!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/> --> <s:property value="key" />-><s:property value="value" /> <br /> </s:iterator> <br /> 5.通过ognl表达式 进行逻辑判断 <br> <s:if test="'aa' in {'aaa','bbb'}"> aa 在集合{'aaa','bbb'}中; </s:if> <s:else> aa 不在集合{'aaa','bbb'}中; </s:else> <br /> <s:if test="#request.request not in #list"> request.request 不在集合list中; </s:if> <s:else> request.request 在集合list中; </s:else> <br /> <br /> 6.通过ognl表达式的投影功能进行数据筛选 <!-- ?:获得所有符合逻辑的元素。 ^:获得符合逻辑的第一个元素。 $:获得符合逻辑的最后一个元素。 --> <br> <s:set name="list" value="{1,2,3,4,5}"></s:set> <s:iterator value="#list.{?#this>2}" var="o"> <!-- #list.{?#this>2}:在list集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 --> ${o }<br /> </s:iterator> <br /> 7.通过ognl表达式访问某个类的静态方法和值 <br> <s:property value="@java.lang.Math@floor(32.56)" /> </body> </html>
以下为运行结果:
相关推荐
同时,源代码分析也能帮助开发者避免潜在的问题,如安全漏洞,例如著名的Struts2 S2-045远程代码执行漏洞,就是由于OGNL表达式不当处理导致的。因此,理解和掌握这些源代码不仅能提高开发效率,也有助于增强应用的...
Struts2是一个流行的Java Web...通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在Struts2开发中更进一步的人来说,熟悉和掌握OGNL是必不可少的技能。
通过Javadoc,开发者可以学习到如何使用OGNL表达式来绑定模型数据到视图,或者在控制器中执行条件判断和循环等操作。OGNL的灵活性和强大功能使得Struts2具有高度的数据绑定能力。 在Eclipse这样的集成开发环境中,...
2. 避免在视图层使用未经验证的用户输入,尤其是在OGNL表达式中。 3. 使用过滤器或拦截器来限制不安全的HTTP请求头。 4. 对敏感信息进行加密处理,防止数据泄露。 5. 开发过程中采用静态代码分析工具,及早发现潜在...
这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...
4. **OGNL表达式**:在JSP页面中使用OGNL进行数据绑定和表达式计算。 5. **国际化(i18n)**:如何为应用添加多语言支持。 6. **异常处理**:演示了如何配置和处理应用程序中的异常。 7. **Tiles布局**:使用...
1. Action结果映射:Struts2允许在Action的结果配置中使用OGNL表达式,比如跳转到某个页面并传递参数。 2. 结果值栈:Struts2使用值栈来存储请求相关的数据,OGNL可以从值栈中检索或修改数据。 3. JSP标签:在JSP...
2. **上下文(Context)**:OGNL表达式执行时,会有一个上下文,包含当前环境中的变量和对象。在Struts2中,这个上下文包含了Action对象和其他请求相关的对象。 3. **方法调用**:OGNL不仅支持属性访问,还能调用...
Struts 2默认的表达式语言,
OGNL是Struts2中的表达式语言,用于在视图和模型之间传递数据。它允许开发者直接访问对象属性,支持动态方法调用,使得视图层的绑定变得简单而强大。 **6. freemarker和JSP视图技术** Struts2支持多种视图技术,...
确保禁用不必要的插件(如REST插件,对于S2-017),并严格限制OGNL表达式的使用,以减少代码注入的风险。 3. **增强输入验证**:对所有用户输入进行严格的验证和过滤,防止恶意数据进入系统。使用预定义的拦截器或...
S2-045漏洞,全称是“Struts2 OGNL注入漏洞”,这是一个严重的安全问题,允许攻击者通过恶意构造的HTTP请求向应用程序注入任意OGNL(Object-Graph Navigation Language)表达式,可能导致远程代码执行(RCE)。OGNL...
此外,熟悉OGNL表达式和结果类型也是掌握Struts2的关键。 总之,Struts2-2.5.13是一个成熟的Java Web框架,提供了许多开箱即用的功能和高度的可定制性,是企业级应用开发的有力工具。通过深入学习和实践,开发者...
本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的核心组成部分,它允许开发者在Action类和JSP页面之间灵活地传递和访问数据。在Action类中,你可以设置属性,然后在JSP页面上通过OGNL...
1. `s:property`: 用于显示Action对象或OGNL表达式的结果。例如,`<s:property value="username" />`可以显示用户姓名。 2. `s:textfield`: 创建输入文本字段,自动绑定到Action中的属性。如`邮箱" />`。 3. `s:...
7. **其他依赖库**:如ognl(Object-Graph Navigation Language)用于表达式语言,freemarker或velocity用于视图渲染,还有其他如log4j、commons-lang等辅助库。 在使用Struts2.5时,开发者需要注意以下关键点: - ...
在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
除此之外,Struts2还依赖于其他一些库,如OGNL(Object-Graph Navigation Language)用于表达式语言,Freemarker或Velocity用于视图模板,以及各种插件来支持特定的功能,如文件上传、JSON处理等。 在标签中提到了...
- `ognl.jar`: Object-Graph Navigation Language,用于表达式语言,支持Action属性的访问和动态方法调用。 - `freemarker.jar`: Freemarker是一个强大的模板引擎,用于生成动态内容,如HTML页面。 - `xwork-core...