`
kidiaoer
  • 浏览: 818684 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

精通struts2的ognl表达式

JSP 
阅读更多
精通struts2的ognl表达式


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的反射机制来实现,不过官方还是建议按照旧的方法用。
分享到:
评论

相关推荐

    精通Struts 2:Web 2.0开发实战

    《精通Struts 2:Web 2.0开发实战》这本书是Java Web开发领域的一本经典教程,专注于Struts 2框架的应用与实践。Struts 2作为一款强大的MVC(Model-View-Controller)框架,是Java EE平台上的重要组成部分,它极大地...

    精通Struts(孙卫琴).zip

    - Struts2是Struts的下一代版本,引入了更多特性,如OGNL表达式语言、拦截器(Interceptor)机制,以及更丰富的插件体系。 9. **最佳实践**: - 分层架构:按照业务逻辑、数据访问和表示层进行分离,保持代码结构...

    精通struts代码2

    Struts2是一款强大的Java Web开发框架,由Apache软件基金会维护...在研究源代码时,注意观察Action、Interceptor、Result和配置文件的交互,以及如何通过OGNL表达式来绑定数据,这将有助于你更好地理解和应用Struts2。

    Struts2视频教程

    Struts2内置了对OGNL的支持,可以方便地在JSP页面中使用OGNL表达式获取模型数据。 - **标签库**:Struts2提供了丰富的标签库,可以帮助开发者快速构建表单和页面元素,提高开发效率。 - **拦截器**:拦截器是Struts2...

    精通struts代码部分jar包

    4. **OGNL表达式**:用于在视图层和模型层之间传递数据,支持复杂的对象导航和运算。 5. **Struts2插件**:丰富的插件库,如Struts2-dojo-plugin用于Ajax交互,Struts2-json-plugin支持JSON数据交换等。 6. ** strut...

    精通Struts2(最新总结)

    六、OGNL表达式语言 1. OGNL(Object-Graph Navigation Language):Struts2中的默认表示层语言,用于在Action与视图之间传递数据,实现动态绑定。 七、Tiles插件 1. Tiles:Struts2的Tiles插件提供了一种组件化...

    精通struts2 Java框架 实例

    6. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为表达式语言,用于在Action和视图之间传递数据。OGNL可以方便地访问对象属性,甚至执行复杂的表达式。 7. **插件和自定义组件**:Struts2具有...

    Struts2入门到精通教程.zip

    通过这个"Struts2入门到精通教程",你将能够从零开始学习如何创建一个简单的Struts2应用,逐步深入到使用拦截器、OGNL、Tiles和异常处理等高级特性,最终达到精通Struts2框架的目标。在学习过程中,不断实践和理解每...

    struts2从入门到精通总结(备忘)

    值栈也支持OGNL表达式,使得在JSP中可以方便地访问Action属性、模型对象、甚至集合元素。 六、拦截器(Interceptor) 拦截器是Struts2的一大特色,它可以对Action执行前后的操作进行拦截和处理。常见的拦截器有: 1...

    Struts架构指导,精通Struts技术

    此外,Struts2是Struts的后续版本,引入了更多现代Web开发的特性,如拦截器、注解配置、OGNL表达式等,提高了开发效率和灵活性。但这里主要讨论的是基础的Struts架构。 总之,掌握Struts技术意味着你能够熟练地构建...

    精通Struts技术

    7. ** strut2-core库**:Struts 2是Struts的升级版,它引入了许多新特性,如拦截器、OGNL表达式语言等。尽管标题提及的是"精通Struts技术",但了解其后续版本Struts 2也是有益的。 8. **拦截器**:Struts 2中的拦截...

    精通struts技术.rar

    11. **Struts2的升级**:尽管Struts1已经非常成熟,但随着技术的发展,Struts2引入了更多新特性,如拦截器(Interceptors)、OGNL表达式语言等,使得Struts框架更加强大和灵活。 通过这个“精通struts技术.rar”...

    电子书-精通Struts基于MVC的WEB设计与开发.rar

    除此之外,Struts2是Struts的后续版本,它引入了更多现代Web开发的最佳实践,如拦截器栈、OGNL表达式语言等。尽管本书可能主要关注Struts1,但理解这两个版本的异同对于全面掌握MVC框架至关重要。 总之,《精通...

    孙卫琴-精通Struts源代码

    9. **Struts 2的升级**:Struts 2是Struts的后续版本,它引入了更多现代的Web开发特性,如OGNL表达式语言,更强大的拦截器,以及对Spring和iBatis等其他框架的更好集成。 10. **性能优化**:通过对Struts配置的调整...

    精通Struts基于MVC的Java Web设计与开发

    11. ** strut2升级**:Struts2是Struts的后续版本,它引入了更多新特性,如拦截器(Interceptor)、OGNL表达式语言等,使得开发更加灵活高效。 学习并掌握这些知识点,对于Java Web开发者来说至关重要,能够帮助...

    精通struts.基于MVC的.java.web设计与开发.zip

    12. **Struts2**:Struts的后续版本Struts2引入了更多现代Web开发特性,如OGNL表达式语言,更强大的拦截器,以及与Spring、Hibernate等更紧密的集成。 以上只是对Struts框架基础知识的简要介绍,实际的《精通struts...

    精通struts:基于MVC 的java+web设计与开发

    9. ** strut2 框架**:虽然书名提到的是Struts,但Struts2是其后续版本,引入了更多新特性和改进,如OGNL表达式语言、拦截器栈等,使得Struts2在处理复杂业务逻辑时更为灵活。 10. **实战案例**:书中应包含多个...

Global site tag (gtag.js) - Google Analytics