《Java EE框架整合开发入门到实战(第2版)》 课件 第10章 数据验证_第1页
《Java EE框架整合开发入门到实战(第2版)》 课件 第10章 数据验证_第2页
《Java EE框架整合开发入门到实战(第2版)》 课件 第10章 数据验证_第3页
《Java EE框架整合开发入门到实战(第2版)》 课件 第10章 数据验证_第4页
《Java EE框架整合开发入门到实战(第2版)》 课件 第10章 数据验证_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章数据验证学习目的与要求本章重点讲解SpringMVC框架的输入验证体系。通过本章的学习,理解输入验证的流程,能够利用Spring的自带验证框架和JakartaBeanValidation(Java验证规范)对数据进行验证。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社目录10.1数据验证概述10.2Spring验证器10.3JakartaBeanValidation(JSR380)《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.1数据验证概述数据验证分为客户端验证和服务器端验证,客户端验证主要是过滤正常用户的误操作,可以通过JavaScript代码完成;服务器端验证是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.1.1客户端验证大多数情况下,使用JavaScript进行客户端验证的步骤如下。 编写验证函数 在提交表单的事件中调用验证函数 根据验证函数来判断是否进行表单提交客户端验证可以过滤用户的误操作,是第一道防线,一般使用JavaScript代码实现。仅有客户端验证还是不够的。攻击者还可以绕过客户端验证直接进行非法输入,这样可能会引起系统的异常,为了确保数据的合法性,防止用户通过非正常手段提交错误信息。所以必须加上服务器端的验证。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.1.2服务器端验证SpringMVC的Converter和Formatter在进行类型转换时,是将输入数据转换为领域模型对象的属性值(一种Java类型),一旦成功,服务器端验证就将介入。也就是说,在SpringMVC框架中,先进行数据类型转换,再进行服务器端验证。服务器端验证对于系统的安全性、完整性、健壮性起到了至关重要的作用。在SpringMVC框架中,可以利用Spring自带的验证框架验证数据,也可以利用Jakarta

BeanValidation实现数据验证。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社目录10.1数据验证概述10.2Spring验证器10.3JakartaBeanValidation(JSR380)《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.2.1Validator接口创建自定义Spring验证器,需要实现Validator接口。该接口有两个接口方法。booleansupports(Class<?>klass)voidvalidate(Objectobject,Errorserrors)supports方法返回true时,验证器可以处理指定的Class。validate方法的功能是验证目标对象object,并将验证错误消息存入Errors对象。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.2.2ValidationUtils类org.springframework.validation.ValidationUtils是一个工具类,该类中有几个方法可以帮助判定值是否为空。例如:if(goods.getGname()==null||goods.getGname().isEmpty()){

errors.rejectValue("gname","goods.gname.required")}上述if语句可以使用ValidationUtils工具类的rejectIfEmpty方法,代码如下。//errors为Errors对象,gname为goods对象的属性ValidationUtils.rejectIfEmpty(errors,"gname","goods.gname.required");《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.2.3Validator验证示例本节使用一个应用ch10_1讲解Spring验证器的编写及使用。该应用中有1个数据输入页面addGoods.jsp,效果如图10.1所示;有1个数据显示页面goodsList.jsp,效果如图10.2所示。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.2.3Validator验证示例编写一个实现org.springframework.validation.Validator接口的验证器类GoodsValidator,验证要求如下。1.商品名和商品详情不能为空。2.商品价格在0-100之间。3.创建日期不能在系统日期之后。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社1.创建应用在Eclipse中,创建一个名为ch10_1的DynamicWebProject,在应用ch10_1的WEB-INF/lib目录中添加与【例8-1】中ch8_1应用一样的JAR包,不再赘述。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社2.编写数据输入页面在应用ch10_1的WEB-INF目录下,创建文件夹jsp,并在该文件夹中创建数据输入页面addGoods.jsp。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社3.编写模型类在应用ch10_1的src/main/java目录下,创建pojo包,并在该包中定义领域模型类Goods,封装输入参数。在该类中使用@DateTimeFormat(pattern="yyyy-MM-dd")格式化创建日期。@DatapublicclassGoods{ privateStringgname; privateStringgdescription; privatedoublegprice; //日期格式化(需要在配置文件配置FormattingConversionServiceFactoryBean)

@DateTimeFormat(pattern="yyyy-MM-dd") privateDategdate;}《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社4.编写验证器类在应用ch10_1的src/main/java目录下,创建validator包,并在该包中编写实现Validator接口的验证器类GoodsValidator,同时使用@Component注解将GoodsValidator类声明为验证组件。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社4.编写验证器类@ComponentpublicclassGoodsValidatorimplementsValidator{ @Override publicbooleansupports(Class<?>klass){ //要验证的Model,返回值为false则不验证。

returnGoods.class.isAssignableFrom(klass); } @Override publicvoidvalidate(Objectobject,Errorserrors){ Goodsgoods=(Goods)object;//object要验证的对象

//goods.gname.required是错误消息属性文件中的编码

ValidationUtils.rejectIfEmpty(errors,"gname","goods.gname.required"); ValidationUtils.rejectIfEmpty(errors,"gdescription","goods.gdescription.required"); if(goods.getGprice()>100||goods.getGprice()<0){ errors.rejectValue("gprice","gprice.invalid"); } DategoodsDate=goods.getGdate(); //在系统时间之后

if(goodsDate!=null&&goodsDate.after(newDate())){ errors.rejectValue("gdate","gdate.invalid"); } }}《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社5.编写错误消息属性文件在应用ch10_1的/WEB-INF/目录下,创建文件夹resource,并在该文件夹中编写属性文件errorMperties,文件内容如下。goods.gname.required=请输入商品名称。goods.gdescription.required=请输入商品详情。gprice.invalid=价格在0-100之间。gdate.invalid=创建日期不能在系统日期之后。属性文件创建完成后,需要在配置文件中声明一个messageSourcebean,告诉SpringMVC从该文件中获取错误消息,配置示例如下。<!--配置消息属性文件--><beanid="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <propertyname="basename"value="/WEB-INF/resource/errorMessages"/></bean>《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社6.编写Service层在应用ch10_1的src/main/java目录下,创建service包,并在该包中编写一个GoodsService接口和GoodsServiceImpl实现类。@ServicepublicclassGoodsServiceImplimplementsGoodsService{ //使用静态集合变量goods模拟数据库

privatestaticArrayList<Goods>goods=newArrayList<Goods>(); @Override publicbooleansave(Goodsg){ goods.add(g); returntrue; } @Override publicArrayList<Goods>getGoods(){ returngoods; }}《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社7.编写控制器类在应用ch10_1的src/main/java目录下,创建controller包,并在该包中编写控制器类GoodsController,在该类中使用@Resource注解注入自定义验证器。另外,控制器类中包含两个处理请求的方法。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社7.编写控制器类@Controller@RequestMapping("/goods")publicclassGoodsController{ privatestaticfinalLoglogger=LogFactory.getLog(GoodsController.class); @Autowired privateGoodsServicegoodsService;

@Resource

privateValidatorvalidator; @GetMapping("/input") publicStringinput(Modelmodel){ model.addAttribute("goods",newGoods()); return"addGoods"; } @PostMapping("/save") publicStringsave(@ModelAttributeGoodsgoods,BindingResultresult,Modelmodel){ this.validator.validate(goods,result);//添加验证

if(result.hasErrors()){

return"addGoods"; } goodsService.save(goods); ("添加成功"); model.addAttribute("goodsList",goodsService.getGoods()); return"goodsList"; }}《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社8.创建配置文件在应用ch10_1的/WEB-INF/目录下,创建配置文件springmvc-servlet.xml和web.xml。应用ch10_1的Web配置文件web.xml与【例8-1】中应用ch8_1的web.xml文件相同。在应用ch10_1的springmvc-servlet.xml配置文件中,需要注册日期格式化转换器、配置消息属性文件等操作,springmvc-servlet.xml的具体配置如下。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社8.创建配置文件

<!--注册格式化转换器,因为用到日期转换-->

<beanid="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"/><mvc:annotation-drivenconversion-service="conversionService"/><!--配置消息属性文件-->

<beanid="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <propertyname="basename"value="/WEB-INF/resource/errorMessages"/></bean>《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社9.编写数据显示页面在应用ch10_1的WEB-INF/jsp/目录下,创建数据显示页面goodsList.jsp。<tableclass="tabletable-borderedtable-hover"> <tr> <td>商品名</td> <td>商品详情</td> <td>商品价格</td> <td>创建日期</td> </tr> <c:forEachitems="${goodsList}"var="goods"> <tr> <td>${goods.gname}</td> <td>${goods.gdescription}</td> <td>${goods.gprice}</td> <td>${goods.gdate}</td> </tr> </c:forEach></table>通过地址http://localhost:8080/ch10_1/goods/input测试应用。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社目录10.1数据验证概述10.2Spring验证器10.3JakartaBeanValidation(JSR380)《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3JakartaBeanValidation(JSR380)JSR是JavaSpecificationRequests的缩写,意思是Java

规范提案。关于数据校验这块,最新的是JSR380,也就是BeanValidation2.0。BeanValidation是一个通过配置注解来验证数据的框架,它包含两部分BeanValidationAPI(规范)和HibernateValidator(实现)。BeanValidation是Java定义的一套基于注解/xml的数据校验规范,目前已经从JSR303的BeanValidation1.0版本升级到JSR349的BeanValidation1.1版本,再到380的BeanValidation2.0版本。2018年,Oracle(甲骨文)决定把JavaEE移交给开源组织Eclipse

基金会,正式改名为JakartaEE。BeanValidation也就自然命名为JakartaBeanValidation。编写本书时,最新版本是JakartaBeanValidation3.0。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3.1JakartaBeanValidation验证配置1.下载与安装HibernateValidator首先,可以通过Maven中央仓库/下载HibernateValidator,本书选择的是hibernate-validator-8.0.0.Final.jar。同时,还需要通过Maven中央仓库下载HibernateValidator的依赖包:classmate-1.5.1.jar、jakarta.el-4.0.2.jar、jakarta.validation-api-3.0.2.jar以及jboss-logging-3.4.1.Final.jar。然后,将hibernate-validator-8.0.0.Final.jar和HibernateValidator的依赖包拷贝到应用的\WEB-INF\lib目录下。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3.1JakartaBeanValidation验证配置2.配置属性文件与验证器如果将验证错误消息放在属性文件中,那么需要在配置文件配置属性文件,并将属性文件与HibernateValidator关联。《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3.2标注类型1.空检查@Null:验证对象是否为null。@NotNull:验证对象是否不为null,无法查检长度为0的字符串。@NotBlank:检查约束字符串是不是null,还有被trim后的长度是否大于0,只对字符串,且会去掉前后空格。@NotEmpty:检查约束元素是否为null或者是empty。示例如下:@NotBlank(message="{goods.gname.required}")//goods.gname.required为属性文件的错误代码privateStringgname;2.booelan检查@AssertTrue:验证boolean属性是否为true。@AssertFalse:验证boolean属性是否为false。示例如下:@AssertTrueprivatebooleanisLogin;《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3.2标注类型3.长度检查@Size(min=,max=):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内。@Length(min=,max=):验证字符串长度是否在给定的范围之内。示例如下:@Length(min=1,max=100)privateStringgdescription;4.日期检查@Past:验证Date和Calendar对象是否在当前时间之前。@Future:验证Date和Calendar对象是否在当前时间之后。@Pattern:验证String对象是否符合正则表达式的规则。示例如下:@Past(message="{gdate.invalid}")privateDategdate;《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3.2标注类型5.数值检查@Min:验证Number和String对象是否大等于指定的值。@Max:验证Number和String对象是否小等于指定的值。@DecimalMax:被标注的值必须不大于约束中指定的最大值,这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示,小数存在精度。@DecimalMin:被标注的值必须不小于约束中指定的最小值,这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示,小数存在精度。@Digits:验证Number和String的构成是否合法。@Digits(integer=,fraction=):验证字符串是否符合指定格式的数字,interger指定整数精度,fraction指定小数精度。@Range(min=,max=):检查数字是否介于min和max之间。@Valid:对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中的元素进行校验,如果是一个map,则对其中的值部分进行校验。@CreditCardNumber:信用卡验证。@Email:验证是否是邮件地址,如果为null,不进行验证,通过验证。示例如下:@Range(min=0,max=100,message="{gprice.invalid}")privatedoublegprice;《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社10.3.3JakartaBeanValidation验证示例《JavaEE框架整合开发入门到实战》陈恒

主编,清华大学出版社1.模型类在模型类Goods中,利用JakartaBeanValidation的标注类型对属性进行分组验证。@DatapublicclassGoods{ //add组

publicinterfaceAdd{} //update组

publicinterfaceUpdate{} //goods.gname.required错误消息key(国际化后,对应的就是国际化的信息)

@NotBlank(groups={Add.class},message="{goods.gname.required}") privateStringgname;

@NotBlank(groups={Add.class},message="{goods.gdescription.required}") privateStringgdescription;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论