(1)访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。
(2) 用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。
(3) 用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
$符号主要有两个方面的用途。
(1) 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
(2) 在Struts 2框架的配置文件中引用OGNL表达式,例如:
<validators>
<field name="intb">
<field-validator type="int">
<param name="min">10</param>
<param name="max">100</param>
<message>BAction-test校验:数字必须为${min}为${max}之间!</message>
</field-validator>
</field>
</validators>
struts2中怎样来应用OGNL?
在struts2中,valuestack就是根对象,在struts2的任何流程中,valueStack中的最顶层对象一定是action对象。
有时候会用到%{#person.id}这种符号的使用:
原因是:struts2的<s:property/>标签可以自动把其中的值当做ognl表达式来处理,其它的一些标签如:<s:a href="">,href中的值就不会将其中的字符串当做ognl表达式来处理,他只会当做普通的字符串来处理,如果我们想让其当做ognl表达式来处理时,需要用%{},包裹起来。<s: a href="abc.action?id=%{#person.id}">
struts2中的标签中哪些会是自动当做ognl表达式来处理的呢?
可以有如下的方法来检验:在<s:property value="%{name}">,可以在value上面用%{}包裹起来,如果值没有变化,就证明是当做ognl来处理的。
总结:关于struts2标签库属性值的%与#的关系:
如果标签的属性值是ognl表达式,那么无需加上%{}
如果标签的属性值字符串类型,那么在字符串中凡是出现的%{}都会解析成ognl表达式,解析完毕之后再与其他的字符串进行拼接构造出最后的字符串值。
我们可以在所有的属性值上加%{},这样如果该属性值是ognl表达式,那么标签处理类就会将%{}忽略掉。(struts2中所有的标签都可以处理ognl表达式,不行的就加%{}嘛)