- 浏览: 114333 次
- 性别:
- 来自: 宁波
文章分类
最新评论
最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。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作为OGNL的StackContext的根元素
OGNL在读取根元素的时候能够直接进行读取
假设action中有
private Cat cat; private Dog dog; 俩个对象,那么在jsp页面读取方法就是
<s:property value="cat.name"/> 读取Cat的name属性的值 <s:property value="dog.name"/> 读取Dog的name属性值 |
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提供了两个元素符:in和not 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 过滤与投影集合
假设有一个books的List集合存在于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,大家都习惯了生成get与set方法,其实新版的没有这俩个方法也能插值进去的,它采用了java的反射机制来实现,不过官方还是建议按照旧的方法用。
发表评论
-
Open Session In View(转)
2010-12-04 21:58 1068英文原文:http://community.jboss.org ... -
open session in view 研究
2010-12-04 21:54 748在没有使用Spring提供的Open Session In V ... -
Hibernate并发控制
2010-12-04 19:46 10063. 多个事务并发引起的问题:3.1. 第 ... -
servlet和filter的异同
2010-12-04 19:28 953以前总以为filter就是一种特殊servlet,所以他们 ... -
JavaScript,调用函数的5种方法
2010-11-28 16:16 878JavaScript,调用函数的5种方法 一次又一次的,我发现 ... -
IOC原理
2010-11-28 09:18 828IOC(inview of control)控制反转 ... -
Hibernate级联操作Cascade学之---delete
2010-11-27 10:06 938所在cascade,就是说我在更新一方的时候,可以根据这一 ... -
HTTP POST GET 本质区别详解
2010-11-27 09:47 827HTTP POST GET 本质区别详解 收藏 ... -
Hibernate二级缓存(转)
2010-11-27 09:38 766Hibernate二级缓存(转 ... -
加速你的Hibernate引擎(下)
2010-11-27 09:37 770加速你的Hibernate引擎(下) 文章分类:Ja ... -
加速你的Hibernate引擎(上)
2010-11-27 09:36 847加速你的Hibernate引擎(上) 文章分类:Ja ... -
spring Transaction Manager和hibernate session
2010-11-27 09:33 1038spring Transaction Manager ... -
浅析Spring提供的事务管理方法
2010-11-27 09:32 780浅析Spring提供的事务管理方法 2006-0 ... -
hibernate性能优化
2010-11-27 09:24 633转 hibernate性能优化 ... -
Hibernate 性能优化技巧
2010-11-27 09:23 725转 Hibernate 性能优化 ... -
Hibernate乐观锁实现之Timestamp
2010-11-27 09:21 847转 Hibernate乐观锁实现之Timestamp ... -
Hibernate乐观锁实现之Version
2010-11-27 09:21 802转 Hibernate乐观锁实现之Version ... -
Hibernate悲观锁定与乐观锁定区别
2010-11-27 09:20 674转 Hibernate悲观锁定 ... -
Hibernate二级缓存 ---- 最佳实践
2010-11-27 09:19 878转 Hibernate二级缓存 ---- 最佳实践 ... -
Spring如何与struts2结合
2010-11-22 12:34 9304.Spring如何与struts2结合 关键字: ...
相关推荐
struts2OGNL表达式ActionContext及valuesStack.pdf
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
NULL 博文链接:https://cdxs2.iteye.com/blog/1926840
OGNL是对象图导航语言(即该表达式访问的是对象及对象的属性)
主要介绍了Struts2 OGNL表达式实例详解,相关实例代码,需要的朋友可以参考。
NULL 博文链接:https://johnson2132.iteye.com/blog/720769
NULL 博文链接:https://chaoyi.iteye.com/blog/2158731
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1、 支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@...
struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号
Struts2的标签库及OGNL表达式语言
struts2标签和OGNL表达式struts2标签和OGNL表达式
struts2-OGNL表达式测试代码
本资源适合刚接触Struts和Ognl的小伙伴交流学习,欢迎吐槽。
NULL 博文链接:https://takeme.iteye.com/blog/1668255
最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然...
struts2 ognl 表达式 jsp
struts2标签和OGNL表达式.pdf
ognl表达式在struts中的用法解析
1、 理解Struts2的类型转换类型 2、 理解局部类型转换器与全局类型转换器的区别 3、 掌握Struts2的自定义类型转换 4、 理解OGNL表达式语言