查看“SpringMVC:高级应用”的源代码
←
SpringMVC:高级应用
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:SpringMVC]] == Validation == 对提交的请求数据进行检验。<br/> === 依赖包 === * hibernate-validator-4.3.0.Final.jar * jboss-logging-3.1.0.CR2.jar * validation-api-1.0.0.GA.jar === 配置validator === ==== springmvc.xml ==== {| class="wikitable" style="width: 100%;" |+ Converter配置 ! style="width:50%;"| 使用<mvc:annotation-driven> ! style="width:50%;"| 使用HandlerAdapter |- style="vertical-align:top;" | <syntaxhighlight lang="xml"> <mvc:annotation-driven validator="validator"></mvc:annotation-driven> </syntaxhighlight> | <syntaxhighlight lang="xml"> <!-- 注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="webBindingInitializer" ref="customBinder"></property> </bean> <!-- 自定义webBinder --> <bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> </bean> </syntaxhighlight> |- | colspan="2" | <syntaxhighlight lang="xml"> <!-- 校验器 --> <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="defaultEncoding" value="UTF-8"></property> --> <property name="fileEncodings" value="UTF-8" /> <!-- 对资源文件内容缓存时间,单位秒 --> <property name="cacheSeconds" value="120" /> </bean> </syntaxhighlight> |} ==== CustomValidationMessages.properties ==== 位置参考<syntaxhighlight lang="xml" inline><value>classpath:CustomValidationMessages</value> </syntaxhighlight>,内容如: <syntaxhighlight lang="xml"> #添加校验错误提交信息 items.name.length.error=请输入1到30个字符的商品名称 items.createtime.isNUll=请输入商品的生产日期 item.price.isNull=test,价格不能为空 items.message.test=校验信息配置测试文字 </syntaxhighlight> === 使用validator === ==== 添加验证规则 ==== 在pojo的属性之上添加验证规则:<syntaxhighlight lang="java" inline>@NotNull(message="{item.price.isNull}",groups= {ValidGroup1.class})</syntaxhighlight>,其中: # <syntaxhighlight lang="java" inline>@NotNull</syntaxhighlight>:校验名称; # <syntaxhighlight lang="java" inline>message="{item.price.isNull}"</syntaxhighlight>:错误信息(配置于“CustomValidationMessages.properties”); # <syntaxhighlight lang="java" inline>groups= {ValidGroup1.class}</syntaxhighlight>:此校验所属的分组; # <syntaxhighlight lang="java" inline>@NotNull</syntaxhighlight>:; <syntaxhighlight lang="java"> public class Items { private Integer id; //校验名称在1到30字符中间 //message是提示校验出错显示的信息 //groups:此校验属于哪个分组,groups可以定义多个分组 @Size(min=1,max=30,message="{items.message.test}",groups={ValidGroup1.class}) private String name; @NotNull(message="{item.price.isNull}",groups= {ValidGroup1.class}) private Float price; private String pic; //非空校验 @NotNull(message="{items.createtime.isNUll}",groups= {ValidGroup1.class}) private Date createtime; private String detail; //get、set、toString... } </syntaxhighlight> ==== 错误消息文件 ==== 验证规则中配置的<syntaxhighlight lang="java" inline>message="{item.price.isNull}"</syntaxhighlight>,对应于“CustomValidationMessages.properties”中的信息: <syntaxhighlight lang="java"> #添加校验错误提交信息 items.name.length.error=请输入1到30个字符的商品名称 items.createtime.isNUll=请输入商品的生产日期 item.price.isNull=test,价格不能为空 items.message.test=校验信息配置测试文字 </syntaxhighlight> * '''''如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件。'''''【???】 ==== 捕获错误 ==== 在Controller的方法形参前添加<syntaxhighlight lang="java" inline>@Validated</syntaxhighlight>来在参数绑定时进行校验,并将校验信息写入'''BindingResult'''中: # 在要校验的pojo后边添加<syntaxhighlight lang="java" inline>BingdingResult</syntaxhighlight>; # 一个<syntaxhighlight lang="java" inline>BindingResult</syntaxhighlight>对应一个pojo; <syntaxhighlight lang="java"> // 商品信息修改提交 // 在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult // bindingResult接收校验出错信息 // 注意:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。 // value={ValidGroup1.class}指定使用ValidGroup1分组的 校验 // @ModelAttribute可以指定pojo回显到页面在request中的key @RequestMapping("/editItemsSubmit") public String editItemsSubmit( Model model, HttpServletRequest request, Integer id, @ModelAttribute("items") @Validated(value = { ValidGroup1.class}) ItemsCustom itemsCustom, BindingResult bindingResult, MultipartFile items_pic//接收商品图片 ) throws Exception { // 获取校验错误信息 if (bindingResult.hasErrors()) { // 输出错误信息 List<ObjectError> allErrors = bindingResult.getAllErrors(); for (ObjectError objectError : allErrors) { // 输出错误信息 System.out.println(objectError.getDefaultMessage()); } // 将错误信息传到页面 model.addAttribute("allErrors", allErrors); // 可以直接使用model将提交pojo回显到页面 model.addAttribute("items", itemsCustom); // 出错重新到商品修改页面 return "items/editItems"; } //原始名称 String originalFilename = items_pic.getOriginalFilename(); //上传图片 if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){ //存储图片的物理路径 String pic_path = "F:\\develop\\upload\\temp\\"; //新的图片名称 String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); //新图片 File newFile = new File(pic_path+newFileName); //将内存中的数据写入磁盘 items_pic.transferTo(newFile); //将新图片名称写到itemsCustom中 itemsCustom.setPic(newFileName); } // 调用service更新商品信息,页面需要将商品信息传到此方法 itemsService.updateItems(id, itemsCustom); return "success"; } </syntaxhighlight> ==== 错误回显 ==== 在捕获错误后,页面需要显示错误信息。<br/> 如:<br/> # 页头: #: <syntaxhighlight lang="jsp"> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> </syntaxhighlight> # 在需要显示错误信息地方: #: <syntaxhighlight lang="jsp"> <spring:hasBindErrors name="item"> <c:forEach items="${errors.allErrors}" var="error"> ${error.defaultMessage }<br/> </c:forEach> </spring:hasBindErrors> </syntaxhighlight> #* <syntaxhighlight lang="jsp" inline><spring:hasBindErrors name="item"></syntaxhighlight>表示如果item参数绑定校验错误下边显示错误信息。 或,如:【???????????】<br/> # Controller: #: <syntaxhighlight lang="java"> if(bindingResult.hasErrors()){ model.addAttribute("errors", bindingResult); } </syntaxhighlight> # 在需要显示错误信息地方: #: <syntaxhighlight lang="jsp"> <c:forEach items="${errors.allErrors}" var="error"> ${error.defaultMessage }<br/> </c:forEach> </syntaxhighlight> === 分组校验 === 如果两处校验使用同一个Items类则可以设定校验分组,通过分组校验可以对每处的校验个性化。<br/> ==== 定义分组 ==== 分组就是一个标识,可以使用一个空接口来进行分组定义。<br/> <syntaxhighlight lang="java"> package cn.itcast.ssm.controller.validation; public interface ValidGroup1 { //接口中不需要定义任何方法,仅是对不同的校验规则进行分组 //此分组只校验商品名称长度 } </syntaxhighlight> <syntaxhighlight lang="java"> package cn.itcast.ssm.controller.validation; public interface ValidGroup2 { //接口中不需要定义任何方法,仅是对不同的校验规则进行分组 //此分组只校验xxxxxx } </syntaxhighlight> ==== 指定分组 ==== 在pojo的校验规则中使用<syntaxhighlight lang="java" inline>groups= {ValidGroup1.class}</syntaxhighlight>来指定所属的分组。<br/> <syntaxhighlight lang="java"> @Size(min=1,max=30,message="{items.message.test}",groups={ValidGroup1.class}) private String name; @NotNull(message="{item.price.isNull}",groups= {ValidGroup1.class}) private Float price; @NotNull(message="{items.createtime.isNUll}",groups= {ValidGroup1.class}) private Date createtime; </syntaxhighlight> ==== 使用分组校验 ==== 在Controller中使用<syntaxhighlight lang="java" inline>@Validated(value={ValidGroup1.class})</syntaxhighlight>来使用ValidGroup1分组的检验规则。<br/> <syntaxhighlight lang="java"> // 商品修改提交 @RequestMapping("/editItemSubmit") public String editItemSubmit( @Validated(value={ValidGroup1.class}) @ModelAttribute("item") Items items, BindingResult result, @RequestParam("pictureFile") MultipartFile[] pictureFile, Model model) throws Exception { ... } </syntaxhighlight> * 也可以使用逗号分隔来指定多个分组:<syntaxhighlight lang="java" inline>@Validated(value={ValidGroup1.class,ValidGroup2.class })</syntaxhighlight> === 校验注解 === {| class="wikitable" ! 校验 !! 说明 |- | @Null || 被注释的元素必须为 null |- | @NotNull || 被注释的元素必须不为 null |- | @AssertTrue || 被注释的元素必须为 true |- | @AssertFalse || 被注释的元素必须为 false |- | @Min(value) || 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |- | @Max(value) || 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |- | @DecimalMin(value) || 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |- | @DecimalMax(value) || 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |- | @Size(max=, min=) || 被注释的元素的大小必须在指定的范围内 |- | @Digits (integer, fraction) || 被注释的元素必须是一个数字,其值必须在可接受的范围内 |- | @Past || 被注释的元素必须是一个过去的日期 |- | @Future || 被注释的元素必须是一个将来的日期 |- | @Pattern(regex=,flag=) || 被注释的元素必须符合指定的正则表达式 |- ! colspan="2" | Hibernate Validator 附加的 constraint |- | @NotBlank(message =) || 验证字符串非null,且长度必须大于0 |- | @Email || 被注释的元素必须是电子邮箱地址 |- | @Length(min=,max=) || 被注释的字符串的大小必须在指定的范围内 |- | @NotEmpty || 被注释的字符串的必须非空 |- | @Range(min=,max=,message=) || 被注释的元素必须在合适的范围内 |} == 数据回显 == == 异常处理器 == == 上传图片 == == json数据交互 == == RESTful支持 == == 拦截器 ==
返回至“
SpringMVC:高级应用
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息