在struts中的actionform中驗證是經(jīng)常使用的,雖然也可以使用validation來(lái)進(jìn)行驗證,但是在沒(méi)有學(xué)習validation的時(shí)候就只能使用在actionform中驗證啦。
下面是我的一些想法,不知道合不合適,請大家討論一下:^_^
在現在的應用中有很多需要驗證頁(yè)面輸入的內容是不是空、是不是數字、是不是Double、是不是Int、是不是Float、是不是Email格式、是不是電話(huà)格式、是不是郵政編碼格式等等驗證,在編碼中不得不對每一個(gè)屬性進(jìn)行驗證,這些代碼都重復的。因此,如果將這些驗證的代碼放到一個(gè)父類(lèi)中,那么將會(huì )減少編寫(xiě)的代碼良,同時(shí)也能夠很好的對驗證的格式做出一個(gè)調整。比如說(shuō)如果驗證中國的郵政編碼的格式改為驗證其他國家的郵政編碼,只需要修改配置文件中的郵政編碼的正則表達式即可,不用修改代碼。下面是實(shí)現的一些分析:
1. 從Properties文件中讀取配置文件的類(lèi):
將數字、Email、電話(huà)和郵政編碼等的格式的正則表達式寫(xiě)在一個(gè)properties文件中,便于修改。其regex .properties文件的內容如下:
numberRegex ="\\d"
emailRegex = "\\S+@\\S+\\.\\S+"
postCodeRegex =" \\d\\d\\d\\d\\d"
………………
在程序中使用如下代碼進(jìn)行匹配郵政編碼的格式:
protected boolean isValidPostalCode(String str){
try{
Pattern pattern = Pattern.compile(
//從properties文件里讀入郵政編碼格式的正則表達式
PropertyReader.getValueByKey(Constants.POSTAL_CODE));
//進(jìn)行匹配,返回結果
return pattern.matcher(str).matches();
}catch(Exception e){
return false;
}
}
其他驗證均是如此。此外改方法式protected的方法,可以被子類(lèi)覆蓋、調用。
2. 其他一些驗證方法:
a) 驗證字符串是否為空的函數:
protected boolean isBlankString(String str){
if(str == null) {
return true;
}
return (str.length() == 0);
}
b) 驗證輸入內容式Double類(lèi)型的函數:
protected boolean isDouble(String str){
try{
Double.parseDouble(str);
return true;
}catch(Exception e){
return false;
}
}
其他驗證Float、Int類(lèi)型的函數同Double類(lèi)型的函數一樣,沒(méi)有什么區別。同樣他們都是protected的函數,可以被子類(lèi)覆蓋,調用。
3. 覆蓋validate()方法:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
ActionErrors tempErrors = null;
//-----------------------------------------------------
//Validate required!
///驗證輸入內容必須輸入的屬性的函數
//-----------------------------------------------------
tempErrors = validateRequired();
if(tempErrors != null){
errors.add(tempErrors);
}
//-----------------------------------------------------
//Validate postal code!
//-----------------------------------------------------
tempErrors = validatePostalCode();
if(tempErrors != null){
errors.add(tempErrors);
}
//-----------------------------------------------------
//Validate double!
//-----------------------------------------------------
tempErrors = validateDouble();
if(tempErrors != null){
errors.add(tempErrors);
}
//-----------------------------------------------------
//Validate phone!
//-----------------------------------------------------
tempErrors = validatePhone();
if(tempErrors != null){
errors.add(tempErrors);
}
//-----------------------------------------------------
//Validate state!
//-----------------------------------------------------
tempErrors = validateState();
if(tempErrors != null){
errors.add(tempErrors);
}
//-----------------------------------------------------
//Validate email!
//-----------------------------------------------------
tempErrors = validateEmail();
if(tempErrors != null){
errors.add(tempErrors);
}
………………………………
………………………………
………………………………
………………………………
………………………………
………………………………
//-----------------------------------------------------
//Validate Others
//可以實(shí)現自己與眾不同的驗證,返回一個(gè)ActionErrors對象。
//-----------------------------------------------------
tempErrors = validateOthers(mapping,request);
if(tempErrors != null){
errors.add(tempErrors);
}
return errors;
}
在該函數里面依次調用驗證不能為空的驗證方法,必須式Email格式等等的驗證函數,最后一個(gè)validateOthers()是protected函數,可以被子類(lèi)覆蓋,在子類(lèi)中實(shí)現上面沒(méi)有實(shí)現的驗證,然后在將驗證的結果ActionErrors對象返回即可。
4. validateRequired()函數的實(shí)現:
/**
* Validate required!
*驗證必須輸入的屬性
* @return ActionErrors
*/
private ActionErrors validateRequired(){
//初始化一個(gè)ActionErrors對象
ActionErrors errors = new ActionErrors();
//讀取需要進(jìn)行必須驗證的屬性列表
List properties = getRequiredPropertyList();
String propertyName = "";
String propertyValue = "";
if((properties != null)&&(properties.size()>0)){
//依次對需要驗證的屬性進(jìn)行驗證
for(int i = 0;i<properties.size();i++){
//獲取屬性名的字符串
propertyName = (String)properties.get(i);
//獲取對應屬性的輸入值
propertyValue = (String)getTheValue(propertyName);
//驗證屬性值是否為空
if(this.isBlankString(propertyValue)){
//在Struts的資源文件中定義出錯提示信息
//以“屬性名”為“key”將錯誤信息添加到errors中去。
errors.add(propertyName,new ActionMessage("stocktrack.newuser.required",propertyName));
}
}
}
//返回結果
return errors;
}
getRequiredPropertyList()是獲取必須驗證屬性列表的函數。該函數的定義如下:
protected List getRequiredPropertyList(){
return null;
}
可見(jiàn)該函數是一個(gè)protected的函數,需要子類(lèi)覆蓋。在子類(lèi)中需要將要進(jìn)行必須驗證的屬性名添加到一個(gè)List中去,然后將List返回。下面是一個(gè)實(shí)現的例子:
public List getRequiredPropertyList() {
List list = new ArrayList();
list.add("username");
list.add("password");
list.add("email");
list.add("streetAddress1");
list.add("streetAddress2");
list.add("city");
list.add("state");
list.add("postalCode");
list.add("homePhone");
list.add("workPhone");
return list;
}
這里的屬性名必須與Form類(lèi)中的屬性名相同。
討論:這里最初的想法是將getRequiredPropertyList()這一類(lèi)方法定義成為一個(gè)抽象(abstract)方法,這樣子類(lèi)中就必須實(shí)現改方法,避免忘記實(shí)現。但是在一些Form中也不一定都會(huì )要驗證所有的內容,但是程序員也必須實(shí)現那些方法,而且他們實(shí)現也是返回null即可。如果在BaseForm類(lèi)中實(shí)現了就不用做這種無(wú)用的事情了。請給予指正!
―――――――――――――――――――――――――――――――――
getTheValue(propertyName)方法是用來(lái)通過(guò)傳進(jìn)去的屬性名取出該屬性對應的屬性值,下面是改方法的實(shí)現:
private Object getTheValue(String property){
Object object = null;
Method method = null;
Class clazz = null;
String methodName = "";
//如果屬性名為空,則返回null
if(isBlankString(property)){
return null;
}
//將屬性名的第一個(gè)字母大寫(xiě),然后加上get構成屬性對應的get方法//名。
//注意:這里的屬性名的第一個(gè)字符必須是字母,否則會(huì )出錯。(請
//討論)
methodName = "get" + property.substring(0,1).toUpperCase()
+ property.substring(1,property.length());
//從methodsMap(存放方法的一個(gè)Map)里面取方法
method = (Method) methodsMap.get(methodName);
if(method == null){
//如果methodsMap中不存在方法名,則通過(guò)反射得到方法
//獲取該類(lèi)的Class對象
clazz = getClass();
try {
//
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。