熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

對非String類型進行校驗時的出錯處理

2013-11-23 20:12:07  來源: Java開源技術 

關於Spring MVC對非String類型進行校驗時的出錯處理
   我在對Userage (Integer型)進行校驗時如果輸入的是字符總是出錯:
Failed to convert property value of type [javalangString] to required type [javalangInteger] for property age; nested exception is javalangNumberFormatException: For input string: ff

解決方法:
本例用的是commonsvalidator的開源框架
在Controller中加
protected void initBinder(HttpServletRequest request
       ServletRequestDataBinder binder) {     
              binderregisterCustomEditor(Integerclass nullnew CustomNumberEditor(Integerclass null true));
              binderregisterCustomEditor(Longclass nullnew CustomNumberEditor(Longclass null true));
              binderregisterCustomEditor(byte[]classnew ByteArrayMultipartFileEditor());
              SimpleDateFormat dateFormat = new SimpleDateFormat(getText(dateformat requestgetLocale()));
              dateFormatsetLenient(false);
              binderregisterCustomEditor(Dateclass nullnew CustomDateEditor(dateFormat true));
       }


在資源文件ApplicationResources_zh_CNproperties 中加:
 
userage=\ue\uf
typeMismatchjavalangInteger={}\ufc\ub\uea\ue\u\uc\u

一些朋友說在用非對象類型如int時也總是出錯但我在測試時發現不管是用int 還是用float如果不輸或輸入字符系統均會自動賦值 int為float為
 
以下是一個不錯的入門文章轉發於 jamyy的專欄:
 

 關於Spring中Commons Validator的使用說明

spring的validate驗證需要兩個bean(ValidatorFactoryBeanValidator)及兩xml文件(validatorrulesxmlvalidationxml)的支持ValidatorFactory用於制造BeanValidator後者則是在程序中執行校驗的控制beanValidatorrulesxml中定義了各種驗證的規則如字段不為空字段輸入值必須為整數等等Validationxml中則定義了那些bean及bean中的哪些屬性字段需要驗證使用哪些驗證規則validate 分為兩級驗證客戶端驗證(javascript)和服務器端驗證以下是使用validate的步驟

       在配置文件中聲明ValidatorFactory 和 BeanValidator
 

<bean id=validatorFactory class=omonsvalidatorDefaultValidatorFactory>

             <property name=validationConfigLocations>
               <list>
                      <value>/WEBINF/validatorrulesxml</value>
                      <value>/WEBINF/validationxml</value>
                 </list>
             </property>
        </bean>
        <bean id=beanValidator

class=omonsvalidatorDefaultBeanValidator>

             <property name=validatorFactory>
                     <ref bean=validatorFactory /> 
             </property>

 </bean>
 

①     聲明validatoFactory這裡我們使用spring 的DefaultValidatorFactory
②     定義其validationConfigLocations屬性將validatorrulesxml和validationxml傳入
③     聲明beanValidator這裡我們使用spring的DefaultBeanValidator
④     在其屬性中指明要使用的validatorFactory這裡我們使用剛剛定義的validatorFactory

 
       在需要進行驗證的controller(即要使用form表單或者command的controller)中聲明validate

 

<beanid=xxxxController ……>

<property name=commandName value=userCommand/> 
<property name=commandClass value=comresoftUser/>  
<property name=validator ref=beanValidator/>  

     ……
</bean>
 

①     commandName用於指明需要驗證的 command的名字這個名字必須和 validationxml中<formname= xxxxx > 所寫的名字保持一致
②     commandClass用於指定這個command的類型其必須與你jsp提交的form最後形成的command類型相一致
③     聲明該controller使用validator這裡將我們剛剛定義的beanValidator傳入進去
 

       在validationxml文件中定義你要校驗的formbean(或者說是command)定義這個bean中有哪幾個field需要驗證使用何種規則驗證(注意這裡定義的form name 必須和前面controller中定義的commandName保持一致)以下是幾種常用的驗證示例

 
<formvalidation>

<formset>

<form name= userCommand >

               <field property=userId depends=required> ②     
                   <arg key=用戶代碼 /> ③                                          
               </field>    
                                                                

①    這裡是定義要驗證的bean的名字要求去上面定義的commandName相同
②    這裡定義要驗證的bean屬性為userId使用規則為required(不為空)

③    這裡定義的是顯示信息arg表示位置 的顯示信息顯示key 所標明的信息(如果你還有多個信息就用 argarg 等)出錯信息將會顯示為 用戶代碼不能為空 

 
 

<field property=age depends=requiredintegermask>

                   <arg key=年齡 />
                   <msgname=mask key=errorsnegative/>
                   <var>
                      <varname>mask</varname>
                      <varvalue>^[]</varvalue>
                   </var>

        </field>
 

①   mask 標記驗證使用正則表達式來約束表單輸入值(如只能輸入數字字母或指定的字符)

②   msg標簽用來定義驗證規則和出錯信息的關聯這裡表示當出現 mask 校驗失敗時顯示 errorsnegative指明的信息

③      整個<var>標簽就是用來定義具體的規則的如<varname>mask</varname>指明是用於mask的規則<varvalue>^[]</varvalue> 表示只允許這幾個數字開頭

所以上面驗證信息是年齡字段不可以為空必須為整數而且必須為開頭也就杜絕了負數和零的情況

          
               <field property=birthday depends=requireddate>
                  <arg key=生日 />
                  <var>
                       <varname>datePatternStrict</varname>
                       <varvalue>yyyyMMdd</varvalue> 
                   </var>

        </field>

        </formset>
 
①   使用date加入對日期的格式的校驗

②         開始定義日期格式varname必須寫為datePatternStrict
③         定義你希望的日期格式如yyyymmdd yy/mm/dd 等等都可以

 
 

<field property=startDate depends=requireddate>

              <arg key=開始日期 />
              <var>
                   <varname>datePatternStrict</varname>
                   <varvalue>yyyyMMdd</varvalue>
                </var>
       </field>
       <field property=endDate depends=requireddatecompareTwoField>
              <arg key=結束日期 />
              <arg key=開始日期 />  
              <var>
                   <varname>datePatternStrict</varname>
                   <varvalue>yyyyMMdd</varvalue>
            </var>
            <var>
               <varname>secondField</varname> 
               <varvalue>startDate</varvalue>
            </var>

       </field>
 

①         這裡演示的是兩個日期的驗證要達到開始日期不能晚於結束日期加入compareTwoField驗證規則
②         定義第個顯示參數agr開始日期
③         加入一個var其varname為secondField(這個是在程序中寫死的必須寫為secondField)
④         varvalue定義為開始日期的屬性名如在本例中為 startDate

 
compareTwoField 是我們自己編寫的一個校驗規則用於比較兩個字段值大小
 
 在jsp頁面中定義錯誤信息顯示語句
 

<spring:bindpath=tableCrashDO*>   
    <c:iftest=${not empty statuserrorMessages}>
    <div class=error>  
        <c:forEachvar=error items=${statuserrorMessages}>
            <c:outvalue=${error}escapeXml=false/><br/>
        </c:forEach>
    </div>
    </c:if>

</spring:bind>

 

①      這裡的path必須要與傳入該jsp的bean的名字一樣如傳入該jsp的數據bean叫tableCrashDOpath就應該寫為tableCrashDO*

 
.使客戶端產生javascript代碼
 
<v:javascriptformName=tableCrashDO    
staticJavascript=false xhtml=true cdata=false/>
<script type=text/javascript src=<c:urlvalue=scripts/validatorjsp/>></script>
 

①      v:javascript標簽是spring的標簽定義在springcommonsvalidatortld 其中formName必須與validationxml中form的name保持一致

 
如此以來基本上可以算完成了validate的驗證配置
(特別注意 controller 中的commandName validationxml中的form name jsp中v:javascript標簽的formName三者必須保持一致


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28107.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.