validate参数校验和数据回显
服务端校验
校验理解
项目中,通常使用较多的是前段的校验,比如在页面中js校验。对于安全要求较高的建议在服务端进行校验。
服务端校验:
控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用);
业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数
持久层dal:一般是不校验的
springMVC校验
springMVC使用hibernate的校验框架validation(与hibernate没什么关系)
校验思路:
页面提交请求的参数,请求到controller方法中,使用validate进行校验。如果校验出错,将错误信息展示到页面中。
准备:
hibernate校验框架validation所需要的jar包
hibernat-validator-4.3.0.Final.jar
jboss-loggin-3.1.0.CR2.jar
validation-api-1.0.0.GA.jar
配置校验器
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验使用的资源文件,如果不指定默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
校验器注入到处理器适配器
配置方式1:
<mvn:annotation-driver validator="vilidator"></mvc:annotation-driver>
配置方式2:
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator" />
</bean>
<!-- 注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingIntializer" ref="customBinder"></property>
</bean>
在pojo中定义校验规则:
public class Items {
private Integer id;
//校验名称在1到30字符中间
//mesage是提示校验出错显示的信息
@Size(min=1,max=30,message="请输入1~30个字符的商品名称")
private String name;
...
}
校验出错提示信息这样设置不太好,硬编码,我们在资源文件中配置,这里调用就好了
CustomValidationMessage.properties
#添加校验错误提示信息
items.name.length.error=请输入1~30个字符的商品名称
items.createtime.isNULL=请输入商品的生产日期
public class Items {
private Integer id;
//校验名称在1到30字符中间
//mesage是提示校验出错显示的信息
@Size(min=1,max=30,message="${items.name.length.error}")
private String name;
//非空校验
@NotNull(message="${items.createtime.isNULL}")
private Date createtime;
...
}
捕获错误校验信息:
//在需要验证的pojo前面添加@Validated,在需要验证的pojo后面添加,BindingResult bindingResult接受出错信息
//注意:@Validated和BindingResult对象时配对出现的,并且顺序是固定的(一前一后)
@RequestMapping("...")
public String editSubmit(HttpServletRequest request,Integer id,ItemsCustom itemsCustom,BindingResult bindingResult)throws Exception {
//获取验证错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectErros> allErrors = bindingResult.getAllErrors();
for(ObjectErrors objectErrors:allErrors){
//输出信息
System.out.println(objectError.getDefaultMessage());
}
}
...
}
在页面显示错误信息:
将allErrors放在model中就可以在jsp中得到了
model.addAttribute("allErrors",allErrors);
分组校验:
需求:
在pojo中定义校验规则,而pojo是被多个controller所共用,当不同的controller方法对同一个pojo进行校验,但是每一个controller都需要有不同的校验方式。
解决方法:
定义多个校验分组(其实是一个java接口),分组中定义有哪些规则
每个controller方法使用不同的校验分组
校验分组:
public interface ValidateGroup1{
//接口中不需要定义任何方法,但是对不同的校验规则进行分组
}
public interface ValidateGroup2{
//接口中不需要定义任何方法,但是对不同的校验规则进行分组
//次分组只校验商品的长度
}
在校验规则中添加分组:
public class Items {
private Integer id;
//校验名称在1到30字符中间
//mesage是提示校验出错显示的信息
//groups:次校验属于哪个分组,groups可以定义多个分组
@Size(min=1,max=30,message="${items.name.length.error}",groups={ValidateGroup1.class,ValidateGroup2.class})
private String name;
//非空校验
@NotNull(message="${items.createtime.isNULL}",groups={ValidateGroup2.class})
private Date createtime;
...
}
在controller方法使用指定分组的校验
//商品信息修改提交
//在需要校验的pojo前面加@Validated,在需要校验的pojo后面加BindingResult对象接收输出错误信息
//注意:@Validated和BindingResult对象是承兑出现,而且形参顺序是固定的(一前一后)
//value={ValidateGroup1.class}指定使用ValidateGroup1的校验
@RequestMapping("...")
public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,@Validated(value={ValidateGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult)throws Exception{
...
}
数据回显
1、什么是数据回显
提交后,如果出现错误,将刚才提交的数据会先到刚才的提交页面
2、数据回显的方法
pojo数据回显方法
1、springMVC默认对pojo进行回显
pojo数据传入controller方法后,springmvc自动将pojo放置到request域,key为类名的首字母小写
2、使用@ModelAttribute注解标识参数放在request中的key
@RequestMapping("...")
public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,@ModelAttribute("items") @Validated(value={ValidateGroup1.class}) ItemsCustom itemsCustom,BindingResult result){
...
}
@ModelAttribute还有一个作用:在执行该Controller方法之前将方法返回值注入到request域
@ModelAttribute("itemtypes")
public Map<String,String> getItemTypes(){
...
}
页面上可以得到itemsTypes数据:
商品类型:
<select name="itemtype">
<c:forEach items="${itemtypes}" var="itemtype">
<option value="${itemtype.key}">${itemtype.value}</option>
</c:forEach>
</select>
3、使用model将提交的pojo回显到页面
model.addAttribute("items",itemsCustom);
简单数据类型回显
只能使用model的方式。
validate参数校验和数据回显的更多相关文章
- SpringMVC【参数绑定、数据回显、文件上传】
前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定.. ...
- SpringMVC(三) —— 参数绑定和数据回显
参数绑定的过程:就是页面向后台传递参数,后台接受的一个过程. 默认支持的参数类型:(就是你在方法上以形参的形式去定义一下的类型,就可以直接使用它) HttpServletRequest HttpSer ...
- springMVC参数绑定与数据回显
简单例子:修改商品信息的jsp页面: 参数绑定过程: 1.2.1 默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值. 1.1.1 HttpServletReq ...
- 一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。
1:Struts2表单数据校验: (1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证. (2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xm ...
- SpringMVC学习--数据回显
简介 表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示. 简单数据类型 对于简单数据类型,如:Integer.String.Float等使用Model将传入的参数再放到req ...
- SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】
Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...
- SpringMVC学习(四)———— 数据回显与自定义异常处理器
一.数据回显技术 Springmvc默认支持对pojo类型的数据回显,默认不支持简单类型的数据回显 1.1.什么是数据回显? 在信息校验时,如果发生校验错误,那么把校验的数据信息,依然停留在当前页面, ...
- springmvc(五) 数据回显与自定义异常处理器
这章讲解一下springmvc的数据回显和自定义异常处理器的使用,两个都很简单 --WH 一.数据回显技术 Springmvc默认支持对pojo类型的数据回显,默认不支持简单类型的数据回显 1.1.什 ...
- SpringMVC由浅入深day02_5数据回显_6异常处理器
5 数据回显 5.1 什么数据回显 表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示. 5.2 pojo数据回显方法 1.springmvc默认对pojo数据进行回显. po ...
随机推荐
- centos7 vmware克隆解决网络问题
centos7克隆后,发现两台机子之间的MAC相同,无法获取IP.超找资料,解决办法如下: 只要删除网卡的配置文件中的HWADDR和UUID两行就行.使用ifup启动网卡即可.
- Java 实现文件随机读写-RandomAccessFile
现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...
- CNN学习笔记:卷积神经网络
CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...
- leetcode每日一题——两数之和
题目: 两数之和 难度: 简单 描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 解法: class Solutio ...
- Entity FrameWork 配置 之连接字符串隐藏或重用
C/S项目中使用EF,默认回生成app.config文件夹,软件打包安装成功之后就回生成一个对应exe.config.里面会包含配置的一些信息. 这里介绍给大家一种隐藏连接字符串的方式. 代码如下: ...
- 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构 班级: 1623 姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5 ...
- 什么是“欧几里德范数”(Euclidean norm)?
x是n维向量(x1,x2,…,xn),||x||=根号(|x1|方+|x2|方+…+|xn|方) 补充:开平方,跟几何一样
- Oracle数据类型(4)
字符类型: CHAR(size):固定长度字符串,最大长度2000 bytes VARCHAR2(size):可变长度的字符串,最大长度4000 bytes,可做索引的最大长度749 NCHAR(si ...
- ubuntu 致命错误: zlib.h:没有那个文件或目录【转】
本文转载自:https://blog.csdn.net/u013359794/article/details/44922685?locationnum=15&fps=1 编译时,出现错误,提示 ...
- DCU IP Prefether
DCU IP Prefether 数据高速缓存单元预取I P 设置.如果设置为E n a b l e d,会预取I P 地址以改善网络连接和系统性能,所以建议选择E n a b l ed.选项:E n ...