在Struts中對用戶輸入信息的校驗一般在FromBean中進行(除非需要訪問數據庫進行諸如登錄信息的校驗,因為這是Action的工作),本文將闡述如何在Struts中實現可配置的信息校驗。
一、在FormBean中手工實現
最簡單的方法是直接在FormBean中重寫ActionForm類的validate方法,validate方法簽名如下:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest req)比如需要校驗age字段必須填寫數字:
1
public ActionErrors validate(ActionMapping mapping, HttpServletRequest req)
{
2
ActionErrors errors = new ActionErrors();
3
4
String age = this.getAge();
5
if(!this.isNumber(age))
{ // isNumber() is not implemented
6
errors.add(
,
);
7
}
8
9
return errors;
10
}
在form提交后,容器會調用validate方法對表單數據進行校驗,如果返回的ActionErrors為空(即校驗通過),則將FormBean提交Action,否則重定向到提交form的頁面。
這種方法實現簡單,直觀,容易測試、調試,但不可避免地存在以下缺點:
1、很難重用,導致重復開發
有很多校驗邏輯在整個網站中是相同的,比如上述的數字校驗,還有email校驗、長度校驗等等,而通過覆蓋validate方法很難對這些校驗過程進行重用,除非定義一些helper類封裝校驗方法(比如上述的isNumber())。而當需要為另一個FormBean加入相同的校驗邏輯時必須重復地覆蓋validate方法
2、難于擴展
當要對一個表單增、刪、改校驗邏輯時必須修改validate方法,重新打包、部署
3、不可配置
因為校驗邏輯硬編碼于class文件中,運行時不可能做到靈活地配置校驗邏輯
因此,Struts中加入了另一種更靈活的校驗機制:
二、使用Validator
Validator提供了一種基于xml配置文件的校驗模型,要使用這一模型必須做如下實現:
1、FormBean繼承org.apache.struts.validator.ValidatorForm而不是ActionForm
2、不覆蓋validate方法
3、創建validator-rules.xml及validation.xml文件
validator-rules.xml定義了可用來配置的校驗邏輯,如:
1
<form-validation>
2
<global>
3
<validator name="required"
4
classname="org.apache.struts.validator.FieldChecks"
5
method="validateRequired"
6
methodParams="java.lang.Object,
7
org.apache.commons.validator.ValidatorAction,
8
org.apache.commons.validator.Field,
9
org.apache.struts.action.ActionMessages,
10
org.apache.commons.validator.Validator,
11
javax.servlet.http.HttpServletRequest"
12
msg="errors.required"/>
13
<validator name="requiredif"
14
classname="org.apache.struts.validator.FieldChecks"
15
method="validateRequiredIf"
16
methodParams="java.lang.Object,
17
org.apache.commons.validator.ValidatorAction,
18
org.apache.commons.validator.Field,
19
org.apache.struts.action.ActionMessages,
20
org.apache.commons.validator.Validator,
21
javax.servlet.http.HttpServletRequest"
22
msg="errors.required"/>
23
<validator name="validwhen"
24
msg="errors.required"
25
classname="org.apache.struts.validator.validwhen.ValidWhen"
26
method="validateValidWhen"
27
methodParams="java.lang.Object,
28
org.apache.commons.validator.ValidatorAction,
29
org.apache.commons.validator.Field,
30
org.apache.struts.action.ActionMessages,
31
org.apache.commons.validator.Validator,
32
javax.servlet.http.HttpServletRequest"/>
33
<validator name="minlength"
34
classname="org.apache.struts.validator.FieldChecks"
35
method="validateMinLength"
36
methodParams="java.lang.Object,
37
org.apache.commons.validator.ValidatorAction,
38
org.apache.commons.validator.Field,
39
org.apache.struts.action.ActionMessages,
40
org.apache.commons.validator.Validator,
41
javax.servlet.http.HttpServletRequest"
42
depends=""
43
msg="errors.minlength"
44
jsFunction="org.apache.commons.validator.javascript.validateMinLength"/>
45
<validator name="maxlength"
46
classname="org.apache.struts.validator.FieldChecks"
47
method="validateMaxLength"
48
methodParams="java.lang.Object,
49
org.apache.commons.validator.ValidatorAction,
50
org.apache.commons.validator.Field,
51
org.apache.struts.action.ActionMessages,
52
org.apache.commons.validator.Validator,
53
javax.servlet.http.HttpServletRequest"
54
depends=""
55
msg="errors.maxlength"
56
jsFunction="org.apache.commons.validator.javascript.validateMaxLength"/>
57
<validator name="mask"
58
classname="org.apache.struts.validator.FieldChecks"
59
method="validateMask"
60
methodParams="java.lang.Object,
61
org.apache.commons.validator.ValidatorAction,
62
org.apache.commons.validator.Field,
63
org.apache.struts.action.ActionMessages,
64
org.apache.commons.validator.Validator,
65
javax.servlet.http.HttpServletRequest"
66
depends=""
67
msg="errors.invalid"/>
68
<validator name="byte"
69
classname="org.apache.struts.validator.FieldChecks"
70
method="validateByte"
71
methodParams="java.lang.Object,
72
org.apache.commons.validator.ValidatorAction,
73
org.apache.commons.validator.Field,
74
org.apache.struts.action.ActionMessages,
75
org.apache.commons.validator.Validator,
76
javax.servlet.http.HttpServletRequest"
77
depends=""
78
msg="errors.byte"
79
jsFunctionName="ByteValidations"/>
80
<validator name="short"
81
classname="org.apache.struts.validator.FieldChecks"
82
method="validateShort"
83
methodParams="java.lang.Object,
84
org.apache.commons.validator.ValidatorAction,
85
org.apache.commons.validator.Field,
86
org.apache.struts.action.ActionMessages,
87
org.apache.commons.validator.Validator,
88
javax.servlet.http.HttpServletRequest"
89
depends=""
90
msg="errors.short"
91
jsFunctionName="ShortValidations"/>
92
<validator name="integer"
93
classname="org.apache.struts.validator.FieldChecks"
94
method="validateInteger"
95
methodParams="java.lang.Object,
96
org.apache.commons.validator.ValidatorAction,
97
org.apache.commons.validator.Field,
98
org.apache.struts.action.ActionMessages,
99
org.apache.commons.validator.Validator,
100
javax.servlet.http.HttpServletRequest"
101
depends=""
102
msg="errors.integer"
103
jsFunctionName="IntegerValidations"/>
104
<validator name="long"
105
classname="org.apache.struts.validator.FieldChecks"
106
method="validateLong"
107
methodParams="java.lang.Object,
108
org.apache.commons.validator.ValidatorAction,
109
org.apache.commons.validator.Field,
110
org.apache.struts.action.ActionMessages,
111
org.apache.commons.validator.Validator,
112
javax.servlet.http.HttpServletRequest"
113
depends=""
114
msg="errors.long"/>
115
<validator name="float"
116
classname="org.apache.struts.validator.FieldChecks"
117
method="validateFloat"
118
methodParams="java.lang.Object,
119
org.apache.commons.validator.ValidatorAction,
120
org.apache.commons.validator.Field,
121
org.apache.struts.action.ActionMessages,
122
org.apache.commons.validator.Validator,
123
javax.servlet.http.HttpServletRequest"
124
depends=""
125
msg="errors.float"
126
jsFunctionName="FloatValidations"/>
127
<validator name="double"
128
classname="org.apache.struts.validator.FieldChecks"
129
method="validateDouble"
130
methodParams="java.lang.Object,
131
org.apache.commons.validator.ValidatorAction,
132
org.apache.commons.validator.Field,
133
org.apache.struts.action.ActionMessages,
134
org.apache.commons.validator.Validator,
135
javax.servlet.http.HttpServletRequest"
136
depends=""
137
msg="errors.double"/>
138
<validator name="date"
139
classname="org.apache.struts.validator.FieldChecks"
140
method="validateDate"
141
methodParams="java.lang.Object,
142
org.apache.commons.validator.ValidatorAction,
143
org.apache.commons.validator.Field,
144
org.apache.struts.action.ActionMessages,
145
org.apache.commons.validator.Validator,
146
javax.servlet.http.HttpServletRequest"
147
depends=""
148
msg="errors.date"
149
jsFunctionName="DateValidations"/>
150
<validator name="intRange"
151
classname="org.apache.struts.validator.FieldChecks"
152
method="validateIntRange"
153
methodParams="java.lang.Object,
154
org.apache.commons.validator.ValidatorAction,
155
org.apache.commons.validator.Field,
156
org.apache.struts.action.ActionMessages,
157
org.apache.commons.validator.Validator,
158
javax.servlet.http.HttpServletRequest"
159
depends="integer"
160
msg="errors.range"/>
161
<validator name="floatRange"
162
classname="org.apache.struts.validator.FieldChecks"
163
method="validateFloatRange"
164
methodParams="java.lang.Object,
165
org.apache.commons.validator.ValidatorAction,
166
org.apache.commons.validator.Field,
167
org.apache.struts.action.ActionMessages,
168
org.apache.commons.validator.Validator,
169
javax.servlet.http.HttpServletRequest"
170
depends="float"
171
msg="errors.range"/>
172
<validator name="doubleRange"
173
classname="org.apache.struts.validator.FieldChecks"
174
method="validateDoubleRange"
175
methodParams="java.lang.Object,
176
org.apache.commons.validator.ValidatorAction,
177
org.apache.commons.validator.Field,
178
org.apache.struts.action.ActionMessages,
179
org.apache.commons.validator.Validator,
180
javax.servlet.http.HttpServletRequest"
181
depends="double"
182
msg="errors.range"/>
183
<validator name="creditCard"
184
classname="org.apache.struts.validator.FieldChecks"
185
method="validateCreditCard"
186
methodParams="java.lang.Object,
187
org.apache.commons.validator.ValidatorAction,
188
org.apache.commons.validator.Field,
189
org.apache.struts.action.ActionMessages,
190
org.apache.commons.validator.Validator,
191
javax.servlet.http.HttpServletRequest"
192
depends=""
193
msg="errors.creditcard"/>
194
<validator name="email"
195
classname="org.apache.struts.validator.FieldChecks"
196
method="validateEmail"
197
methodParams="java.lang.Object,
198
org.apache.commons.validator.ValidatorAction,
199
org.apache.commons.validator.Field,
200
org.apache.struts.action.ActionMessages,
201
org.apache.commons.validator.Validator,
202
javax.servlet.http.HttpServletRequest"
203
depends=""
204
msg="errors.email"/>
205
<validator name="url"
206
classname="org.apache.struts.validator.FieldChecks"
207
method="validateUrl"
208
methodParams="java.lang.Object,
209
org.apache.commons.validator.ValidatorAction,
210
org.apache.commons.validator.Field,
211
org.apache.struts.action.ActionMessages,
212
org.apache.commons.validator.Validator,
213
javax.servlet.http.HttpServletRequest"
214
depends=""
215
msg="errors.url"/>
216
<!--
217
This simply allows struts to include the validateUtilities into a page, it should
218
not be used as a validation rule.
219
-->
220
<validator name="includeJavaScriptUtilities"
221
classname=""
222
method=""
223
methodParams=""
224
depends=""
225
msg=""
226
jsFunction="org.apache.commons.validator.javascript.validateUtilities"/>
227
<validator name="codeinput"
228
classname="consultII.web.utils.MyValidator"
229
method="validateCodeInput"
230
methodParams="java.lang.Object,
231
org.apache.commons.validator.ValidatorAction,
232
org.apache.commons.validator.Field,
233
org.apache.struts.action.ActionMessages,
234
javax.servlet.http.HttpServletRequest"
235
msg="errors.code"/>
236
<validator name="userinfo"
237
classname="consultII.web.utils.MyValidator"
238
method="validateUserInfo"
239
methodParams="java.lang.Object,
240
org.apache.commons.validator.ValidatorAction,
241
org.apache.commons.validator.Field,
242
org.apache.struts.action.ActionMessages,
243
javax.servlet.http.HttpServletRequest"
244
msg="errors.info"/>
245
</global>
246
</form-validation> 該配置文件的具體格式請查閱Struts的
官方文檔。可以看出其中對很多常用的校驗邏輯進行了封裝,比如數字校驗(92行到103行),長度校驗(33行到56行)等。
而validation.xml則是Validator的核心,其中可對各個FormBean中需要校驗字段及校驗邏輯進行靈活的配置:
1
<form-validation>
2
<formset>
3
<form name="login">
4
<field property="username" depends="required"/>
5
<field property="password" depends="required"/>
6
<field property="input" depends="required,codeinput"/>
7
</form>
8
<form name="search">
9
<field property="keyword" depends="required"/>
10
</form>
11
<form name="signin">
12
<field property="username" depends="required"/>
13
<field property="password" depends="required"/>
14
<field property="passagain" depends="required"/>
15
<field property="question" depends="required,userinfo"/>
16
<field property="answer" depends="required,userinfo"/>
17
<field property="age" depends="required,integer"/>
18
<field property="input" depends="required,codeinput"/>
19
<field property="email" depends="email"/>
20
</form>
21
<form name="ask">
22
<field property="content" depends="required"/>
23
</form>
24
</formset>
25
</form-validation>
26
具體格式可查閱官方文檔,如上例,3到5行定義了需要對名為“loging”的FormBean的“username”、“password”分別進行“required”校驗(即必填字段)。校驗邏輯之間可以組合,如第6行的“required,codeinput”,定義了先進行required校驗,通過了再進行codeinput校驗。
與在validate方法內進行校驗相比,使用Validator的優勢就很明顯了,可重用(從上述xml文件可以看出對很多字段都進行了required校驗);可靈活配置、擴展,只需修改validation.xml文件就可以改變校驗邏輯。
posted on 2006-03-07 17:53
^ Mustang ^ 閱讀(5297)
評論(0) 編輯 收藏 所屬分類:
Struts