二、我们再来详细讨论一下各个文件中的细节问题
在struts-config.xml文件的<action>标签里面有一个attribute属性,它的值对应了自己的验证文件validation.xml中<formset><form name=...>的值,如果没有设置attribute,则validation.xml文件中<form name的值应该为struts-config.xml文件中对应的<form-bean>的name属性值。
在validation.xml文件是我们自己编写的验证文件,用<form>定义了我们需要验证的表单,用<field>定义了某单元素要使用的验证方法,而在<field>中,我们使用子节点<msg>来定义需要发送给页面的错误信息。格式为:
<msg name=”required” key=”myRequired” />
在这里name指定了该条消息是针对哪一个验证规则的,它对应了<field depends=的值。key指定了消息的内容,这要从我们的资源文件ApplicationResources.properties中查找相应信息,如果找不到则为空。把上面的消息节点加入<field>节点内,然后在资源文件中加入:
myRequired = myMsg: {0} is required;
这样,验证错误时就会在页面显示自己希望的错误信息,如下图:
如果在我们没有用<msg>指定消息,那么程序会使用默认的消息,我们在验证规则文件中可以查看到消息关键字,例如:
<validator name="required"
……
msg="errors.required">
这里,msg指定了required验证所使用的默认消息的关键字,相当于<msg>标签中的key=”errors.required”,所以只要我们在资源文件中加入:errors.required=......这样格式的语句,就可以显示默认的消息了。
资源文件中的{0}是占位符,可以用我们希望的内容来替换掉它使得内容灵活,可以使用多个占位符:{1}、{2}、{3}。要替换掉占位符时需要添加<arg0 />、<arg1 />等标签。
在上面的消息中我们使用了一个占位符{0},所给<field>节点加入子节点:
<arg0 name=”required” key=”myArg” resource=”true”/>
name指定了要替换占位符的消息,key指定了替换内容,resource默认为true,表示key对应的内容需要从资源文件中查找,如果没有找到返回空。如果设置resource=”false”,则表示key对应的内容需要从validation.xml文件中查找。将上一句<arg0 ……/>加入到<field>节点中,然后在资源文件中加入语句:
myArg = myArgument;
运行login.jsp,得到如下界面:
可以看到消息内容中原本{0}的地方被myArgument所替代了。
当<arg0 …/>中设置resource=”false”时,我们需要在validation.xml文件中查找key对应的内容。
如果key的值是普通字符串,则直接用这个字符串代替占位符。我们把先前的validation.xml文件中<arg0>标签的resource设置为false,其他无改动,则页面变化为:
如果把之前的key的格式修改为key=”${var:myArg}”,则表示我们要在自己定义的变量中查找myArg对应的值。
我们给<field>节点中加入子节点<var>,具体如下:
<var>
<var-name>myArg</var-name>
<var-value>user's name</var-value>
</var>
这样以来就会用user’s name来替换掉占位符:
如果没有在当前<field>下找到var-name符合的<var>节点,则用key的值,也就是${var:myArg}替换占位符,如下:
我们不仅可以在每一个<field>内设置子节点<var>来供<arg0 />等来引用,还可以设置全局量供所有表单引用。
在validation.xml文件的根结点<form-validation>下加入:
<global>
<constant>
<constant-name>conName</constant-name>
<constant-value>conValue</constant-value>
</constant>
</global>
并且修改<arg0 />中key的值为key=”${conName}”,则程序会用conValue来代替占位符:
如果找不到key的值中conName对应的<constant>节点,则会直接使用key的值替换占位符:
除此之外,${var:myArg}和${conName}也可以出现在<var>节点中<var-value>的内容中。
三、我们在来讨论一下如何使用更复杂的验证。
当需要在表单的某个字段上使用多个验证规则的时候,我们就需要将这些规则全部加入到<field>标签的depends=””之中,并且用逗号分隔,例如:
我们修改前面的validation.xml文件后内容如下:(这里只是有变化的部分的代码)
<field property="name" depends="required,minlength">
<msg name="required" key="myRequired" />
<msg name="minlength" key="myMinlength" />
<arg0 key="${var:myArg}" resource="false"/>
<arg1 name="minlength" key="${var:minlength}" resource="false"/>
<var>
<var-name>myArg</var-name>
<var-value>user's name</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
<field property="password" depends="required">
</field>
分析上面的代码,我们对表单的name字段使用了两种验证规则,一个是required(不可为空),一个是minlength(最小串长度),并且对每种验证使用了不同的错误消息:myRequired和myMinlength,我们通过<msg>的name标签属性来分配的。接着我们对消息中的占位符进行配置,<arg0 />中没有设置name标签属性,所以它的配置是对两个验证规则的错误消息都有效的。而<arg1/>中设置了name=”minlength”属性,这个参数配置只对minlength验证的错误消息有效。这里要注意的一个地方是我们在设置串的最小长度限制参数<arg1/>的时候,使用了key=”${var:minlength}” resource=”false”,这个形式十分重要,是固定不能改动的。