struts2总结之 OGNL表达式

本文详细介绍了Struts2框架中OGNL的使用方法,包括访问对象、集合操作、静态成员访问等内容,并提供了示例代码帮助理解。

最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然内容不多,但是确必须的精通,这是学习struts2的基础。

Struts2
中内置了OGNL表达式的支持,使得Struts2的具有比Struts1更为强大的数据访问的功能。本文主要讲解OGNL的使用方法,并不会去讲解一些原理性的东西,想要了解的朋友可以自己去查阅相关的资料

OGNL的使用主要分以下部分来讲解:1.使用OGNL访问对象(不同范围的取值)

2.OGNL
的集合操作(OGNL元素符,以及过滤和投影功能)

3.OGNL
访问静态成员(怎么访问静态成员)

4. lambda
表达式,在OGNL中使用一些简单的函数以及OGNL总结(在总结之后会详解Struts2的标签的使用)


一、使用OGNL访问对象

1
读取struts2中的ValueStack中的值

struts2
中引入了ValueStack的概念,在struts2中默认使用ValueStack作为OGNLStackContext的根元素

OGNL
在读取根元素的时候能够直接进行读取

假设action中有

private Cat cat; private Dog dog;
俩个对象,那么在jsp页面读取方法就是

<s:property value="cat.name"/>
读取Catname属性的值

<s:property value="dog.name"/>
读取Dogname属性值

2
使用#读取parameters request session application 范围内的值()
<s:property value="#request.id"/>
相当于 request.getAttribute("id")

<s:property value="#parameters.id"/>
相当于 request.getParameter("id")

<s:property value="#session.id"/>
相当于 session.getAttribute("id")

<s:property value="#application.id"/>
相当于 application.getAttribute("id")

<s:property value="#attr.id"/>
依次搜索PageContext HttpServletRequest HttpSession ServletContext 范围 ,查找属性,找到为止
二、OGNL的集合操作

1
创建一个集合

{e1,e2,e3}
直接创建一个List类型的集合

#{Key1:Value1,Key2:Value2}
构建一个Map类型的集合

使用: <s:set name="sex" value="#{'1':'''2':''}"/>

<s:property value="#sex[id]"/>
ValueStack范围内找到id的值, 并用它作为key去查找对应的

value
并显示出来
2 OGNL
元素符
对于集合,OGNL提供了两个元素符:innot in,其中in判断某个元素是否在指定集合中;not in则用于

判断某个元素是否不在指定集合中。

判断一个对象是否在List内存在:

<s:if test="'foo' in {'foo','bar'}">

muhahaha

</s:if>

<s:else>

boo

</s:else>


<s:if test="'foo' not in {'foo','bar'}">

muhahaha

</s:if>

<s:else>

boo

</s:else>

3
过滤与投影集合

假设有一个booksList集合存在于ValueStack中,存放了多个Book类型的对象

我们可以通过这样进行过滤取值

<s:iterator value="books.{?#this.price>35}">
这样只会取到价格大于35的书籍,很好的起到了过滤的

作用,

?取出所有符合逻辑的元素

^
取出符合逻辑的第一个元素

$
取出符合逻辑的最后一个元素

三、OGNL访问静态成员

在实际的开发中像页面的参数传递是绝对拒绝使用硬编码的,最好的解决方式有2种:一种是写在国际化配置文件中;另外的一种就是建立一个类,专门维护静态成员,所有硬编码的地方都调用它就可以了。

struts2
中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

设置之后就可以用以下的表达式来访问静态成员了。

1
访问静态方法

<s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>

2
访问静态常量

<s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>

四、lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结

1 lambda
表达式

这个表达式,我其实也很少去用,这里给大家拿个例子讲解一下吧

<s:property value="#conv =:[#this==1?'
':#this==2?'':''], #conv(1)" />

这句的作用就是,value="#conv =: 定义一个函数 conv

[#this==1?'
' 定义 conv(1)=

#this==2?'
' 定义 conv(2)=

当然这个只是一个简单的例子,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体讲解,引用别人的一个例子


例如:

Fibonacci:

if n==0 return 0;

elseif n==1 return 1;

else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89
OGNL
Lambda表达式如何工作呢?
Lambda
表达式必须放在方括号内部,#this表示表达式的参数。例如:
<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)]
定义了一个Lambda表达式,
#fib(11)
调用了这个表达式。
2
总结
这里主要讲解一下使用注意事项
<s:url value="#foobar['foo1']">
如果你这样使用标签 ,那么它绝对不会是你想要的,它会按照你的
输入原样的输出的 #foobar['foo1']
正确的使用: <s:url value="%{#foobar['foo1']}"> %{} 用于对括号内用ognl求值
struts2
action,大家都习惯了生成getset方法,其实新版的没有这俩个方法也能插值进去的,它采用了java的反射机制来实现,不过官方还是建议按照旧的方法用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值