10.3 配置方式下實現用戶輸入驗證
前面所介紹的基於編碼方式對用戶輸入數據進行驗證,這種方式下當需要驗證的字段較多,Action類的代碼會變得臃腫。細細看來代碼重複度較大。10.2種用戶註冊的驗證規則寫的也不完全,如果完整的進行編寫這樣的驗證代碼變成了體力活。Struts2框架中內置了驗證框架。我們不必進行編碼,可以利用配置的方式實現用戶輸入驗證,從而減少編碼量提高開發效率。
默認情況下,Struts2的驗證框架是開啓的。該驗證框架是由攔截器validation來調用的。defaultStack攔截器棧中已經包含該攔截器。因此,使用Struts2的驗證框架無需額外配置。只需要提供正確的輸入驗證配置文件就可以進行驗證。
本節仍然沿用10.2.1的用戶登陸功能案例,如果在編寫用戶登陸功能時,添加用戶輸入驗證。該驗證內容包含:用戶名不能爲空;密碼不能爲空;密碼長度必須在6到12位之間。如果用戶輸入驗證錯誤,則在原頁面上顯示錯誤信息,如果用戶輸入驗證正確,則跳轉到登陸成功頁面,並顯示“xxx,您好”的信息,其中xxx爲用戶輸入的用戶名。此處用戶輸入驗證使用配置文件實現。
實現該功能程序結構圖,本節中的代碼實現與圖10-1相比僅修改LoginAction類中的代碼實現,並在類所在的包下增加LoginAction-validation.xml文件,該配置文件用於驗證用戶輸入。
如下圖所示:
圖10-5 配置方式下用戶登陸代碼結構
修改後的LoginAction類,去掉了用戶輸入驗證代碼。具體代碼如下圖所示:
packagecom.study.erp.action;
importcom.opensymphony.xwork2.ActionSupport;
public class
LoginActionextends ActionSupport{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute(){
return "success";
}
}
配置文件LoginAction-validation.xml文件用於用戶輸入驗證,該文件的內容如下所示:
<!DOCTYPE validatorsPUBLIC
"-//Apache Struts//XWork Validator1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>用戶名不能爲空.</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密碼不能爲空.</message>
</field-validator>
<field-validator type="stringlength">
<paramname="minLength">6</param>
<param name="maxLength">12</param>
<message>密碼長度應在6到12位之間.</message>
</field-validator>
</field>
</validators>
該配置文件的文件模板爲,建議使用版本爲xwork-validator-1.0.3.dtd的配置文件,其中:<validators>標記作爲該文件的根標記。
<!DOCTYPE validatorsPUBLIC
"-//Apache Struts//XWork Validator1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
……
</validators>
上面的案例中使用了字段校驗配置方式(具體的語法要求參考10.3.1中的說明),該方式的標記爲<field>,本例中基於2個字段分別是:username,password進行了驗證。驗證中使用了requiredstring,stringlength兩種驗證規則(參考10.3.2關於內置驗證規則的說明)。<message>標記中的內容是當驗證出現錯誤時,給用戶的錯誤提示信息。
10.3.1 輸入驗證配置文件
編寫輸入驗證配置文件的要求主要包括兩個方面:
1.
位置:驗證配置文件和Action類放在相同的包中
2.
命名:驗證配置文件名可以爲以下兩種:
1) ClassName-validation.xml文件
2) ClassName-alias-validation.xml文件
其中ClassName爲Action類名,alias表示在struts.xml文件中配置Action的名字。
ClassName-validation.xml配置文件對Action中的所有方法進行校驗,而ClassName-alias-validation.xml文件只對Action中特定的方法進行校驗。用於多方法的Action的輸入校驗。
程序員編寫上述說明的輸入驗證配置文件時,所有的標記的約束結構由:http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd文件指定,具體嵌套合使用的標準如下圖所示:
validators
|
field
|
validator
|
field-validator
|
param
|
message
|
param
|
message
|
|
Validators標記內可以嵌套field標記用於字段校驗器配置和validator標記用於普通校驗器配置,field標記中可以嵌套field-validator標記,field-validator標記中可以嵌套param標記和message標記。validator標記中可以嵌套param標記和message標記
Struts2提供了2種驗證器分別是:普通驗證器也叫非字段驗證器和字段驗證器。大多數情況下普通驗證器可以與字段驗證器完成相同的功能。即可以互相替換使用。但是我們多將普通驗證用於執行那些不針對特定字段的驗證規則。例如:判斷密碼和確認密碼是否一致。這兩種驗證器具體配置格式如下所示:
1. 普通驗證器配置格式:
<validator type="校驗器名">
<paramname="fieldName">需要被校驗的字段</param>
<!--此處需要爲不同校驗器指定數量不等的校驗規則-->
<param name="參數名">參數值</param>
<!--校驗失敗後的提示信息,其中key指定國際化信息的key-->
<messagekey="I18Nkey">校驗失敗後的提示信息</message>
<!--校驗失敗後的提示信息:建議用getText("I18Nkey"),否則可能出現Freemarker template Error-->
</validator>
2.字段校驗器配置格式:
<field name="被校驗的字段">
<field-validator type="校驗器名">
<!--此處需要爲不同校驗器指定數量不等的校驗規則-->
<paramname="參數名">參數值</param>
....................
<!--校驗失敗後的提示信息,其中key指定國際化信息的key-->
<messagekey="I18Nkey">校驗失敗後的提示信息</message>
<!--校驗失敗後的提示信息:建議用getText("I18Nkey"),否則可能出現Freemarker template Error-->
</field-vallidator>
<!-- 如果校驗字段滿足多個規則,下面可以配置多個校驗器-->
</field>
對於這兩種驗證器如果均出現在配置文件中,他們執行順序規則爲:
1. 所有非字段校驗風格的校驗器優先於字段校驗風格的校驗器;
2. 所有非字段校驗風格的校驗器中,排在前面的會先執行;
3. 所有字段校驗風格的校驗器,排在前面的會先執行;
在項目中經常出現某些校驗規則,前一種校驗如果發現錯誤後面的某些甚至其餘校驗則不需要執行,這時候我們需要用到短路校驗。短路校驗器:只需在<validator>或<filed-validator>元素中添加short-circuit=”true”屬性。
校驗器的短路原則:
1. 所有非字段檢驗器時最優先執行的,如果某個非字段校驗器校驗失敗了,則該字段上的所有字段校驗器都不會獲得校驗機會;
2. 非字段校驗校驗失敗,不會阻止其他非字段校驗執行;
3. 如果一個字段校驗器校驗失敗後,則該字段下且排在該校驗失敗後的檢驗器之後的其他字段校驗器不會獲得校驗機會;
4. 字段校驗器永遠不會阻止非字段校驗器的執行。
Struts2框架已經支持客戶端的校驗:將輸入頁面的表單元素改爲使用struts2標籤來生成表單,並且爲該表單增加validate="true"屬性即可。
10.3.2 內置校驗器
Struts2提供了16個內置校驗器,這些校驗器能滿足用戶的絕大部份需求。接下來我們來看一下這些內置校驗器。
校驗器名稱
|
作用
|
required
|
必填校驗器
|
requiredstring
|
必填字符串校驗器
|
int
|
整型範圍校驗器
|
long
|
長整型範圍校驗器
|
short
|
短整型範圍校驗器
|
double
|
雙精度浮點型範圍校驗器
|
date
|
日期型校驗器
|
expression
|
表達式校驗器
|
fieldexpression
|
字段表達式校驗器
|
email
|
電子郵件校驗器
|
url
|
網址校驗器
|
visitor
|
Visitor校驗器
|
conversion
|
轉換校驗器
|
stringlength
|
字符串長度校驗器
|
regex
|
正則表達式校驗器
|
conditionalvisitor
|
條件Visitor校驗器
|
表10- Struts2提供的內置校驗器
下面就這些內置的校驗器逐個進行說明:
l 必填驗證器(required)
1. 作用:required驗證器用來驗證一個參數是否不爲null。required驗證器既可以用於字段驗證器,又可以用於動作驗證器。
2. 參數及其含義
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
3. 具體用法
<validators>
<!- -普通校驗器語法 -->
<validator type="required">
<param name="fieldName">username</param>
<message>username must not be null</message>
</validator>
<!- -字段校驗器語法 -->
<field name="username">
<field-validator type="required">
<message>usernamemust not be null</message>
</field-validator>
</field>
</validators>
l 必填字符串驗證器(requiredstring)
1. 作用:requiredstring驗證器用來驗證一個字符串參數是否非空,既不爲null,且長度大於0。既可以用於字段驗證器,又可以用於動作驗證器。
2. 參數及其含義
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
trim:去掉字段的前後空格,該屬性默認值爲true
3. 具體用法
<validators>
<!- -普通校驗器語法 -->
<validator type="requiredstring">
<param name="fieldName">username</param>
<param name="trim">true</param>
<message>username is required</message>
</validator>
<!- -字段校驗器語法 -->
<fieldname="username">
<field-validatortype="requiredstring">
<param name="trim">true</param>
<message>username is required</message>
</field-validator>
</field>
</validators>
l 整數驗證器(int)
1. 作用:用於驗證字段的值必須在整數的某一範圍內。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
min用來指定可接受範圍的最小值
Ø
max用來指定可接收範圍的最大值
3. 具體用法:
<validators>
<!- -普通校驗器語法 -->
<validator type="int">
<param name="fieldName">age</param>
<param name="min">20</param>
<param name="max">50</param>
<message>Age needs to be between${min} and ${max}</message>
</validator>
<!- -字段校驗器語法 -->
<field name="age">
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<!- -${min}和${max}是引用param對應的參數值 -->
<message>Age needs to be between${min} and ${max}</message>
</field-validator>
</field>
</validators>
注意1:conversion驗證器驗證的是參數能不能被正確轉化爲整數,int驗證器是在參數已經被正確的轉化爲整數之後,再考察它的範圍。例如:如果想限制年齡文本框填入整數類型的數字,並且在18歲以上,需要先引用conversion驗證器檢查用戶填入的是否是一個整數,然後再引用int驗證器來檢查用戶填入的年齡是否大於等於18。
注意2:如果用戶未輸入數據,在提交後卻會看到該表單域的值爲0。因此在實際編程中,建議Action的屬性類型寫爲Integer
l
long 長整型,short短整型範圍校驗器
short驗證器和long驗證器與int驗證器非常相似,都是用來驗證參數是否在指定範圍之內,就不去贅述了。
l
double 雙精度浮點型範圍校驗器
1. 作用:用於驗證一個雙精度浮點型參數是否在指定的範圍內。如果一個已經被成功轉換爲double的屬性不在驗證器指定的範圍內,double驗證器就會報錯。double驗證器既可以用於字段驗證器,又可以用於動作驗證器。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
minInclusive用來指定可接受範圍的最小值,包含給定值。
Ø
maxInclusive用來指定可接收範圍的最大值,包含給定值。
Ø
minExclusive用來指定可接受範圍的最小值,不包含給定值。
Ø
maxExclusive用來指定可接收範圍的最大值,不包含給定值
3. 具體用法:
<validators>
<!- -普通校驗器語法 -->
<validator type="double">
<param name="fieldName">percentage</param>
<param name="minInclusive">20.1</param>
<param name="maxInclusive">50.1</param>
<message>Age needs to be between${minInclusive} and
axInclusive} (inclusive)</message>
</validator>
<!- -字段校驗器語法 -->
<field name="percentage">
<field-validator type="double">
<param name="minExclusive">0.123</param>
<param name="maxExclusive">99.98</param>
<message>Percentageneeds to be between ${minExclusive}
${maxExclusive} (exclusive)</message>
</field-validator>
</field>
</validators>
l
date 日期型校驗器
1. 作用:date驗證器用來驗證一個日期型參數是否在指定的範圍內。如果一個已經被成功轉換爲date的屬性不在驗證器指定的範圍內,date驗證器就會報錯。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
min用來指定可接受範圍的最小值
Ø
max用來指定可接收範圍的最大值。
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validatortype="date">
<paramname="fieldName">birthday</param>
<param name="min">01/01/1990</param>
<param name="max">01/01/2000</param>
<message>Birthday must be within ${min} and ${max}</message>
</validator>
<!-—字段校驗器語法-->
<field name="birthday">
<field-validator type="date">
<paramname="min">01/01/1990</param>
<paramname="max">01/01/2000</param>
<message>Birthday must be within ${min} and ${max}</message>
</field>
</field>
</validators>
注意:指定日期範圍的時候,需要使用統一的格式,比如用MM/DD/YYYY的格式等。
l
expression 表達式校驗器
1. 作用:表達式驗證器,是一個非字段校驗器。
2. 參數及其含義:
Ø
expression:OGNL表達式,該表達式結果必須是一個Boolean類型值。
3. 具體用法:
<!-—普通校驗器語法 -->
<validators>
<validator type="expression">
<param name="expression"> .... </param>
<message>Failed to meet Ognl Expression .... </message>
</validator>
</validators>
l
fieldexpression 字段表達式校驗器
1. 作用:指定字段表達式驗證器,是一個非字段校驗器。表達式驗證器(expression)與字段表達式驗證器(fieldexpression)類似
2. 參數及其含義:
Ø
expression:OGNL表達式,該表達式結果必須是一個Boolean類型值。
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="fieldexpression">
<param name="fieldName">myField</param>
<param name="expression"><![CDATA[#myCreditLimit >#myGirfriendCreditLimit]]></param>
<message>My credit limit should be MORE than mygirlfriend</message>
<validator>
<!-—字段校驗器語法 -->
<field name="myField">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[#myCreditLimit >#myGirfriendCreditLimit]]></param>
<message>My credit limit should be MORE than mygirlfriend</message>
</field-validator>
</field>
</validators>
注意:<![CDATA[…]]>用於某表達式包含xml的限定字符,直接使用可能會導致錯誤。
l
email 電子郵件校驗器
1. 作用:用來驗證一個參數是否爲郵箱地址。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="email">
<param name="fieldName">myEmail</param>
<message>Must provide a valid email</message>
</validator>
<!-—字段校驗器語法 -->
<fieldname="myEmail">
<field-validatortype="email">
<message>Mustprovide a valid email</message>
</field-validator>
</field>
</validators>
l
url 網址校驗器
1. 作用:用來驗證一個參數是否爲合法的URL。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="url">
<param name="fieldName">myHomePage</param>
<message>Invalid homepage url</message>
</validator>
<!-—字段校驗器語法 -->
<field name="myHomepage">
<message>Invalid homepage url</message>
</field>
</validators>
l
Visitor校驗器
1. 作用:用來驗證Action中的複合屬性,可以直接把驗證信息放到域對象中去註冊,這樣就使得同包內的不同Action在驗證同一個域對象時,不用註冊重複的驗證信息。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
context:引用的域對象驗證信息文件上下文名。
Ø
appendPrefix:是否在錯誤信息中添加<message>元素指定的前綴。
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="visitor">
<param name="fieldName">user</param>
<param name="context">myContext</param>
<param name="appendPrefix">true</param>
</validator>
<!-—字段校驗器語法 -->
<field name="user">
<field-validator type="visitor">
<param name="context">myContext</param>
<param name="appendPrefix">true</param>
</field-validator>
</field>
</validators>
l
conversion 轉換校驗器
1. 作用:conversion驗證器用來驗證類型轉換時是否出錯。例如一個類型爲int的參數接到了“18a”這個字符串,conversion驗證器就會報錯。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="conversion">
<paramname="fieldName">myField</param>
<message>Conversion Error Occurred</message>
</validator>
<!-—字段校驗器語法 -->
<field name="myField">
<field-validator type="conversion">
<message>ConversionError Occurred</message>
</field-validator>
</field>
</validators>
l
stringlength 字符串長度校驗器
1. 作用:用來驗證一個字符串的長度是否在指定範圍內。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
maxLength:字符串長度的最大值。
Ø
minLength:字符串長度的最小值。
Ø
trim:是否去掉字符串兩邊的空白,默認爲true。
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="stringlength">
<param name="fieldName">myPurchaseCode</param>
<param name="minLength">10</param>
<param name="maxLength">10</param>
<param name="trim">true</param>
<message>Your purchase code needs tobe 10 characters long</message>
</validator>
<!-—字段校驗器語法 -->
<field name="myPurchaseCode">
<field-validator type="stringlength">
<param name="minLength">10</param>
<param name="maxLength">10</param>
<param name="trim">true</param>
<message>Your purchase code needs tobe 10 characters long</message>
</field-validator>
</field>
</validators>
l
regex 正則表達式校驗器
1. 作用:用來驗證一個字符串是否符合一個正則表達式的要求。
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
expression:必填參數,正則表達式。
Ø
caseSensitive:是否檢查大小寫。
Ø
trim:是否去掉字符串兩邊的空白,默認爲true。
3. 具體用法:
<validators>
<!-—普通校驗器語法 -->
<validator type="regex">
<param name="fieldName">myStrangePostcode</param>
<param name="expression">
<![CDATA[([aAbBcCdD][123][eEfFgG][456])]]>
</param>
</validator>
<!-—字段校驗器語法 -->
<field name="myStrangePostcode">
<field-validator type="regex">
<param name="expression">
<![CDATA[([aAbBcCdD][123][eEfFgG][456])]]>
</param>
</field-validator>
</field>
</validators>
l
conditionalvisitor 條件Visitor校驗器
1. 作用:要求指定字段滿足Visitor校驗器的要求
2. 參數及其含義:
Ø
fieldname : 字段名,如果使用字段校驗器則不需要該屬性
Ø
expression:OGNL表達式,該表達式結果必須是一個Boolean類型值。
10.3.3 自定義校驗器
雖然Struts2驗證框架提供了豐富的驗證器,但是有時候仍然不能滿足項目的需求。Struts2框架允許開發人員自定義驗證器。
開發自定義校驗器需要完成如下兩步操作:
1. 開發自定義校驗類,需要實現validate接口,如果要編寫字段校驗器,該類可以通過繼承自FieldValidatorSupport類,並重寫validate方法來實現。如果要編寫普通校驗器可以通過繼承自ValidatorSupport類,並重寫validate方法來實現。具體的驗證規則的代碼寫在該方法中實現。
2. 註冊自定義校驗器,即編寫配置文件名爲validators.xml,該文件位於源文件的根目錄下(即工具的src目錄下)。該配置文件的模板如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Config 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">
<validators>
<validator name="自定義校驗器名稱" class="自定義校驗類"/>
……
</validators>
每增加一個自定義校驗器,則在配置文件中增加一個< validator >標記,該標記包含兩個屬性。name屬性的屬性值由用戶自己命名,該值作爲自定義校驗器的名稱,class屬性值爲自定義校驗類完整的包名和類名。
用戶登錄功中,對於密碼的檢查除非空字符串的驗證外,還包括了長度必須在6到12位之間的驗證。下面我們把長度驗證自定義一個字段校驗器驗證規則來實現,該功能的代碼結構圖如下圖所示:
圖 用戶登錄使用自定義驗證規則程序結構圖
編寫該功能時用戶需要編寫和創建的文件:
文件名
|
說明
|
備註
|
Login.jsp
|
用戶登陸頁面
|
視圖
|
LoginSuccess.jsp
|
用戶登陸成功頁面
|
視圖
|
LoginAction
|
Action類
|
控制器
|
ValidationPasswordValidator
|
自定義校驗器類
|
校驗器類
|
struts.xml
|
Struts2框架的配置文件
|
配置文件
|
validators.xml
|
註冊自定義校驗器類的配置文件
|
配置文件
|
LoginAction-validation.xml
|
基於配置方式的用戶輸入驗證
|
配置文件
|
web.xml
|
項目的部署描述文件
|
配置文件
|
上述功能完成時,重點涉及到ValidationPasswordValidator類的代碼編寫,validators.xml文件的配置,LoginAction-validation.xml文件的配置。下面逐個介紹和說明各個文件的具體內容:
1.自定義校驗器類ValidationPasswordValidator的代碼如下所示:
package com.study.erp.validator;
import com.opensymphony.xwork2.validator.ValidationException;
importcom.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class ValidationPasswordValidator extends FieldValidatorSupport{
@Override
public void validate(Objectobject) throws ValidationException {
String fieldName = getFieldName();
String value =getFieldValue(fieldName, object).toString();
if(value.trim().length()<6|| value.trim().length()>12){
addFieldError(fieldName,object);
}
}
}
上述代碼,必須重寫父類的validate方法,具體的驗證規則代碼作爲該方法的方法體。其中String fieldName = getFieldName();用於獲取被驗證的字段的名字,String value=getFieldValue(fieldName, object).toString();用來獲取該字段用戶輸入的內容。如果出現錯誤則調用addFieldError(fieldName,
object);方法設置對應的字段級的錯誤信息。
2. 註冊自定義校驗器類的配置文件validators.xml的內容如下:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//ApacheStruts//XWork Validator Config 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">
<validators>
<validator name="password" class="com.study.erp.validator.ValidationPasswordValidator"/>
</validators>
上述代碼中class的值爲ValidationPasswordValidator類的完整的包名和類名,name屬性的值可以由程序員自己定義,但是注意不要和已有的驗證規則重名。雖然用戶自定義了驗證規則,但是框架提供的驗證規則仍然有效,這兩部分內容是疊加的。
3. 在驗證配置文件中使用自定義的驗證規則,使用方式與使用Struts2框架提供的驗證規則是一樣的。基於配置方式的用戶輸入驗證LoginAction-validation.xml文件的內容如下所示:
<!DOCTYPE validators PUBLIC
"-//ApacheStruts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<fieldname="username">
<field-validatortype="requiredstring">
<message>用戶名不能爲空.</message>
</field-validator>
</field>
<fieldname="password">
<field-validatortype="requiredstring" short-circuit="true">
<message>密碼不能爲空.</message>
</field-validator>
<field-validatortype="password">
<message>密碼長度應在6到12位之間.</message>
</field-validator>
</field>
</validators>