本地化和参数化消息
每个Validator or Field-Validator 元素必须有一个message元素,并且message元素有一个参数--key,但是不是必须的.message元素的body中定义的就是默认的消息,如果,验证失败,就会添加到Action中.这个Key 就是国际化的时候,资源文件的key,struts2会调用TextProvider(原文这里是LocaleAware )这个接口的getText()方法来查找相应的key,因此我们的action 必须得实现TextProvider接口(原文这里是LocaleAware ,但是我看了一下源代码,应该是TextProvider接口,望各位指正),这里多说一句,要使用验证框架,我们的action必须实现ValidationAware接口,为了方便,Struts2已经提供了一个实现了上述接口的类--- ActionSupport,因此我们的Actoin只需要继承这个类就行了.这就使得我们可以本地化我们的提示信息,这个是根据我们提供的Locale 实例来进行的,不管我们提供的是何种Locale(LocaleProvider 接口提供了getLocale()方法).不管我们是用key来查找资源文件还是提供默认消息,当验证器获得消息之后,将会被压入ValueStack 栈,然后,在消息中${...}块将会被替换为${ 和 }的字符串计算出来的值,这就可以使我们来使用参数来多样化我们的消息,我们既可以用Validator中的值,也可以使用Action中的值.
注意:如果我们使用xml文件来定义验证规则的话,我们必须要避免特殊字符.例如:在表达式验证器中,我们需要使用>而不是直接使用>,如果需要知道完整的特殊字符,我们可以查阅相关的资料.
主要有以下几种:
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
当然我们也可以将消息放置在CDATA块中: <![CDATA[ " and ends with " ]]>
如:<message><![CDATA[ must be the same as the Required Validator Field if specified ]]></message>
下面是一个参数化消息的例子:
该例子中使用了IntRangeFieldValidator的最大值与最小值和Action中的bar 值.
bar must be between ${min} and ${max}, current value is ${bar}.
另一个值得注意的是,我们可以在message中使用ognl 表达式.记住这一点儿,可以使我们写出很复杂的消息哦.
看下面的例子:
<message>${getText("validation.failednotice")}! ${getText("reason")}: ${getText("validation.inputrequired")}</message>
构造一个map输出:
<message>${#{"aa":"aaa","bb","cc"}}</message>