### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现动态数据处理的核心技术之一。 OGNL的主要特点包括: 1. **支持属性方法调用**:如`objName.methodName()`。 2. **支持内置函数调用**:例如`@java.lang.String@format('foo%s','bar')`。 3. **支持表达式的计算**:如`price=100,discount=0.8,calculatePrice()`。 4. **与Struts2的集成**:OGNL可以无缝集成到Struts2的Action、拦截器等组件中。 5. **动态性**:OGNL表达式可以在运行时动态解析。 #### 二、OGNL在Struts2中的使用方式 OGNL在Struts2中主要用于页面显示数据、表单验证、后端逻辑处理等方面。在Struts2中使用OGNL表达式主要涉及以下几种符号:“#”、“%”和“$”。 ##### 1. “#”符号的使用 - **访问Struts2上下文**: - `#`可用于访问当前的`ActionContext`,如`#ActionContext.getContext()`。 - 访问`HTTP请求参数`:如`#parameters.id[0]`相当于`request.getParameter("id")`。 - 访问`HttpServletRequest`中的属性:如`#request.userName`相当于`request.getAttribute("userName")`。 - 访问`HttpSession`中的属性:如`#session.userName`相当于`session.getAttribute("userName")`。 - 访问`ServletContext`中的属性:如`#application.userName`相当于`application.getAttribute("userName")`。 - 访问不同范围内的属性:如`#attr.userName`会按照`request > session > application`的顺序查找`userName`属性。 - **条件筛选**:在集合中使用OGNL进行条件筛选,例如`books.{?#this.price>35}`表示筛选价格大于35的书籍。 - **Map的使用**:通过OGNL表达式直接创建Map,并在页面中使用,例如: ```java <s:property value="#{'foo1':'bar1','foo2':'bar2'}['foo1']"/> ``` ##### 2. “%”符号的使用 当页面元素的值为表达式时,可以使用`%{}`来执行OGNL表达式,该表达式通常用于动态生成HTML代码或者页面元素的值。例如: ```java <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> <s:property value="%{#myMap['key1']}" /> ``` 上述代码将显示`value1`作为页面上的内容。 ##### 3. “$”符号的使用 在Struts2的配置文件中使用OGNL表达式。例如,在`struts.xml`中配置拦截器或者结果类型时,可以使用OGNL表达式动态指定参数。例如: ```xml <action name="exampleAction" class="com.example.ExampleAction"> <interceptor-ref name="defaultStack"> <param name="$#myMap['key1']">customValue</param> </interceptor-ref> </action> ``` 此处`$#myMap['key1']`用于动态指定拦截器中的参数。 #### 三、OGNL的高级应用 除了基本的使用场景外,OGNL还支持更多高级功能,比如: - **复杂表达式的构建**:利用OGNL表达式构建复杂的逻辑判断和运算。 - **自定义函数**:用户可以通过扩展OGNL的方式,自定义函数以满足特定需求。 - **性能优化**:对于频繁使用的表达式,可以考虑使用缓存机制减少重复计算。 ### 总结 OGNL作为Struts2框架的核心技术之一,其强大的表达能力和灵活的使用方式极大地提高了开发效率。理解并熟练掌握OGNL的使用,对于深入学习和高效开发基于Struts2的应用程序至关重要。通过本文对OGNL在Struts2中的应用场景和使用技巧的介绍,希望能帮助开发者更好地利用这一强大工具。
一、什么是OGNL,有什么特点?
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。
OGNL有如下特点:
引用
(1)、支持对象方法调用,形式如:objName.methodName();
(2)、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
(3)、支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
(4)、访问OGNL上下文(OGNL context)和ActionContext;
(5)、操作集合对象。
二、使用OGNL表达式
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法
1、“#”符号有三种用途
(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称
作用
- 粉丝: 2
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip