精通struts2的ognl表达式

2024-02-11 17:48
文章标签 精通 表达式 struts2 ognl

本文主要是介绍精通struts2的ognl表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近的项目开发中使用了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的反射机制来实现,不过官方还是建议按照旧的方法用。

 

本文来自: 114JAVA技术网(www.114java.com) 详细出处参考:http://www.114java.com/javakaiyuankuangjia/struts2_0/201008/2527.html

这篇关于精通struts2的ognl表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700435

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌