您的位置:首页 > 编程语言 > Java开发

SSM整合之数据校验

2017-06-29 17:49 411 查看

什么是校验?

一个项目中,通常使用校验较多的地方是前端的校验,比如说在页面中js的校验(表单验证)。对于安全性要求较高的,则会要求在服务端也进行校验

服务端校验:
控制层Controller: 校验页面请求参数(形参)的合法性。在控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程接口的调用webService)
业务层Service(使用较多):主要校验关键的业务参数,仅限于service接口中使用的参数
持久层dao:一般是不用校验的

springmvc校验

springmvc使用hibernate的一个校验框架validation(与hibernate无任何关系

 校验思路

页面提交请求的参数,请求到Controller方法中,使用validation进行校验。若校验出错,则将错误信息展示到页面

需求

商品修改,添加校验(校验商品名称长度,日期的非空校验),若校验出错,在商品修改页面显示错误信息。

环境准备

hibernate的校验框架所需jar包:



将其加入至工程librery

配置校验器

<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器-->
<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">
<!-- 资源文件名,使用basenames,不用加后缀名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>


注意:此处配置资源文件名时,property的name是basenames,不是basename。要不会报错。

将校验器注入至处理器适配器中

<mvc:annotation-driven conversion-service="conversionService" validator="validator"></mvc:annotation-driven>


在pojo中添加校验规则

在ItemsCustom.java中添加校验规则
//校验名称:1-30字符之间
//message提示校验出错显示的信息
@Size(min = 1,max = 30,message = "{items.name.length.error}")
private String name;

private Float price;

private String pic;
//非空校验
@NotNull(message = "{items.createtime.isNull}")


CustomValidationMessages.properties

配置校验的所有错误信息
#添加校验错误提示信息
items.name.length.error = 请输入1到30个字符的商品名称
items.createtime.isNull = 请输入商品的生产日期

注!!!!!!此处不支持中文,请使用ASCII格式编码,如\u671f等

捕获校验错误信息

//商品修改
//在需要校验的pojo前,添加@Validated,在需要校验的pojo后添加BindingResult bindingResult接收校验出错信息
//注意!!@Validated和BindingResult bindingResult 是配对出现的,并且在形参里的顺序是固定的(一前一后)
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(HttpServletRequest request, Integer id, @Validated ItemsCustom itemsCustom , BindingResult bindingResult) throws Exception{


在页面显示校验错误信息

//在需要校验的pojo前,添加@Validated,在需要校验的pojo后添加BindingResult bindingResult接收校验出错信息
//注意!!@Validated和BindingResult bindingResult 是配对出现的,并且在形参里的顺序是固定的(一前一后)
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request, Integer id, @Validated ItemsCustom itemsCustom , BindingResult bindingResult) throws Exception{
//获取校验的错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
//将错误信息传至页面
model.addAttribute("allErrors",allErrors);
//出错则重新至商品更新页面
return "items/editItems";
}
//调用service更新商品信息,页面需要将商品信息传到此方法
itemsService.updateItems(id,itemsCustom);
//页面转发
return "success";
}


页面代码

<!-- 显示错误信息 -->
<c:if test="${allErrors != null }">
<c:forEach items="${allErrors }" var="error">
<font color="red" >${ error.defaultMessage}</font>
</c:forEach>
</c:if>




最终效果




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息