【重温】_Struts2重温笔记,要点概述_OGNL表达式【二】

10.OGNL表达式

(1) 访问值栈value Stack Contents

使用#读取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 范围 ,查找属性,找到为止(不建议使用)

假设action中,有User Cat Dog对象,m方法
有User对象,user有age属性;有Cat对象,cat里有Dog对象,dog里有name属性
访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%>
访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/>
访问值栈中对象的普通方法:<s:property value="password.length()"/>
访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" />
访问值栈中action的普通方法:<s:property value="m()" />

(2) 访问静态成员

在实际的开发中像页面的参数传递是绝对拒绝使用硬编码的,最好的解决方式有2种:
一种是写在国际化配置文件中;另外的一种就是建立一个类,专门维护静态成员,所有硬编码的地方都调用它就可以了。

struts2 中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
设置之后就可以用以下的表达式来访问静态成员了。

表达式格式:@[类全名(包括包路)]@[方法名 |  值名]

public class S {
	public static String STR = "STATIC STRING";
	
	public static String s() {
		return "static method";
	}
}

访问静态方法:<s:property value="@com.exercise.struts2.ognl.S@s()"/>
访问静态属性:<s:property value="@com.exercise.struts2.ognl.S@STR"/>
访问Math类的静态方法:<s:property value="@@max(2,3)" /> [ 特殊用法,只能访问Math这个类,可以忽略 ] 
访问普通类的构造方法:<s:property value="new com.exercise.struts2.ognl.User(8)"/>

(3) 访问集合

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.假设action中有list<Object>,set<Object>,map<Object,Object>
访问List:<s:property value="list"/>
访问List中某个元素:<s:property value="list[1]"/>
访问List中元素某个属性的集合:<s:property value="list.{age}"/>
访问List中元素某个属性的集合中的特定值:<s:property value="list.{age}[0]"/> | <s:property value="list[0].age"/>
访问Set:<s:property value="set"/>
访问Set中某个元素:<s:property value="set[1]"/>
访问Map:<s:property value="map"/>
访问Map中某个元素:<s:property value="map.dog101"/> | <s:property value="map['dog101']"/> | <s:property value="map[\"dog101\"]"/>
访问Map中所有的key:<s:property value="map.keys"/>
访问Map中所有的value:<s:property value="map.values"/>
访问容器的大小:<s:property value="map.size()"/> | <s:property value="list.size"/> 

(4) 投影(过滤)

假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象
我们可以通过这样进行过滤取值
<s:iterator value="books.{?#this.price>35}"> 这样只会取到价格大于35的书籍,很好的起到了过滤的
作用,
?取出所有符合逻辑的元素
^ 取出符合逻辑的第一个元素
$ 取出符合逻辑的最后一个元素

投影(过滤):<s:property value="list.{?#this.age==1}[0]"/>      
投影:<s:property value="list.{^#this.age>1}.{age}"/>          
投影:<s:property value="list.{$#this.age>1}.{age}"/>          
投影:<s:property value="list.{$#this.age>1}.{age} == null"/>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值