1,OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts 2框架使用OGNL作为默认的表达式语言。
2,ognl与El不同的地方有:比如ognl可以支持对象方法的调用,静态方法的调用,对集合的投影等功能
3,Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图
当struts2接收到请求的时候,会迅速的创建ActionContext, ValueStack, action , 然后会把Action放入到ValueStack中,所以action的实例变量就会被访问到了
4,ognl表达式要结合<s:property value=””/>标签才能使用
1,访问Action中的普通属性:<s:property value="username"/> | ${username }<br/>
<!-- 访问parameters,request,session,application,attr的时候以#开头
,加上范围,但是如果访问的是值栈的话,那么不需要可以直接访问
-->
2,访问URL中的参数: <s:property value="#parameters.username"/><br/>
3,访问request中的属性:<s:property value="#request.sex2"/><br/>
4,访问Action中的对象的属性:<s:property value="person.id"/>||<s:property value="person.name"/><br/>
5,访问Action中对象中对象的属性:<s:property value="person.friend.dname"/><br/>
6,访问Action中的普通方法:<s:property value="greeting()"/><br/>
7,访问Action中的对象的普通方法:<s:property value="person.sayHello()"/><br/>
<!-- 如果要访问静态的方法,需要在strut中设置一个常量:struts.ognl.allowStaticMethodAccess为true ,访问的方法为@全类名@方法名()-->
8,访问Action中的静态方法:<s:property value="@hwt.action.OgnlAction@staticMethod()"/> <br/>
9,访问其他对象的静态方法:<s:property value="@hwt.service.OgnlService@getDname()"/><br/>
10,访问其他对象的静态方法返回的对象的属性:<s:property value="@hwt.service.OgnlService@getDog().dname"/><br/>
<!-- 要将静态的属性设置为public -->
11,访问静态的属性:<s:property value="@hwt.service.OgnlService@str"/><br/>
12,访问Math的方法:<s:property value="@@max(2,3)"/> <br/>
-------------------------------<br/>
<!-- 需要注意的是在ognl表达式中,{}代表的是一个集合 -->
13,访问list:<br/>
list: <s:property value="list"/><br/>
list中的一个对象:<s:property value="list[0]"/><br/>
list中某个属性的集合:<s:property value="list.{dname}"/><br/>
list中的一个对象的属性:<s:property value="list[0].dname"/><br/>
循环list:<s:iterator value="list"var="l">
<s:property value="#l.dname"/>
</s:iterator><br/>
<s:iterator value="strs" var="s"status="st">
<font color=<s:if test="#st.odd">red</s:if><s:else>black</s:else>><s:property value="#st.index"/>,<s:property value="s"/></font>
</s:iterator><br/>
-------------------------------<br/>
set集合和list集合一样的<br/>
-------------------------------<br/>
14,map集合:<br/>
map: <s:property value="map"/> <br/>
map中某一个对象:<s:property value="map.key1"/><br/>
map中所有的key:<s:property value="map.keys"/><br/>
map中所有的值:<s:property value="map.values"/><br/>
循环map:<s:iterator value="map" status="s">
<s:property value="key"/>-<s:property value="value"/>
</s:iterator><br/>
15,集合的个数:<br/><s:property value="map.size()"/>
<s:property value="list.size"/>
<br/>---------------<br/>
16,投影:
<!-- -只循环年龄=5的所有对象的名字 ,投影中:#this表示每次循环到的对象
?表示要筛选的条件
^表示满足后面条件的第一个
$表示满足后面条件的最后一个
-->
<s:iterator value="list.{?#this.age==5}”>
<s:property value="dname"/>
</s:iterator><br/>
<s:iterator value="list.{^#this.age>5}">
<s:property value="dname"/>
</s:iterator><br/>
<s:iterator value="list.{$#this.age>5}">
<s:property value="dname"/>
</s:iterator><br/>