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。且聽下回分解:)