<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    海鷗航際

    JAVA站
    posts - 11, comments - 53, trackbacks - 1, articles - 102

    Struts原理與實踐(6)

    Posted on 2005-03-23 17:58 海天一鷗 閱讀(292) 評論(0)  編輯  收藏 所屬分類: Struts專題
    本文我們來討論一下Struts中的輸入校驗問題。我們知道,信息系統有垃圾進垃圾出的特點,為了避免垃圾數據的輸入,對輸入進行校驗是任何信息系統都要面對的問題。在傳統的編程實踐中,我們往往在需要進行校驗的地方分別對它們進行校驗,而實際上需要校驗的東西大多都很類似,如必需的字段、日期、范圍等等。因此,應用程序中往往到處充斥著這樣一些顯得冗余的代碼。而與此形成鮮明對照的是Struts采用Validator框架(Validator框架現在是Jakarta Commons項目的一部分)來解決校驗問題,它將校驗規則代碼集中到外部的且對具體的應用程序中立的.xml文件中,這樣,就將那些到處出現的校驗邏輯從應用程序中分離出來,任何一個Struts應用都可以使用這個文件,同時還為校驗規則的擴展提供了便利。更難能可貴的是由于Validator框架將校驗中要用到的一些消息等信息與資源綁定有機結合在一起,使得校驗部分的國際化編程變得十分的便捷和自然。

        Validator框架大致有如下幾個主要組件:

        Validators:是Validator框架調用的一個Java類,它處理那些基本的通用的校驗,包括required、mask(匹配正則表達式)、最小長度、最大長度、范圍、日期等

        .xml配置文件:主要包括兩個配置文件,一個是validator-rules.xml,另一個是validation.xml。前者的內容主要包含一些校驗規則,后者則包含需要校驗的一些form及其組件的集合。

        資源綁定:提供(本地化)標簽和消息,缺省地共享struts的資源綁定。即校驗所用到的一些標簽與消息都寫在ApplicationResources.properity文件中。

        Jsp tag:為給定的form或者action path生成JavaScript validations。

        ValidatorForm:它是ActionForm的一個子類。

        為了對Validator框架有一個比較直觀的認識,我們還是以前面的登陸例子的輸入來示范一下Validator框架的使用過程:

        首先,找一個validator-rules.xml文件放在mystruts\WEB-INF目錄下,下面是該文件中涉及到的required驗證部分代碼的清單:

    <validator name="required"
    <!--①-->
                classname="org.apache.struts.validator.FieldChecks"
                   method="validateRequired"
             methodParams="java.lang.Object,
                           org.apache.commons.validator.ValidatorAction,
                           org.apache.commons.validator.Field,
                           org.apache.struts.action.ActionErrors,
    javax.servlet.http.HttpServletRequest"
    <!--②-->
                      msg="errors.required">
    <!--③-->
             <javascript><![CDATA[
                function validateRequired(form) {
                    var isValid = true;
                    var focusField = null;
                    var i = 0;
                    var fields = new Array();
                    oRequired = new required();
                    for (x in oRequired) {
                    	var field = form[oRequired[x][0]];
                    	
                        if (field.type == 'text' ||
                            field.type == 'textarea' ||
                            field.type == 'file' ||
                            field.type == 'select-one' ||
                            field.type == 'radio' ||
                            field.type == 'password') {
                            
                            var value = '';
    				// get field's value
    				if (field.type == "select-one") {
    				var si = field.selectedIndex;
    				if (si >= 0) {
    				value = field.options[si].value;
    							}
    						} else {
    							value = field.value;
    						}
                            
                            if (trim(value).length == 0) {
                            
    	                        if (i == 0) {
    	                            focusField = field;
    	                        }
    	                        fields[i++] = oRequired[x][1];
    	                        isValid = false;
                            }
                        }
                    }
                    if (fields.length > 0) {
                       focusField.focus();
                       alert(fields.join('\n'));
                    }
                    return isValid;
                }
                
                // Trim whitespace from left and right sides of s.
                function trim(s) {
                    return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
                }
                
                ]]>
             </javascript>
    
    </validator>


        ① 節的代碼是引用一個服務器邊的驗證器,其對應的代碼清單如下:

    public static boolean validateRequired(Object bean,
                                               ValidatorAction va, Field field,
                                               ActionErrors errors,
                                               HttpServletRequest request) {
    
            String value = null;
            if (isString(bean)) {
                value = (String) bean;
            } else {
                value = ValidatorUtil.getValueAsString(bean, field.getProperty());
            }
            
            if (GenericValidator.isBlankOrNull(value)) {
                errors.add(field.getKey(), Resources.getActionError(request, va, field));
                return false;
            } else {
                return true;
            }
    }


        ② 節是驗證失敗后的出錯信息,要將對應這些鍵值的信息寫入到ApplicationResources.properity文件中,常見的錯誤信息如下:

    # Standard error messages for validator framework checks
    errors.required={0} is required.
    errors.minlength={0} can not be less than {1} characters.
    errors.maxlength={0} can not be greater than {1} characters.
    errors.invalid={0} is invalid.
    errors.byte={0} must be a byte.
    errors.short={0} must be a short.
    errors.integer={0} must be an integer.
    errors.long={0} must be a long.
    errors.float={0} must be a float.
    errors.double={0} must be a double.
    errors.date={0} is not a date.
    errors.range={0} is not in the range {1} through {2}.
    errors.creditcard={0} is an invalid credit card number.
    errors.email={0} is an invalid e-mail address.


        ③ 節的代碼用于客戶邊的JavaScript驗證

    其次,在validation.xml文件中配置要驗證的form極其相應的字段,下面是該文件中的代碼:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation
    //DTD Commons Validator Rules Configuration 1.0//EN" 
    "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
    <form-validation>
    <formset>
    <form name="userInfoForm">
    <field property="username"
    depends="required,mask,minlength,maxlength">
    <arg0 key="logon.jsp.prompt.username" resource="true"/>
    <arg1 name="minlength" key="${var:minlength}" resource="false"/>
    <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
    <var>
    <var-name>mask</var-name>
    <var-value>^\w</var-value>
    </var>
    <var>
    <var-name>minlength</var-name>
    <var-value>2</var-value>
    </var>
    <var>
    <var-name>maxlength</var-name>
    <var-value>16</var-value>
    </var>
    </field>
    <field property="password"
    depends="required,minlength,maxlength">
    <arg0 key="logon.jsp.prompt.password" resource="true"/>
    <arg1 name="minlength" key="${var:minlength}" resource="false"/>
    <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
    <var>
    <var-name>minlength</var-name>
    <var-value>2</var-value>
    </var>
    <var>
    <var-name>maxlength</var-name>
    <var-value>16</var-value>
    </var>
    </field>
    </form>
    </formset>
    </form-validation>


        這里要注意的是:該文中的中的鍵值都是取自資源綁定中的。前面還講到了出錯信息也是寫入ApplicationResources.properity文件中,因此,這就為國際化提供了一個很好的基礎。

        再次,為了使服務器邊的驗證能夠進行,將用到的formBean從ActionForm的子類改為ValidatorForm的子類,即:
        將public class UserInfoForm extends ActionForm改為:public class UserInfoForm extends ValidatorForm

        到此,進行服務器邊的驗證工作已經一切準備得差不多了,此時,只要完成最后步驟就可以實驗服務器邊的驗證了。但大多數情況下,人們總希望把這些基本的簡單驗證放在客戶邊進行。

        為了能進行客戶邊的驗證,我們還要對logon.jsp文件做適當的修改。

        將
    <html:form action="/logonAction.do" focus="username">
    改為
        
    <html:form action="/logonAction.do" focus="username" onsubmit="return validateUserInfoForm(this)">


        在標簽后加上:
        
    <html:javascript dynamicJavascript="true" staticJavascript="true" formName="userInfoForm"/>


        最后,對struts的配置文件struts-config.xml作適當的修改:
        1、將
    <action input="/logon.jsp" name="userInfoForm"
     path="/logonAction" scope="session" type="action.LogonAction" validate="false" >
    改為
    <action input="/logon.jsp" name="userInfoForm" 
    path="/logonAction" scope="session" type="action.LogonAction" validate="true" >
    其作用是要求進行校驗

        2、將下列代碼放在struts-config.xml文件中的標簽前。其作用是將用于校驗的各個組件結合在一起。

    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames"
    	value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
    </plug-in>


        到此為止,我們的一切工作準備就緒,您可以享受自己的勞動成果了,試著輸入各種組合的用戶名和口令,看看它們的驗證效果。仔細體會你會發現,服務器邊的驗證要更全面一些,比如對password的字符長度的驗證。

        參考文獻:
    《Struts in Action》Ted Husted Cedric Dumoulin George Franciscus David Winterfeldt著
    《Programming Jakarta Struts》Chuck Cavaness著
    主站蜘蛛池模板: 中文成人久久久久影院免费观看| 亚洲依依成人精品| 久久久久久亚洲av无码蜜芽 | 中国内地毛片免费高清| 无码不卡亚洲成?人片| 亚洲av日韩av永久无码电影| 女人被弄到高潮的免费视频 | 日本高清免费不卡在线| 亚洲日韩乱码中文字幕| 全免费a级毛片免费看无码| 亚洲老熟女五十路老熟女bbw| 成年人免费观看视频网站| 亚洲成在人线aⅴ免费毛片| 国产jizzjizz免费看jizz| 黄色网址在线免费观看| 亚洲欧洲∨国产一区二区三区| 野花香高清在线观看视频播放免费 | 成人人免费夜夜视频观看| 亚洲精品无码中文久久字幕| 在线观看国产情趣免费视频| 久久精品国产亚洲av品善| 中文字幕亚洲电影| 在线观看永久免费| 91在线亚洲综合在线| 国产大片51精品免费观看| a级片免费在线播放| 亚洲成人黄色在线| 日韩在线看片免费人成视频播放| 另类小说亚洲色图| 久久国产亚洲观看| 毛片a级毛片免费观看品善网| 在线观看亚洲免费视频| 久久亚洲免费视频| 最近2019中文免费字幕| 国产高清视频免费在线观看| 亚洲酒色1314狠狠做| 免费人成在线观看视频播放| 一级毛片免费播放| 在线播放亚洲精品| 亚洲AV福利天堂一区二区三| 日本特黄特黄刺激大片免费|