7.2 OGNL
7.2.1 OGNL概述
OGNL是对象图导航语言Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
在前面的例子中,登录页面输入框的name用到的名字就是OGNL的表达式,比如:“账号:<input type="text" name="account">”,在欢迎页面使用“<s:property value="account"/>”。两个"account"表达式都是相同的,但前一个保存对象属性的值,后一个是取得对象属性的值。
表达式语言简单、易懂却又功能强大,关于OGNL更多的介绍可以去http://www.ognl.org看看,那里有很详细的文档。
7.2.2 OGNL的基本使用
1:常量与操作符
在OGNL中,可以使用Java的常量操作和数学运算。需要注意的是,String常量可以使用单引号或者双引号括起来,但是单个字符也是使用单引号,所以只有在超过一个字符的时候,使用单引号界定的常量才是String类型的。如果需要只定义一个包含单个字符的String常量,就需要使用转义。
比如:<s:property value="'account'"/>这句话里面的account就是个字符串,因为它是用单引号括起来的。或者<s:property value="7+8"/>这句话,输出就是15,也就是数学运算后的值。
2:方法调用
OGNL支持方法的调用,这个在后面有演示,比如访问静态方法,比如访问集合对象的方法等,这里就不去赘述了。
3:设置数值及表达式列表
OGNL让你可以在单条语句中执行逗号分隔的多个表达式,最后一个表达式的返回值作为整条语句的输出。
4:使用OGNL访问ValueStack
在OGNL中,没有前缀代表了访问当前值栈。
比如前面的示例中,在欢迎页面中使用的“<s:property value="account"/>”,这句话中<s:property>标签的value属性的值就是使用的ognl,它没有任何前缀,就表示直接访问值栈。
访问到值栈过后,会按照从栈顶到栈底的顺序,寻找第一个匹配的对象,那就会找到Action中的account属性,然后就取到值了。
5:使用OGNL访问ActionContext
在ognl中,可以通过符号“#”来访问ActionContext中除了值栈之外的各种值,典型如:
- #parameters:当前请求中的参数,对应request.getParameter(name)
- #request:请求作用域中的属性,对应request.getAttribute(name)
- #session:会话作用域中的属性,对应session.getAttribute(name)
- #application:应用程序作用域的属性
- #attr:按照页面page、请求request、会话session和应用application的顺序,返回第一个符合条件的属性。
在引用的时候,需要加上前缀“#”,并指定范围,然后写出要引用哪个属性,形如:“#paramters.account”。
在上一节的示例上稍加修改,来试验一下这些知识。
(1)修改action,去掉PreResultListener的注册,然后设置Session和Application的属性值,示例如下:
java代码:
- public class HelloWorldAction extends ActionSupport {
- private String account;
- private String password;
- private String submitFlag;
- public String execute() throws Exception {
- this.businessExecute();
- ActionContext c = ActionContext.getContext();
- c.getSession().put("account", "session中的account");
- c.getApplication().put("account", "application中的account");
-
- return "toWelcome";
- }
-
-
-
- public void businessExecute(){
- System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);
- }
-
- }
(2)修改欢迎页面,在页面上通过OGNL来获取这些值,示例如下:
java代码:
- <%@ taglib prefix="s" uri="/struts-tags"%>
- 欢迎账号为<s:property value="account"/>的朋友来访
- <br>
- 请求参数中的帐号:<s:property value="#parameters.account"/>
- <br>
- <%request.setAttribute("account","request的account");%>
- 请求属性中的帐号:<s:property value="#request.account"/>
- <br>
- 会话属性中的帐号:<s:property value="#session.account"/>
- <br>
- 应用属性中的帐号:<s:property value="#application.account"/>
- <br>
- attr中的帐号:<s:property value="#attr.account"/>
再次运行测试一下,欢迎页面如下图所示:
图7.2 ognl引用ActionContext
(3)在ognl中还有另一种稍稍麻烦的写法来访问属性,形如“#request[‘account’]”,等价于使用“#request.account”,在访问更复杂对象的时候,两种方法可以混用。
一般建议:如果访问对象的属性,建议使用“.”的方式来访问;如果访问Map等复杂对象结构的时候,建议使用“[]”的方式来访问。
7.2.3 访问静态方法和静态属性
在OGNL中,可以通过关键字“@”来访问任意类中的静态方法和静态属性,格式为“@类的全路径名@属性名称”,或者“@类的全路径名@方法名称(参数列表)”。
这里要注意一点,在低版本的Struts2中,默认是开启了访问类的静态方法的,但是在高版本的Struts2中,比如写作本书使用的2.1.8的版本,默认是关闭了访问类的静态方法的。也就是说,要想访问类的静态方法,需要去开启设置。
配置非常简单,在struts.xml中,添加开启访问类的静态方法的配置,示例如下:
java代码:
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
(1)写一个类,里面有一个静态方法和一个静态属性供外界访问,示例如下:
java代码:
- package cn.javass.action.action;
- public class MyStatic {
- public static String staticTest = "staticTestValue";
- public static void testMethod(){
- System.out.println("static test method.");
- }
- }
(2)在欢迎页面中添加访问它们的语句,示例如下:
java代码:
- <%@ taglib prefix="s" uri="/struts-tags"%>
-
- 欢迎账号为<s:property value="account"/>的朋友来访
- <br>
- 静态属性值为:<s:property value="@cn.javass.action.action.MyStatic@staticTest"/>
- <br>
- 调用静态方法
- <s:property value="@cn.javass.action.action.MyStatic@testMethod()"/>
(3)去测试运行一下,此时欢迎页面如下图所示:
图7.3 访问静态属性的欢迎页面
后台输出信息如下:
看来OGNL的基本使用是非常简单的,接下来看看稍复杂点的情况。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4069.html】
欢迎访问http://sishuok.com获取更多内容
分享到:
相关推荐
在实际开发中,了解并熟练掌握OGNL和值栈的使用,能显著提高Struts2应用的开发效率和代码可维护性。通过阅读`struts_3`和`struts3_web`这两个文件,你可以进一步深入学习Struts2框架的这些关键特性,并通过实践加深...
同时,也能让我们理解Struts2框架如何将OGNL与动作类、模型对象和视图组件紧密集成。 通过深入学习OGNL的源码,开发者可以更好地定制和优化Struts2应用,提升性能,增强安全性,并能解决遇到的特定问题。这是一项...
在Struts2框架中,OGNL被广泛应用于值栈(Value Stack)之中。值栈是Struts2框架中的核心概念之一,它是一个用于临时存储对象的栈结构,这些对象包括Action实例、模型对象、临时对象等。值栈中的对象可以按照以下四...
1. **值栈访问**:Struts2使用值栈存储请求中的所有对象,OGNL可以从值栈顶部找到并访问对象。例如,`#request.user.name`表示从HTTP请求对象中获取`user`属性的`name`。 2. **动态方法调用**:OGNL支持直接调用...
6. **值栈**:Struts2中的值栈是OGNL的主要工作区域,它存储了Action对象和其他相关数据。通过`#root`或`#action`关键字,可以直接访问值栈顶部的对象。 7. **表达式过滤器**:为了安全考虑,Struts2允许配置OGNL...
OGNL作为Struts2框架的核心技术之一,其强大的表达能力和灵活的使用方式极大地提高了开发效率。理解并熟练掌握OGNL的使用,对于深入学习和高效开发基于Struts2的应用程序至关重要。通过本文对OGNL在Struts2中的应用...
在Struts2中,OGNL被广泛用于访问Action中的属性,以及在视图层(如JSP)中绑定和操作数据。 首先,OGNL使得访问对象属性变得非常直观。它支持点符号(.)和方括号([''])两种方式来访问属性。例如,如果在Action...
使用OGNL时,通常配合Struts2的标签,比如`s:property`,通过值栈来访问和显示数据。 3. **EL与值栈的区别**: - Expression Language(EL)虽然也能访问值栈,但它只能从栈顶开始查找,而OGNL可以更灵活地遍历...
这种灵活性使得OGNL在Struts2中被广泛应用于视图层的渲染和动作类的值传递。 在源代码中,你会看到OGNL的解析器、表达式树构建、类型转换、上下文管理等多个关键部分。这些部分共同构成了OGNL的强大功能: 1. **...
7. **OGNL表达式语言**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层语言,用于在Action和视图之间传递数据。源代码中会展示如何使用OGNL表达式。 8. **Action和ActionSupport**:Action...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL在Struts2中的应用,并通过案例"TextOgnl"来展示其工作原理。 一、OGNL的基本...
值栈(ValueStack)是Struts2中用于存储和传递数据的重要工具,它可以方便地在Action和视图之间共享数据。 #### 7.2 值栈的使用 - **获取**:通过ActionContext来获取当前的值栈。 - **存储和读取数据**:可以将...
OGNL表达式语言是Struts2的核心特性之一,它允许开发者在Action类和JSP页面之间灵活地访问和修改对象的属性。例如,`<s:textfield name="username" />`标签会将表单中的“username”字段值绑定到Action类的相应属性...
Struts2是一个流行的Java web开发框架,其核心特性之一就是使用OGNL(Object-Graph Navigation Language)作为表达式语言,并提供了丰富的标签库来简化视图层的开发。本篇文章将详细探讨Struts2中的OGNL表达式语言...
在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`<s:property>`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...
通过这个实验,你可以深入了解Struts2如何结合OGNL表达式实现数据的传递和显示,以及如何有效地利用值栈。记住,理解并熟练掌握OGNL是成为Struts2开发者的关键步骤,因为它在Struts2的许多核心功能中都起着关键作用...
OGNL(Object-Graph Navigation Language)是Struts2框架中重要的表达式语言,它用于在应用程序中进行数据绑定和表达式求值。这篇文档将详细解释OGNL API及其在Struts2框架中的应用。 首先,OGNL是一个强大的、动态...
- **防范措施**:使用Struts2的安全插件如Struts2 Security Plugin来过滤和限制OGNL表达式的执行,或者启用OGNL的安全模式(Secure OGNL),避免执行危险的操作。 4. **源码分析** 阅读Struts2源码可以帮助理解...
OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视图层与模型层之间的数据交互变得极其灵活。例如,`${user.name}` OGNL表达式可以在JSP页面中用来显示用户对象的...