首页 > 编程知识 正文

ognl表达式和el表达式,singletonlist的作用

时间:2023-05-04 17:27:12 阅读:177231 作者:2490

自转:傲慢的迷你裙

虽然最近的项目开发中使用了struts2的框架,但是很多人不知道struts2标签的具体使用方法。 要完全掌握struts2标签的使用方法,首先要熟悉struts2的OGNL的使用方法。 struts2中能理解很多东西就好了,只有OGNL内容很少,但必须要确实精通。 这是学习struts2的基础。

Struts2内置了对OGNL表达式的支持,Struts2的功能比Struts1具有更强的数据访问功能。 本文主要是讲解OGNL的使用方法,而不是讲解原理,想了解的朋友可以自己查阅相关资料

OGNL的使用主要分为以下几个部分进行说明。 1 .使用1.ognl访问对象(取不同范围的值) )。

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

3.OGNL访问静态成员(如何访问静态成员) ) ) ) )。

4. lambda表达式,对OGNL使用简单的函数和OGNL总结(总结后,详细理解Struts2标签的使用) ) ) )。

一.使用OGNL访问对象

读取struts2的值堆栈的值

在struts2中导入了ValueStack的概念,在struts2中,默认情况下ValueStack被用作OGNL的StackContext的根要素

OGNL在读取根要素时可以直接读取

假设动作中有

私有cat cat; private Dog dog; 两个对象,那么如何在jsp页面上读取

s : property value=' cat.name ' /读取cat的name属性值

s : property value=' Dog.name ' /读取dog的name属性值

使用2#指定parametersrequestsessionapplication范围中的值(

相当于s : property value=' # request.id '/request.getattribute '

相当于s : property value=' # parameters.id '/request.getparameter '

相当于s : property value=' # session.id '/session.getattribute '

相当于s : property value=' # application.id '/application.getattribute (' id )

s :属性值=' # attr.id '/pagecontexthttpservletrequesthttpservletcontext按顺序搜索属性,直到找到

二. OGNL的集合操作

1制作藏品

直接制作{e1,e2,E3}list型的集合

#{Key1:Value1,key 2: value2}构建地图类型的集合

使用: s : set name=' sex ' value=' # { '1' : '男','2': '女' }/

在s : property value=' # sex [ id ] '/value stack的范围内找到id的值,并将其作为key寻找对应的

显示为value

2 OGNL元素符号

对于集合,OGNL提供两个元素符号: in和not in。 其中,in确定元素是否位于指定的集合中。 非输入用于以下目的

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

判断对象是否存在于List中:

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

muhahaha

/s:if

s :错误

style="margin:0cm 0cm 0pt">      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的反射机制来实现,不过官方还是建议按照旧的方法用。

   这一节就先到这里,本人能力有限难免会有纰漏,欢迎指教,过几天放出本人总结的struts2标签的使用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。