【Struts2】OGNL表达式

来源:互联网 发布:高盛 知乎 编辑:程序博客网 时间:2024/06/06 06:58
【整体介绍】
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表
达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
【简单对比】
Struts2中默认是使用OGNL取代EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个
textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。
和struts1的formbean相比,这样做的好处非常明显:在webwork中不需要为每个页面专门写formbean,可以
直接利用对象层的对象。
【基本用法】
使用前的准备:在要是用标签的JSP页面引入标签库:<%@taglib uri="/struts-tags" prefix="s"%>

在web.xml中声明:

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter>

OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用。下面就以取数据为例,看看这
个符号的使用。

1. #:
1) 取request、session、application里的attribute,需要加前缀。

如:<s:property value="#session.username"/>、<s:property value="#application.us
erId"/>。如果是从request中取数据,则不需要加request前缀。
   OGNL默认是从request中取,如果没有取到并不会从session或application中取。
如<s:property value="#name"/>。
2) 取request里的请求参数,但必须加parameters前缀,且取到的是一个数组。所以如果要取参数
的第一项,还需要加上下标。
如:<s:property value="#parameters.name[0]"/>。
3) 加attr前缀能按request > session > application顺序取attribute,这样在request中取不到
会自动向session中取,如果session取不到,会向application中取。如果取到则返回,不再向上游历。
如:<s:property value="#attr.name"/>。
4) 可以构造Map。
如:<s:radio name="gender" list="{'男', '女'}"/>。
5) 能用于过滤和投影集合。
如:books.{?#this.price<100}。

2. %:
用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。实际上是让被
理解为字符串的表达式,当成真正的OGNL来执行。

如:<s:form action="user_%{id == null ? 'add' : 'edit'}"> </s:form>
这里的意思就是把'add'和'edit'当成字符串,而取add还是edit加了一个id的判断条件,这样一来
id!=null的时候,其实action="user_edit",而id==null,action="user_add",从而实现执行不同的action。

3. $:
1) 在国际化资源文件中,引用OGNL表达式。

例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同
${max}之间。
2) 在Struts 2框架的配置文件中引用OGNL表达式。
例如:

【学习总结】
之前接触过一个用Struts1框架的项目,那时候每个实体都会有一个formBean文件,就是为了传递数据,
而且JSP页面上存取数据的代码写的很混乱。
现在又一次接触到Struts2的框架,感受到了OGNL表达式的方便,代码也简单了很多。对OGNL表达式的使用,
刚开始可能很不熟悉,还是要多用用。


0 0