一、使用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"/>

访问值栈中的action的普通属性: username = <s:property value="username"/>
访问值栈中对象的普通属性(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()" />
<hr />
访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>
访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>
访问Math类的静态方法:<s:property value="@@max(2,3)" />
<hr />
访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/>
<hr />
访问List:<s:property value="users"/>
访问List中某个元素:<s:property value="users[1]"/>
访问List中元素某个属性的集合:<s:property value="users.{age}"/>
访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/>
访问Set:<s:property value="dogs"/>
访问Set中某个元素:<s:property value="dogs[1]"/>
访问Map:<s:property value="dogMap"/>
访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/>
访问Map中所有的key:<s:property value="dogMap.keys"/>
访问Map中所有的value:<s:property value="dogMap.values"/>
访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>
<hr />
投影(过滤):<s:property value="users.{?#this.age==1}[0]"/>
投影:<s:property value="users.{^#this.age>1}.{age}"/>
投影:<s:property value="users.{$#this.age>1}.{age}"/>
投影:<s:property value="users.{$#this.age>1}.{age} == null"/>
<s:property value="[0].username"/> 可以访问<s:debug>ValueStack中第一个action 。