首页 > 其他分享 >精通struts2的ognl表达式

精通struts2的ognl表达式

时间:2023-04-26 12:32:04浏览次数:34  
标签:访问 fib OGNL struts2 ognl 集合 表达式


精通struts2的ognl表达式

[code]

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的反射机制来实现,不过官方还是建议按照旧的方法用。
[/code]

标签:访问,fib,OGNL,struts2,ognl,集合,表达式
From: https://blog.51cto.com/u_16087012/6226902

相关文章

  • 左值、左值表达式、左值引用 C++
     本文topics什么是左值和右值什么是左值表达式、右值表达式引用的分类之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。左值和右值左值:左值是一个对象或变量,可以代表......
  • 正则表达式(补
    1.限定符a*:表示a重复0次及以上a+:表示a重复1次及以上a?:表示a重复0次或1次a{n}:表示a重复n次a{n,}:表示a重复n次或更多次a{n,m}:表示a重复n到m次注:如果需要判断字符串的重复:(字符串)限定符2.或运算符"|"eg.a(cat|dog):匹配的字符串是acat或adog3.字符类我们想匹配由a、b、c......
  • Lambda表达式
    1、Lambda表达式初步认识java是一个面向对象的语言,而Lambda表达式却是一个匿名函数,因此java把Lambda表达式抽象成一个匿名内部类(jdk中没有抽象出来,但是它是一个匿名内部类的实现,在下面的截图中,很明显可以看到是一个内部类的地址为了证实如上所说,我就随手写了一个lambda表达式,来......
  • JavaScript 正则表达式
    基本使用 //定义正则表达式 constreg=/^\d{4}-\d{1,2}-\d{1,2}$/; conststr="2020-11-11"; //验证字符串是否符合规则 reg.test(str);元字符^表示开始部分等于xxx$表示结束部分等于xxx[]表示字符串中存在中括号中定义的字符,可以使用连字符,如a-z表示可以匹......
  • 简化代码————匿名内部类,正则表达式,Lambda
         正则表达式     错误示范     ......
  • JS-数学表达式正则表达式支持(包含希腊字母、小数点等)
    //技术状况规则/**evt:{target:{value:''}},row:{"propName":"""propRule":""}*/functioncheckRule(evt,row,propName,propRule){//匹配a=5,a>5,a<5,a≤6,a≥5等varrule1=/[ΆΈ-ώa-zA-z]+([1-9]......
  • 身份证号和手机号正则表达式脱敏
    /***身份证号脱敏*脱敏规则:保留前六后三,适用于15位和18位身份证号*@paramidNumber*@authorcy*@since2022-04-22/publicstaticStringdesensitizedIdNumber(StringidNumber){if(StringUtil.isStrNotEmpty(idNumber)){if(idNumber.length()==15){idNu......
  • go模拟三元表达式最简单的方式
    众所周知,Go语言本身并没有提供内置的三元表达式,但是我们可以使用一些技巧来模拟实现。下面是使用最短的代码实现Go的三元表达式:packagemainimport"fmt"funcmain(){x:=10y:=20max:=map[bool]int{true:x,false:y}[x>y]fmt.Println(max)}......
  • java程序new对象后加大括号{},匿名类,闭包,lamda表达式相关
     这种在源码中经常出现,所以我拿出来说一说步骤1 new一个匿名子类对象    我姑且叫这种情况为“匿名子类”吧,就是有这样的情况,你new一个类的时候直接加一对花括号,实际上已经创建了它的一个匿名子类。老实说,我第一次见到这种写法也是懵逼的。比如我有一个父类publicc......
  • 【转载】PHP 箭头函数( Lambda表达式 )
    参考箭头函数(php官方中文文档)Laravel10集合--learnku环境软件/系统版本说明windows10php8.2.5-nts-Win32-vs16-x64箭头函数要求>=7.4.0备注如果需要详细了解,请点击本文参考内的官网链接,本文只是简单记录浏览learnku中文Laravel文档的时候......