WebWork的标签语法非常容易理解,为了快速开始,所有你需要知道的就是所有的属性最初都是被设置为字符串的.然后它们会解析 %{ ... } 语法,任何大括号之间的内容都会基于value stack求值.
 | 升级事项! 标签语法不总是这么简单 – 如果你从 WebWork 2.1.7 或者前面的版本升级过来的,你可能希望阅读一下 Alt Syntax. |
就像生活里的其他事情,它原来并不是十分 那么 简单.明确地说,实际上有3个规范你要知道:
- 所有 String 属性类型的都会 解析 %{ ... } 中间的字符.
- 所有 非字符串 属性类型都 不 会解析,但是会直接被当作一个OGNL表达式求值.
- 对第二个规则的例外情况是如果 非字符串 属性以 %{ 开始并以 } 结束, 这些字符在对表达式求值之前会被截取出来.
理解这些规则的最好方法就是查看一些例子.
 | 我们承认这些规范可能令人糊涂.通常情况下,你根本不需要知道它们,在99.9%的时间里一切事情都会"正常工作".当然,就像我们在例子里看到的,会有一些棘手的情况需要理解这些规范.在WebWork将来的版本中,会努力让标签语法更简单 |
一些例子
最简单的例子来解释标签语法如何工作就是下面的例子.这个例子仅仅演示了规则1:
<ww:textfield label="%{getText("state.label")}" name="state"/>
在这个例子里,label被动态求值,设置为OGNL表达式 getText("state.label") 的结果,这个表达式会调用国际化装置来获取i18n主键 state.label 的值.name,是一个字符串属性,简单地被设置为 state 字符串.
下一个例子演示了规则2:
<ww:select label="%{getText("state.label")}" name="state" multiple="true"/>
这个例子看起来类似前一个例子,要注意到的主要事情是 multiple 属性是 Boolean 类型的, 这意味这它符合规则2.通常你不会注意到这个,因为 "true" 会被当作OGNL表达式求值得到true,也就是你想要的.
现在让我们假设我们要扩展这个例子来演示规则3,让multiple属性变成动态的:
<ww:select label="%{getText("state.label")}" name="state" multiple="%{allowMultiple}"/>
因为这个属性是 Boolean 类型的,并且以规则3中正确的字符开始和结束,它变成表达式 allowMultiple, 并会在value stack上进行求值,返回一个true或者false,就像前一个例子一样.
无论如何要关注有一个棘手的例子.例如,下面的多半是 不正确的:
<ww:textfield label="%{getText("state.label")}" name="state" value="CA"/>
这个例子只有在如果表达式 CA 会产生某些东西时才能工作,也就是说你的action有一个 getCA() 方法,这大概不是你所期望的.这是因为 value 属性是 Object ,因此规则2会被应用.如果期望设置一个静态的字符串作为初始值,你会需要提供一个OGNL表达式来返回一个字符串.例如,这是来完成它的 正确 方式:
<ww:textfield label="%{getText("state.label")}" name="state" value="%{'CA'}"/>
同时你也可以设置value属性仅仅为 "'CA'",我们推荐使用被解析表达式的方式,因为将来当WebWork支持解析所有类型的属性时,你的代码会继续工作.
我们成人这些规范可能令人糊涂.通常情况下
应该是
我们承认这些规范可能令人糊涂.通常情况下