OGNL中重要的3个符号:#、%、$

1.#符号
#符号的用途一般有三种。

(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]。


OGNL中重要的3个符号:#、%、$_第1张图片
 
OGNL中重要的3个符号:#、%、$_第2张图片
 

 

(3)    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

 

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

$符号主要有两个方面的用途。

(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表达式,不行的就加%{}嘛)

你可能感兴趣的:(Ognl)