在Struts中对用户输入信息的校验方法对比:validate 和validator

简介: 在Struts中对用户输入信息的校验一般在FromBean中进行(除非需要访问数据库进行诸如登录信息的校验,因为这是Action的工作),本文将阐述如何在Struts中实现可配置的信息校验。 一、在FormBean中手工实现 最简单的方法是直接在FormBean中重写ActionForm类的validate方法,validate方法签名如下: public ActionErrors v

在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文件就可以改变校验逻辑。 

相关文章
|
2月前
|
Java 数据库连接
后端校验(hibernate-validator)
后端校验(hibernate-validator)
30 0
|
6月前
|
Java
validator分组校验
validator分组校验
73 0
|
2月前
使用Hibernate-Validate进行参数校验
使用Hibernate-Validate进行参数校验
18 3
|
5月前
|
Java 数据库连接
hibernate-validator校验对象属性为List
hibernate-validator校验对象属性为List
54 1
|
前端开发
怎么使用async-validator快速校验表单
怎么使用async-validator快速校验表单
335 0
|
Oracle Java 关系型数据库
hibernate-validator校验参数(统一异常处理)(上)
hibernate-validator校验参数(统一异常处理)
hibernate-validator校验参数(统一异常处理)(上)
|
JSON Java 数据格式
hibernate-validator校验参数(统一异常处理)(下)
hibernate-validator校验参数(统一异常处理)
hibernate-validator校验参数(统一异常处理)(下)
|
前端开发 Java Spring
更简洁的参数校验,使用 SpringBoot Validation 对参数进行校验
在开发接口时,如果要对参数进行校验,你会怎么写?编写 if-else 吗?虽然也能达到效果,但是不够优雅。 今天,推荐一种更简洁的写法,使用 SpringBoot Validation 对方法参数进行校验,特别是在编写 Controller 层的方法时,直接使用一个注解即可完成参数校验。
283 0
更简洁的参数校验,使用 SpringBoot Validation 对参数进行校验
|
移动开发 小程序 JavaScript
uniapp form表单validator函数校验
uniapp form表单validator函数校验
uniapp form表单validator函数校验
|
Java 数据库连接
hibernate自定义校验Valid
步骤: 1.定义注解: import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.
1274 0