宝哥软件园

SpringMVC验证器验证示例

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

SpringMVC服务器验证一种是有两种方式,一种是基于验证器接口,一种是使用JSR-303注释标准的验证,下面主要是学习这两种,工作中推荐后者,方便很多

一。基于验证器接口的验证。

首先创建用户实例,并加入几个属性

公共类用户{私有字符串用户名;私有字符串密码;私有字符串昵称;公共字符串getUsername(){ 0返回用户名;} public void setUsername(String username){ this。用户名=用户名;}公共字符串getPassword(){ 0返回密码;}公共void set密码(String密码){ this。密码=密码;}公共字符串getNickname(){ 0返回昵称;} public void setNickname(字符串昵称){ this .昵称=昵称;} @ Override public String to String(){ return ' username-' username ' password-' password '昵称-'昵称;}}接着创建用于校检的类用户验证器,让其实现验证器,覆盖其中的两个方法

导入主要的。Java。模特。用户;导入组织。弹簧框架。验证。错误;导入组织。弹簧框架。验证。验证器;公共类用户验证器实现验证器{ @覆盖公共布尔支持(类?aClass) { //判断是否是要校验的类,这里是用户返回用户。上课。equals(AClass);} @覆盖公共无效验证(对象哦,错误错误){用户u=(用户)o;if(null==u . GetPassPort()| | ' ' .equals(u.getPassword())){ //此方法可以加四个参数,第一个表单域字段,//区分是哪个表单出错,第二个错误代码错误码, //第三个制定了资源文件中占位符,第四个具体错误返回信息//简写版可以把2,3参数去掉errors.rejectValue('password ',null,null,' password为null’);} }}上面的类只实现了对密码判断是否为空,为空则注册这一错误信息,也就是"密码为空",接下来要实现控制器,控制器要做的事情,第一是注册这个校验器,第二是实现校验。

导入主要的。Java。模特。用户;/** * 加上@控制器决定这个类是一个控制器*/@ Controller @请求映射("/user ")公共类HelloController { //我们知道在控制器类中通过@InitBinder标记的方法只有在请求当前控制器的时候才会被执行//所以在这里注册校验器@ init binder public void init bainder(数据绑定器绑定器){ binder。替换验证器(新用户验证器());} //这个方法主要是跳转到登录页面@RequestMapping(值='/login ',方法=RequestMethod .GET)公共字符串登录(模型模型){ model.addAttribute(新用户());返回"用户/登录";} //处理登录表单@RequestMapping(值='/login ',方法=RequestMethod .开机自检)公共字符串登录(@已验证用户用户,绑定结果br){ if(br。haserrors()){返回“用户/登录”;}返回'-';} }上面代码可以看到@已验证用户用户,绑定结果英国铁路公司这两个参数,@已验证表明参数用户是要校验的类,BindingResult是存储错误信息的类,两者必须一一对应,并且位置挨着,不能中间有其他参数,

最后随便写一个jsp页面实现校检

"%@"页面内容类型=' text/html;charset=UTF-8 ' language=' Java ' % @ taglib前缀=' SF ' uri=' http://www。弹簧框架。组织/标签/表单“%”请求。setcharacter encoding(' utf-8 ');%htmlhead元字符集='utf-8 '标题用户登录/title/head body SF :表单MoDEL属性=' user '方法='post '用户名:sf:input输入输入路径='用户名/SF :错误路径='用户名/br密码:sf:input输入输入路径='密码'/SF :错误路径='密码'/br昵称:sf:input输入输入路径='昵称/SF :错误路径='昵称/br输入类型='提交'值='提交/SF :表单/正文/html这里写图片描述

前面实现的是局部校验,只对当前控制器有效,如果要实现全局校验的话需要配置springMVC.xml文件

?xml版本='1.0 '编码='UTF-8 '?beans xmlns=' http://www . Spring framework . org/schema/beans ' xmlns : xsi=' http://www . w3 . org/2001/XMLSchema-instance ' xmlns : context=' http://www . Spring framework . org/schema/context ' xmlns 3: mcvc=' http://www . Spring framework . org/schema/MVC ' xsi : schema location=' 333http://www。/豆子二。使用JSR-303标准进行验证

使用这个需要导入才能支持JSR-303标准的包,建议使用hibernate Validator包,先看看这个标准的原生注释

约束描述@Null约束只能为null @NotNull约束不能为null @AssertFalse约束必须为false @AssertTrue约束必须为true @DecimalMax(值)约束必须为不大于指定值的数字@DecimalMin(值)限制必须为不小于指定值的数字。@Digits(整数、分数)限制必须是小数,整数部分的位数不能超过整数。小数位数不能超过分数@未来限制必须是未来日期@最大(值)限制必须是不大于指定值的数字@最小(值)限制必须是不小于指定值的数字@过去限制必须是过去日期@模式(值)限制必须符合指定的正则表达式@大小(最大, Min)限制字符长度必须介于min和max之间@过去验证注释元素值(日期类型)早于当前时间@NotEmpty验证注释元素值不为空(字符串长度不为0,集合大小不为0) @NotBlank验证注释元素值不为空(不为空,删除第一个空格后长度为0)。 与@NotEmpty不同,@NotBlank仅适用于字符串,并在比较时删除字符串中的空格。@Email验证Annotation的元素值是Email,也可以通过正则表达式和标志指定用户自定义的Email格式。使用起来非常简单,只需要在需要验证的变量前面加上这个注释就可以了。使用后请见以下用户。

公共类用户{@不为空(消息='用户名不能为空')私有字符串用户名;@Size(min=6,max=20,message='密码长度不达标')私有String密码;私有字符串昵称;}然后向控制器添加验证

@ Controller @ request mapping(“/user”)公共类hello Controller { @ request mapping(值=“/log in”),方法=RequestMethod。GET)公共字符串登录(模型模型){ model.addAttribute(新用户());返回“用户/登录”;} @RequestMapping(值='/login ',方法=RequestMethod。POST)公共字符串登录(@Validated User user,binding result br){ if(br . haserrors()){ return ' User/log in ';}返回“用户/登录”;}}那么jsp页面还是上一页,验证效果如下。这个方法显然要简单得多

这里写图片描述

3.定义您自己的注释验证器

这部分是直接从[Daniel ][1]复制过来的。

除了JSR-303本身支持的限制类型之外,我们还可以定义自己的限制类型。为了定义我们自己的限制类型,我们必须首先定义这个限制类型的注释,并且这个注释需要用@Constraint标记。现在假设我们需要定义一个代表金额的限制类型,因此我们可以定义如下:

导入Java . lang . annotation . element type;导入Java . lang . annotation . retention;导入Java . lang . annotation . retention policy;导入Java . lang . annotation . target;导入javax . validation . constraint;导入javax . validation . payload;import com . XXX . XXX . constraint . impl . money validator;@ target ({elementtype.field,element type . method })@ retention(retention policy . runtime)@ constraint(由=moneyvalidator.class验证)public @ interface money { string message()' default '不是金额形式;上课?[]group()默认为{ };上课?扩展有效负载[]有效负载()(默认为{ };}我们可以看到,在上面的代码中,我们定义了一个Money注释,注释中标记了@Constraint注释。使用@Constraint注释说明我们定义了一个用于限制的注释。@Constraint注释的validatedBy属性用于指定哪个ConstraintValidator需要验证我们定义的当前约束类型。在上面的代码中,我们指定货币限制类型的支票类是MoneyValidator。此外,应该注意的是,在定义我们自己的限制类型注释时,必须定义三个属性,例如上面代码中显示的消息、组和负载属性。

定义了限制类型Money之后,下一步就是定义我们的限制类型验证类MoneyValidator。限制类型验证类必须实现接口javax . validation . constraintvalifier及其initialize和isValid方法。让我们先来看看MoneyValidator的代码示例:

导入Java . util . regex . pattern;导入javax . validation . constraintvalidator;导入javax . validation . constraintvalidatorcontext;import com . XXX . XXX . constraint . money;公共类MoneyValidator实现ConstraintValidatorMoney,double { private string money reg='^\d( 。\d{1,2})?$';//正则表达式私有模式money pattern=pattern。编译(money reg);public void initialize(Money Money){//TODO自动生成的方法存根} public boolean isValid(Double值,ConstraintValidatorContext arg 1){//TODO自动生成的方法存根if (value==null)返回true返回money pattern . matcher(value . ToString())。matches();}}从上面的代码中,我们可以看到ConstraintValidator使用了泛型。它需要指定两种类型,第一种类型是对应的initialize方法的参数类型,第二种类型是对应的isValid方法的第一个参数类型。从上面的两种方法中,我们可以看到使用isValid方法进行验证。有时我们需要获取当前限制类型的属性进行验证。例如,当我们验证@Min限制类型时,我们需要通过其value属性获得当前验证类型定义的最小值。我们可以看到isValid方法无法获取当前的限制类型Money。这时,initialize方法的功能就出来了。

我们知道initialize方法可以获取当前的限制类型,所以当我们在验证某个限制类型时需要获取当前限制类型的某个属性时,可以为当前的ConstraintValidator定义对应的属性,然后在initialize方法中为该属性赋值,再在isValid方法中使用其对应的属性。鉴于这种情况,让我们看一个代码示例。现在假设我想定义我自己的@Min限制类型和对应的MinValidator验证器,那么我可以定义如下:

@Target({ElementType。字段,元素类型。方法})@保留(保留策略。RUNTIME)@ Constraint(validatedBy=minvalidator . class)public @ interface Min { int value()(默认值为0;字符串消息();上课?[]group()默认为{ };上课?扩展有效负载[]有效负载()(默认为{ };}MinValidator verifier公共类MinValidator实现constraintvalidatormin,integer { private int minvaluepublic void initialize(敏敏){//todo自动生成的方法存根//将min restriction类型的属性值分配给当前ConstraintValidator的成员变量minValue minValue=min . value();} public boolean isValid(整数值,Constructvalidatorcontext arg 1){//todo自动生成的方法存根//这里我们可以通过当前ConstraintValidator的成员变量minValue来访问当前限制类型Min的value属性。返回值=minValue}}我们来谈谈第二种类型的ConstraintValidator泛型。我们已经知道,它的第二种类型是相应isValid方法的第一个参数。从我给出的参数名值中,我们也可以知道isValid方法的第一个参数是目前需要验证的对应数据的值,它的类型也是需要验证的对应数据的数据类型。两者的数据类型必须一致,否则spring会提示找不到对应数据类型的ConstraintValidator。在建立了自己的限制类型及其对应的ConstraintValidator之后,其用法与标准的JSR-303限制类型相同。下面是一个实体类,它使用上面定义的JSR-303限制类型——一个限制和最小限制:

公共类用户{私有整数;私人双倍工资;@Min(值=8,消息='年龄不能小于8岁')public int getAge(){ return age;} public void setAge(int age){ this . age=age;} @Money(消息='标准金额形式为xxx.xx ')公双领工资(){退回工资;} public void setSalary(双倍工资){ this.salary=薪资;}}4.配合ajax验证

最近写的项目,感觉直接用验证器不太容易,主要是返回时会刷新整个页面,体验相当不好。最好使用ajax进行验证,所以要配合ajax

Thinking :还是经过springMVC验证的,但是这次如果发现错误,就拿出来存储在一个地图中,然后ajax返回,根据ajax的返回值来判断页面,从而显示不同的信息

主代码:

If (br.hasErrors()){//判断是否有错误//遍历错误集,如果有,直接放入地图集中br。getfielderrors()。foreach (p-{maps。put (p. getfield()、p . getdefaultmessage());});返回地图;}在这种情况下,maps存储错误变量名和错误消息,例如username-“‘用户名不能为空’

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+