關於Spring MVC對非String類型進行校驗時的出錯處理
我在對User
age (Integer型)
進行校驗時
如果輸入的是字符總是出錯:
Failed to convert property value of type [java
lang
String] to required type [java
lang
Integer] for property age; nested exception is java
lang
NumberFormatException: For input string:
ff
解決方法:
本例用的是commons
validator的開源框架
在Controller中加
protected void initBinder(HttpServletRequest request
ServletRequestDataBinder binder) {
binder
registerCustomEditor(Integer
class
null
new CustomNumberEditor(Integer
class
null
true));
binder
registerCustomEditor(Long
class
null
new CustomNumberEditor(Long
class
null
true));
binder
registerCustomEditor(byte[]
class
new ByteArrayMultipartFileEditor());
SimpleDateFormat dateFormat = new SimpleDateFormat(getText(
date
format
request
getLocale()));
dateFormat
setLenient(false);
binder
registerCustomEditor(Date
class
null
new CustomDateEditor(dateFormat
true));
}
在資源文件ApplicationResources_zh_CN
properties 中加:
user
age=\u
e
\u
f
typeMismatch
java
lang
Integer=
{}\u
fc
\u
b\u
e
a\u
e
\u
\u
c\u
一些朋友說在用非對象類型如int時也總是出錯
但我在測試時發現不管是用int 還是用float
如果不輸或輸入字符
系統均會自動賦值 int為
float為
以下是一個不錯的入門文章轉發於 jamyy的專欄:
關於Spring中Commons Validator的使用說明
spring的validate驗證需要兩個bean(ValidatorFactory
BeanValidator)及兩xml文件(validator
rules
xml
validation
xml)的支持
ValidatorFactory用於制造BeanValidator
後者則是在程序中執行校驗的控制bean
Validatorrules
xml中定義了各種驗證的規則
如字段不為空
字段輸入值必須為整數等等
Validation
xml中則定義了那些bean及bean中的哪些屬性字段需要驗證
使用哪些驗證規則
validate 分為兩級驗證
客戶端驗證(javascript)和服務器端驗證
以下是使用validate的步驟
在配置文件中聲明ValidatorFactory 和 BeanValidator
<bean id=
validatorFactory
class=
omons
validator
DefaultValidatorFactory
>
①
<property name=
validationConfigLocations
>
②
<list>
<value>/WEB
INF/validator
rules
xml</value>
<value>/WEB
INF/validation
xml</value>
</list>
</property>
</bean>
<bean id=
beanValidator
class=
omons
validator
DefaultBeanValidator
>
③
<property name=
validatorFactory
>
<ref bean=
validatorFactory
/>
④
</property>
</bean>
① 聲明validatoFactory這裡我們使用spring 的DefaultValidatorFactory
② 定義其validationConfigLocations屬性
將validator
rules
xml和validation
xml傳入
③ 聲明beanValidator這裡我們使用spring的DefaultBeanValidator
④ 在其屬性中指明要使用的validatorFactory
這裡我們使用剛剛定義的validatorFactory
在需要進行驗證的controller(即要使用form表單或者command的controller)中聲明validate
<beanid=
xxxxController
……>
<property name=
commandName
value=
userCommand
/>
①
<property name=
commandClass
value=
com
resoft
User
/>
②
<property name=
validator
ref=
beanValidator
/>
③
……
</bean>
① commandName用於指明需要驗證的 command的名字
這個名字必須和 validation
xml中<formname=
xxxxx
> 所寫的名字保持一致
② commandClass用於指定這個command的類型
其必須與你jsp提交的form最後形成的command類型相一致
③ 聲明該controller使用validator
這裡將我們剛剛定義的beanValidator傳入進去
在validation
xml文件中
定義你要校驗的formbean(或者說是command)
定義這個bean中有哪幾個field需要驗證
使用何種規則驗證
(注意
這裡定義的form name 必須和前面controller中定義的commandName保持一致)以下是幾種常用的驗證示例
<form
validation>
<formset>
<form name=
userCommand
>
①
<field property=
userId
depends=
required
>
②
<arg
key=
用戶代碼
/>
③
</field>
① 這裡是定義要驗證的bean的名字
要求去上面定義的commandName相同
② 這裡定義要驗證的bean屬性為userId
使用規則為required(不為空)
③ 這裡定義的是顯示信息
arg
表示位置
的顯示信息
顯示key 所標明的信息(如果你還有多個信息就用 arg
arg
等)出錯信息將會顯示為
用戶代碼不能為空
<field property=
age
depends=
required
integer
mask
>
①
<arg
key=
年齡
/>
<msgname=
mask
key=
errors
negative
/>
②
<var>
<var
name>mask</var
name>
<var
value>^[
]</var
value>
③
</var>
</field>
① mask 標記驗證
使用正則表達式來約束表單輸入值
(如
只能輸入數字
字母或指定的字符)
② msg標簽用來定義驗證規則和出錯信息的關聯
這裡表示當出現 mask 校驗失敗時
顯示 errors
negative指明的信息
③ 整個<var>標簽就是用來定義具體的規則的
如<var
name>mask</var
name>指明是用於mask的規則
<var
value>^[
]</var
value> 表示只允許
這幾個數字開頭
所以上面驗證信息是年齡字段不可以為空
必須為整數
而且必須為
開頭也就杜絕了負數和零的情況
<field property=
birthday
depends=
required
date
>
①
<arg
key=
生日
/>
<var>
<var
name>datePatternStrict</var
name>
②
<var
value>yyyy
MM
dd</var
value>
③
</var>
</field>
</formset>
① 使用
date
加入對日期的格式的校驗
② 開始定義日期格式
var
name必須寫為datePatternStrict
③ 定義你希望的日期格式如
yyyy
mm
dd yy/mm/dd 等等都可以
<field property=
startDate
depends=
required
date
>
<arg
key=
開始日期
/>
<var>
<var
name>datePatternStrict</var
name>
<var
value>yyyy
MM
dd</var
value>
</var>
</field>
<field property=
endDate
depends=
required
date
compareTwoField
>
①
<arg
key=
結束日期
/>
<arg
key=
開始日期
/>
②
<var>
<var
name>datePatternStrict</var
name>
<var
value>yyyy
MM
dd</var
value>
</var>
<var>
<var
name>secondField</var
name>
③
<var
value>startDate</var
value>
</var>
</field>
① 這裡演示的是兩個日期的驗證
要達到開始日期不能晚於結束日期
加入compareTwoField驗證規則
② 定義第
個顯示參數agr
開始日期
③ 加入一個var其var
name為secondField(這個是在程序中寫死的
必須寫為secondField)
④ var
value定義為開始日期的屬性名
如在本例中為 startDate
注
compareTwoField 是我們自己編寫的一個校驗規則
用於比較兩個字段值大小
在jsp頁面中定義錯誤信息顯示語句
<spring:bindpath=
tableCrashDO
*
>
①
<c:iftest=
${not empty status
errorMessages}
>
<div class=
error
>
<c:forEachvar=
error
items=
${status
errorMessages}
>
<c:outvalue=
${error}
escapeXml=
false
/><br/>
</c:forEach>
</div>
</c:if>
</spring:bind>
① 這裡的path必須要與傳入該jsp的bean的名字一樣
如傳入該jsp的數據bean叫tableCrashDO
path就應該寫為tableCrashDO
*
.使客戶端產生javascript代碼
<v:javascriptformName=
tableCrashDO
①
staticJavascript=
false
xhtml=
true
cdata=
false
/>
<script type=
text/javascript
src=
<c:urlvalue=
scripts/validator
jsp
/>
></script>
① v:javascript標簽是spring的標簽
定義在spring
commons
validator
tld
其中formName必須與validation
xml中form的name保持一致
如此以來
基本上可以算完成了validate的驗證配置
(特別注意
controller 中的commandName
validation
xml中的form name
jsp中v:javascript標簽的formName三者必須保持一致
)
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28107.html