JSR 303 springmvc 数据校验
来源:互联网 发布:矩阵测光 编辑:程序博客网 时间:2024/06/06 12:44
JSR 303
JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,
它已经包含在 JavaEE 6.0 中 .
JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max
等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证
Hibernate Validator 扩展注解
Spring MVC 数据校验
Spring 4.0 拥有自己独立的数据校验框架,同时支持 JSR 303 标准的校验框架。
Spring 在进行数据绑定时,可同时调用校验框架完成数据校 验工作。在 Spring MVC 中,可直接通过注解驱动的方式进行数据校验
Spring 的 LocalValidatorFactroyBean 既实现了 Spring 的Validator 接口,也实现了 JSR 303 的 Validator 接口。只要
在 Spring 容器中定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。
Spring 本身并没有提供 JSR303 的实现,所以必须将JSR303 的实现者的 jar 包放到类路径下。
<mvc:annotation-driven/> 会默认装配好一个 LocalValidatorFactoryBean,通过在处理方法的入参上标注 @valid 注解即可让 Spring MVC 在完成数据绑定后执行数据校验的工作
在已经标注了 JSR303 注解的表单/命令对象前标注一个 @Valid,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
Spring MVC 是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是 BindingResult 或
Errors 类型,这两个类都位于org.springframework.validation 包中
需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的,它们之间不允许声明其他的入参
如:public String handle 91(@Valid User user, BindingResult userBindingResult,String sessionId,ModelMap mm,@Valid Dept dept , Errors deptErrors){}
Errors 接口提供了获取错误信息的方法,如 getErrorCount() 或getFieldErrors(String field) BindingResult 扩展了 Errors 接口
在页面上显示错误
Spring MVC 除了会将表单/命令对象的校验结果保存到对 应的 BindingResult 或 Errors 对象中外,还会将所有校验结果保存到 “隐含模型”
即使处理方法的签名中没有对应于表单/命令对象的•结果入参,校验结果也会保存在 “隐含对象” 中。
隐含模型中的所有数据最终将通过 HttpServletRequest 的属性列表暴露给 JSP 视图对象,因此在 JSP 中可以获取
错误信息在 JSP 页面上可通过 <form:errors path=“userName”> 显示错误消息
示例
提示消息的国际化
每个属性在数据绑定和数据校验发生错误时,都会生成一 个对应的 FieldError 对象。
当一个属性校验失败后,校验框架会为该属性生成 4 个消息代码,这些代码以校验注解类名为前缀,结合
modleAttribute、属性名及属性类型名生成多个对应的消息代码:
例如 User 类中的 password 属性标准了一个 @Pattern 注解,当该属性值不满足 @Pattern 所定义的规则时, 就会产生以下 4个错误代码:
Pattern.user.password –
Pattern.password –
Pattern.java.lang.String –
Pattern –
当使用 Spring MVC 标签显示错误消息时, Spring MVC 会查看WEB 上下文是否装配了对应的国际化消息,如果没有,则显示默认的错误消息,否则使用国际化消息。
1). 如何校验 ? 注解 ?①. 使用 JSR 303 验证标准②. 加入 hibernate validator 验证框架的 jar 包③. 在 SpringMVC 配置文件中添加 <mvc:annotation-driven />④. 需要在 bean 的属性上添加对应的注解⑤. 在目标方法 bean 类型的前面添加 @Valid 注解2). 验证出错转向到哪一个页面 ?注意: 需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的,它们之间不允许声明其他的入参3). 错误消息 ? 如何显示, 如何把错误消息进行国际化
input.jsp
<form:form action="${pageContext.request.contextPath }/emp"method="POST" modelAttribute="employee"> <form:errors path="*"></form:errors><!-- 显示所有的错误校验 --> <br><c:if test="${empolyee.id ==null }"><!-- path属性对应html 表单标签的name属性 --> LastName:<form:input path="lastName" /> <form:errors path="lastName"></form:errors><!-- 显示lastName检验 --></c:if><c:if test="${empolyee.id !=null }"><form:hidden path="id"/><input type="hidden" name="_method" value="PUT"></c:if><br> Email:<form:input path="email" /> <form:errors path="email"></form:errors><br><%Map<String, String> genders = new HashMap();genders.put("1", "Male");genders.put("0", "Female");request.setAttribute("genders", genders);%> Gender:<form:radiobuttons path="gender" items="${genders}"delimiter="<br>" /><br> Department:<form:select path="department.id" items="${departments}"itemLabel="departmentName" itemValue="id"></form:select><br>Birth:<form:input path="birth"/><form:errors path="birth"></form:errors><br>salary:<form:input path="salary"/><br><input type="submit" value="Submit" /></form:form></body></html>
controller
@RequestMapping(value = "/emp", method = RequestMethod.POST)public String save(@Valid Employee employee,Errors result,Map<String,Object> map) {if(result.getErrorCount()>0){System.out.println("出错了!");for (FieldError error : result.getFieldErrors()) {System.out.println(error.getField()+":"+error.getDefaultMessage());}//若验证出错,则转向定制的页面map.put("departments", departmentDao.getDepartments());return "input";}System.out.println(employee.getBirth());System.out.println(employee.getSalary());employeeDao.save(employee);return "redirect:/emps";}
在javabean上注解
@NotEmptyprivate String lastName;@Emailprivate String email;@Past@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birth;
使用提示消息的国际化
在src新建i18n.properties文件
格式:javabean 属性上的注解加类名第一个字母小写再加属性
NotEmpty.employee.lastName=lastName不能为空Email.employee.email=Email格式不正确Past.employee.birth=Birth必须是以前的时间springmvc配置文件
<!-- 配置国际化资源文件 --><bean id="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basename" value="i18n"></property></bean>
- JSR 303 springmvc 数据校验
- SpringMVC数据校验-JSR 303
- springmvc 使用JSR-303进行数据校验
- springmvc 使用JSR-303进行数据校验
- 【知识整理】SpringMVC-JSR 303数据校验
- JSR 303数据校验
- SpringMVC 数据的格式化、JSR 303数据校验和国际化
- SpringMVC使用JSR 303校验
- SpringMVC 使用JSR-303进行校验 @Valid
- springmvc使用JSR-303进行校验
- SpringMVC 使用JSR-303进行校验 @Valid
- SpringMVC 使用JSR-303进行校验 @Valid
- SpringMVC 使用JSR-303进行校验 @Valid
- springmvc使用JSR-303进行校验
- SpringMVC 使用JSR-303进行校验 @Valid
- SpringMVC 使用JSR-303进行校验 @Valid
- SpringMVC 使用JSR-303进行校验 @Valid
- SpringMVC 使用JSR-303进行校验 @Valid
- Kafka基本原理
- 欢迎使用CSDN-markdown编辑器
- C++走向远洋——47(第十二周、运算符重载基础程序、阅读)
- 集合 List<E>接口的方法简介
- Android-自定义Acitivity切换动画库-AnimActivity
- JSR 303 springmvc 数据校验
- Java反射机制实现与原理
- 微软面试100题-69
- UVA_11380_Down Went The Titanic
- 探究Lucene计算权重的过程
- jquery 中的 $(“#”) 与 js中的document.getElementById(“”) 的区别
- 数字在计算机中是如何存储的
- Product of Array except self | leetcode
- uCos-II内存管理