本文為原創,如需轉載,請注明作者和出處,謝謝!
上一篇:
Struts1.x系列教程(9):上傳任意多個文件
一、 Validator 框架的優勢
Validator 框架是一個 Struts 插件,最初由 David Winterfeldt 設計并實現。 Validator 框架從 Struts 0.5 時代就可以使用,但那時 Validator 框架只是被捐助的一個 jar 包。 Apache 組織為了使開發人員更方便地使用 Validator 框架,決定從 Struts1.1 開始,將 Validator 框架作為 Struts 的一部分同 Struts 一起發布。
Validator 框架可以在 XML 文件中配置驗證規則和驗證對象。因此,使用 Validator 框架可以無需在 ActionForm 的子類中覆蓋 validate 方法就可以很方便地驗證客戶端的提交數據。由于 Validator 框架內置了很多預定義的驗證機制,如驗證某個屬性是否存在,驗證 EMail 是否合法等。所以在一般情況下,只需要配置 XML 文件就可以滿足我們的驗證需求。
在使用 Validator 框架時,就會發現這種方式要比直接使用 validate 方法進行驗證會給我們帶來如下的好處:
1. 更容易維護。 由于驗證信息可以被放置在同一個配置文件中,因此,我們可以更容易地來維護這些驗證信息。
2. 標準化。 由于很多簡單的驗證都是相同的。如用戶名和密碼都要求由字母、數字以及下劃下組成。如果將這些驗證都寫在 validate 方法中,對這些驗證進行標準化非常困難。而在 Validator 框架中的這些驗證機制都是預先定義的,因此,標準化相同的驗證對于 Validator 框架來說將是一件非常輕松的事。
3. 避免重造輪子。 雖然一些驗證很簡單,但如果想正確實現它們也是非常困難的。一個典型的例子是驗證 EMail 地址的格式。如果這個驗證要想完美無缺,就必須按著 RFC-2822 規范的要求來驗證 EMail 地址。而如果我們使用 Validator 框架,就無需再重造輪子來驗證 EMail 地址了。
4. 減少重復代碼的數量。 由于 Validator 框架提供了很多預定義的驗證,因此,我們可以避免自己寫很多重復的代碼進行驗證。當然,我們也可以將大量使用的驗證封裝在類的方法中,這些雖然可以避免大量的重復勞動,但這就意味著我們團隊的新成員要使用這些被封裝的驗證方法之前必須先學習它們。而最糟糕的情況是很多開發人員可能會忘記使用這些由其他成員實現的驗證庫,而自己重新編寫具有同樣功能的驗證庫。當然,這一切如果使用 Validator 框架就都可以得到解決。
5.
客戶端和服務端驗證自動切換。
我們只需要簡單地在
JSP
頁面中放一個單獨的
<html::javascript/>
元素就可以將服務端的驗證轉換為客戶端驗證(基于
JavaScript
的驗證)
雖然
Validator
框架的預定義驗證已經可以滿足大多數的驗證需求了,但在某些特殊情況下,這些預定義驗證就無法滿足我們的需求了,為此,
Validator
框架也為開發人員提供了擴展驗證機制的功能。這也使得
Validator
框架可以完成更復雜的驗證工作。
<!--[endif]-->
二、配置和使用 Validator 框架
1. 安裝 Validator 框架
由于
Validator
是
Struts
的一個插件,因此,就需要在
struts-config.xml
文件中按著
Struts
插件的方式來安裝
Validator
框架。打開
struts-config.xml
文件,在
<struts-config>
元素中加入一個
<plug-in>
子元素,如下面的代碼所示:
< set-property property ="pathnames" value ="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml" />
</ plug-in >
其中 <set-property> 元素設置了插件中使用的 pathnames 屬性的值。在 pathnames 屬性值中包含了兩個 xml 文件。
( 1 ) validator-rules.xml :在這個文件中聲明了 Validator 框架的預定義驗證。這個文件可以在 Struts 的發行包的 lib 目錄中可以找到這個文件。在使用 MyEclipse 為 Web 工程添加 Struts 功能后,會自動將這個文件加到 WEB-INF 目錄中。
(
2
)
validator.xml
:這個文件定義了要驗證的對象。實際上,在這個文件中,包含了一個或多個
ActionForm
的子類及其要驗證的屬性和驗證規則。因此,這個文件就相當于
validate
方法。在
Validator
框架中,可以有多個定義驗證對象的
xml
文件(可以將不同的
ActionForm
的子類分散到不同的
xml
文件中),中間用逗號
(,)
隔開,如下面的代碼所示:
<!--[endif]-->
< set-property property ="pathnames" value ="/WEB-INF/validator-rules.xml,/WEB-INF/validator1.xml,
/WEB-INF/validator2.xml, /WEB-INF/validator3.xml" />
</ plug-in >
2. 使用 Validator 框架的一個例子
在本節將舉一個例子來演示如何使用 Validator 框架來驗證數據。我們需要按著如下的六步來完成這個例子:
【第 1 步】 建立 FirstValidatorForm 類( ValidatorForm 的子類)
在
<samples
工程目錄
>\src\actionform
目錄中建立一個
FirstValidatorForm.java
文件,代碼如下:
import org.apache.struts.validator.ValidatorForm;
public class FirstValidatorForm extends ValidatorForm // 必須從ValidatorForm繼承
{
private Stringname;
private Stringage;
private Stringemail;
public StringgetName()
{
return name;
}
public void setName(Stringname)
{
this .name = name;
}
public StringgetEmail()
{
return email;
}
public void setEmail(Stringemail)
{
this .email = email;
}
public StringgetAge()
{
return age;
}
public void setAge(Stringage)
{
this .age = age;
}
}
要注意的是,要想使用
Validator
框架驗證數據,
Form
類就必須從
ValidatorForm
繼承,而不能從
ActionForm
繼承。這是因為
ValidatorForm
類是從
ActionForm
繼承的,在
ValidatorForm
類中已經覆蓋了
validate
方法來自動進行驗證工作,因此,我們在
ValidatorForm
的子類中就不用寫
validate
方法了。
<!--[endif]-->
【第
2
步】
建立
ValidatorAction
類(
Action
的子類)
在
<samples
工程目錄
>\src\action
目錄中建立一個
ValidatorAction.java
文件,代碼如下:
import javax.servlet.http. * ;
import org.apache.struts.action. * ;
public class ValidatorAction extends Action
{
public ActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
{
response.setCharacterEncoding( " GBK " );
try
{
response.getWriter().println( " 驗證成功! " );
}
catch (Exceptione)
{
}
return null ;
}
}
ValidatorAction
類是一個空的
Struts
動作類(除了輸出一行“驗證成功!”字符串)。這個動作是為了正常運行含有
Struts
元素的
JSP
程序所編寫的。在以后的代碼中會經常使用到這個
Struts
動作類。
【第
3
步】
配置
struts-config.xml
文件
配置 FirstValidatorForm 和 ValidatorAction 的代碼如下所示
< action name ="firstValidatorForm" path ="/firstValidator" scope ="request" type ="action.ValidatorAction" input ="/firstValidator.jsp" />
其中
firstValidator.jsp
是用戶錄入信息的界面,也是顯示錯誤信息的界面。
【第
4
步】
建立
firstValidator.jsp
在
Web
根目錄建立一個
firstValidator.jsp
文件,代碼如下:
<!--[endif]-->
< %@taglib uri ="http://struts.apache.org/tags-html" prefix ="html" % >
< html >
< head >
< title > 第一個Validator程序 </ title >
</ head >
< body >
< html:form action ="firstValidator" >
姓名:
< html:text property ="name" /> < font color ="red" >< html:errors property ="name" /></ font >< p >
年齡:
< html:text property ="age" /> < font color ="red" >< html:errors property ="age" /></ font >< p >
EMail:
< html:text property ="email" /> < font color ="red" >< html:errors property ="email" /></ font >< p >
< html:submit value ="提交" />
</ html:form >
</ body >
</ html >
從 firstValidator.jsp 中可以看出,不管是否使用 Validator 框架進和驗證,對于 JSP 代碼來說是完全一樣的。仍然是使用 <html:errors> 元素來顯示錯誤信息。但要注意,在使用 Validator 框架時, <html:errors> 標簽的 property 屬性的值就是所對應 ValidatorForm 的子類的屬性名。
【第 5 步】 配置 validator.xml 文件
在本例中只使用了一個 XML 文件 (validator.xml) 來配置要驗證的對象。 validator.xml 的代碼如下:
<!--[endif]-->
<! DOCTYPEform-validationPUBLIC
"-//ApacheSoftwareFoundation//DTDCommonsValidatorRulesConfiguration1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd" >
< form-validation >
< formset >
< form name ="firstValidatorForm" >
< field property ="name" depends ="required,maxlength,minlength,mask" >
< msg name ="required" key ="error.name.blank" />
< msg name ="minlength" key ="error.name.minLength" />
< msg name ="maxlength" key ="error.name.maxLength" />
< msg name ="mask" key ="error.name.alphanum" />
< arg name ="minlength" key ="${var:minlength}" position ="0" resource ="false" />
< arg name ="maxlength" key ="${var:maxlength}" position ="0" resource ="false" />
< var >
< var-name > minlength </ var-name >
< var-value > 5 </ var-value >
</ var >
< var >
< var-name > maxlength </ var-name >
< var-value > 10 </ var-value >
</ var >
< var >
< var-name > mask </ var-name >
< var-value > ^[a-zA-Z0-9]*$ </ var-value >
</ var >
</ field >
< field property ="age" depends ="required,integer,intRange" >
< msg name ="required" key ="error.age.blank" />
< msg name ="integer" key ="error.age.integer" />
< msg name ="intRange" key ="error.age.intRange" />
< arg name ="intRange" key ="${var:min}" position ="0" resource ="false" />
< arg name ="intRange" key ="${var:max}" position ="1" resource ="false" />
< var >
< var-name > min </ var-name >
< var-value > 18 </ var-value >
</ var >
< var >
< var-name > max </ var-name >
< var-value > 60 </ var-value >
</ var >
</ field >
< field property ="email" depends ="required,email" >
< msg name ="required" key ="error.email.blank" />
< msg name ="email" key ="error.email.invalid" />
</ field >
</ form >
</ formset >
</ form-validation >
validator.xml 文件中的所有配置都放到 <form-validation> 元素中。在 <form-validation> 元素中有一個 <formset> 子元素,這個元素可以定義多個 <Form> 元素,這個元素用來定義要驗證的 ValidatorForm 類的子類。其中 name 屬性值就是 <form-bean> 元素中的 name 屬性值。
<field> 元素用來定義某個屬性的約束條件,如第一個 <field> 元素定義了 name 屬性必須存在 (required) 、必須要滿足最小長度( minlength )和最大長度( maxlength )以及還要通過 mask 所指的正則表達式的驗證。
<msg> 元素用來定義出錯信息在屬性文件中的 Key (所有的出錯信息都在屬性文件中)。 <arg> 元素用來向出錯信息中的參數傳遞參數值。 <var> 元素用來定義變量名和變量值。
【第
6
步】
在
ErrorDescription.properties
文件中添加錯誤信息
打開
ErrorDescription.properties
文件,在文件的后面添加如下的內容:
error.name.minLength = 姓名的長度不能小于{ 0 }
error.name.maxLength = 姓名的長度不能大于{ 0 }
error.name.alphanum = 姓名必須由字母和數字組成
error.age.blank = 年齡不能為空
error.age.integer = 年齡必須為數字
error.age.intRange = 年齡必須在{ 0 }和{ 1 }之間
啟動Tomcat,在IE中輸入如下的URL來測試程序:
http://localhost:8080/samples/%20firstValidator.jsp
在輸入一些錯誤信息后,點擊“提交”按鈕,將出現類似下圖的效果。

下一篇: Struts1.x系列教程(11):Validator驗證框架高級應用
國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!
《銀河系列原創教程》 發布
《Java Web開發速學寶典》 出版,歡迎定購
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
