`
在水伊方
  • 浏览: 111559 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Struts2--OGNL表达式

 
阅读更多

       OGNLObject-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 2OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性:

${foo} //获得值栈中某个对象的foo属性

 

如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。

application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用ServletContextgetAttribute("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>

 

以下为运行结果:

 

 

 
  • 大小: 7.4 KB
  • 大小: 30 KB
分享到:
评论

相关推荐

    struts2-xwork-ognl的源文件(jar包)

    同时,源代码分析也能帮助开发者避免潜在的问题,如安全漏洞,例如著名的Struts2 S2-045远程代码执行漏洞,就是由于OGNL表达式不当处理导致的。因此,理解和掌握这些源代码不仅能提高开发效率,也有助于增强应用的...

    Struts2深入学习----OGNL表达式原理

    Struts2是一个流行的Java Web...通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在Struts2开发中更进一步的人来说,熟悉和掌握OGNL是必不可少的技能。

    struts2-xwork-ognl的javadoc文件(jar包)

    通过Javadoc,开发者可以学习到如何使用OGNL表达式来绑定模型数据到视图,或者在控制器中执行条件判断和循环等操作。OGNL的灵活性和强大功能使得Struts2具有高度的数据绑定能力。 在Eclipse这样的集成开发环境中,...

    struts2-scan_struts2-scan_struts2scan_scan_struts2漏洞_

    2. 避免在视图层使用未经验证的用户输入,尤其是在OGNL表达式中。 3. 使用过滤器或拦截器来限制不安全的HTTP请求头。 4. 对敏感信息进行加密处理,防止数据泄露。 5. 开发过程中采用静态代码分析工具,及早发现潜在...

    struts2-showcase.rar

    4. **OGNL表达式**:在JSP页面中使用OGNL进行数据绑定和表达式计算。 5. **国际化(i18n)**:如何为应用添加多语言支持。 6. **异常处理**:演示了如何配置和处理应用程序中的异常。 7. **Tiles布局**:使用...

    struts2-OGNL表达式测试

    这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...

    Struts2--5.OGNL

    1. Action结果映射:Struts2允许在Action的结果配置中使用OGNL表达式,比如跳转到某个页面并传递参数。 2. 结果值栈:Struts2使用值栈来存储请求相关的数据,OGNL可以从值栈中检索或修改数据。 3. JSP标签:在JSP...

    struts2--3.Ognl与值栈

    2. **上下文(Context)**:OGNL表达式执行时,会有一个上下文,包含当前环境中的变量和对象。在Struts2中,这个上下文包含了Action对象和其他请求相关的对象。 3. **方法调用**:OGNL不仅支持属性访问,还能调用...

    Struts2表达式语言----OGNL语言指南

    Struts 2默认的表达式语言,

    struts2-core-2.0.12.jar

    OGNL是Struts2中的表达式语言,用于在视图和模型之间传递数据。它允许开发者直接访问对象属性,支持动态方法调用,使得视图层的绑定变得简单而强大。 **6. freemarker和JSP视图技术** Struts2支持多种视图技术,...

    struts2-016/017漏洞解决

    确保禁用不必要的插件(如REST插件,对于S2-017),并严格限制OGNL表达式的使用,以减少代码注入的风险。 3. **增强输入验证**:对所有用户输入进行严格的验证和过滤,防止恶意数据进入系统。使用预定义的拦截器或...

    struts2-2.3.32 相关jar包

    S2-045漏洞,全称是“Struts2 OGNL注入漏洞”,这是一个严重的安全问题,允许攻击者通过恶意构造的HTTP请求向应用程序注入任意OGNL(Object-Graph Navigation Language)表达式,可能导致远程代码执行(RCE)。OGNL...

    Struts2-2.5.13最新jar下载

    此外,熟悉OGNL表达式和结果类型也是掌握Struts2的关键。 总之,Struts2-2.5.13是一个成熟的Java Web框架,提供了许多开箱即用的功能和高度的可定制性,是企业级应用开发的有力工具。通过深入学习和实践,开发者...

    Struts2 如何使用OGNL表达式(三十八)

    本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的核心组成部分,它允许开发者在Action类和JSP页面之间灵活地传递和访问数据。在Action类中,你可以设置属性,然后在JSP页面上通过OGNL...

    struts2-tags-API,struts2标签api

    1. `s:property`: 用于显示Action对象或OGNL表达式的结果。例如,`&lt;s:property value="username" /&gt;`可以显示用户姓名。 2. `s:textfield`: 创建输入文本字段,自动绑定到Action中的属性。如`邮箱" /&gt;`。 3. `s:...

    struts-2.5所有jar包

    7. **其他依赖库**:如ognl(Object-Graph Navigation Language)用于表达式语言,freemarker或velocity用于视图渲染,还有其他如log4j、commons-lang等辅助库。 在使用Struts2.5时,开发者需要注意以下关键点: - ...

    ognl表达式 ognl表达式

    在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    struts-2.5.22-all.zip

    除此之外,Struts2还依赖于其他一些库,如OGNL(Object-Graph Navigation Language)用于表达式语言,Freemarker或Velocity用于视图模板,以及各种插件来支持特定的功能,如文件上传、JSON处理等。 在标签中提到了...

    struts2-blank-2.0.14的lib中的jar包

    - `ognl.jar`: Object-Graph Navigation Language,用于表达式语言,支持Action属性的访问和动态方法调用。 - `freemarker.jar`: Freemarker是一个强大的模板引擎,用于生成动态内容,如HTML页面。 - `xwork-core...

Global site tag (gtag.js) - Google Analytics