struts Validator是一个非常优秀的验证框架,但是在使用过程中我发现它对Struts多模块下多国语言资源访问很不到位。
一、struts Validator下使用多模块的多国语言资源
在struts中如果有一个模块modelA,我们给其一个单独的Struts-config配置文件struts-config-modelA.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans>
<form-bean name="ordersForm"
type="modelA.OrdersForm" />
</form-beans>
<global-exceptions />
<global-forwards></global-forwards>
<action-mappings>
<action name="ordersForm"
path="/webapp/orders/ordersAction" scope="request"
type="modelA.OrdersAction">
</action>
</action-mappings>
<message-resources key="business"
parameter="modelA.BusinessResources" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/config/test-validation.xml,
/WEB-INF/config/validation.xml" />
</plug-in>
</struts-config>
其中我们定义了一个简单得form、Action以及一个key为business的多国语言资源,并注册了验证框架,它使用/WEB-INF/config/test-validation.xml文件记录要验证的form的配置。
然后我们要在test-validation.xml定义ordersForm:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="ordersForm">
<field property="orderName" depends="required">
<arg0 key="orders.orderName" />
<msg key="errors.required" name="required" bundle="business"/>
</field>
<field property="orderDes" depends="required">
<arg0 key="orders.orderDes" />
<msg key="errors.required" name="required" bundle="business"/>
</field>
<field property="addUser" depends="required">
<arg0 key="orders.addUser" />
<msg key="errors.required" name="required" bundle="business"/>
</field>
<field property="addTime" depends="required">
<arg0 key="orders.addTime" />
<msg key="errors.required" name="required" bundle="business"/>
</field>
</form>
</formset>
</form-validation>
大家可以看到在每个field中我们多定义了一个<msg key="errors.required" name="required" bundle="business"/>,这个就是定义当前模块的required验证绑定到哪一个资源文件,这里我们绑定到business。
最后我们要在jsp中为每一个字段定义验证输出标记:
<html:errors property="orderName" bundle="business"/>
这样就可以实现多个模块下的独立多国语言配置。
大家也看到了,上面的步骤虽然不是很复杂,但每一个field都要定义一次msg,是一件多么烦人的事情啊。我希望解除每一个field中的msg,转而在struts-config配置中定义ValidatorPlugin的时候注册资源绑定就可以了。因此我决定改造Validator。且听下回分解:)