springmvc校验
1.校验理解
项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。
服务端校验:
控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
持久层dao:一般是不校验的。
2.springmvc校验需求
springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。
校验思路:
页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。
具体需求:
商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。
3.环境准备
hibernate的校验框架validation所需要jar包:
4.配置校验器
在springmvc.xml配置文件中配置:
之后在工程的源文件夹config下创建CustomValidationMessages.properties配置文件,用来配置校验错误信息。
5.校验器注入到处理器适配器
6.在pojo中添加校验规则
在ItemsCustom.java中添加校验规则:
7.CustomValidationMessages.properties
在CustomValidationMessages.properties配置校验错误信息:
8.捕获校验错误信息(@Validated与BindingResult)
我们先测试输出错误看看,如果能正常输出错误,我们再去让它在页面中显示
访问主界面:
说明我们的校验配置成功!
下面我们让它在页面显示校验错误提示信息
9.在页面显示校验错误信息
在controller中将错误信息传到页面即可。
页面显示错误信息:
在商品编辑页面editItems.jsp中显示错误信息:
然后再一次测试,不输入日期和输入长姓名,点击修改之后结果:
1.校验理解
项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。
服务端校验:
控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
持久层dao:一般是不校验的。
2.springmvc校验需求
springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。
校验思路:
页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。
具体需求:
商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。
3.环境准备
hibernate的校验框架validation所需要jar包:
4.配置校验器
在springmvc.xml配置文件中配置:
<!-- 校验器 -->
<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">
<!-- 资源文件名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
之后在工程的源文件夹config下创建CustomValidationMessages.properties配置文件,用来配置校验错误信息。
5.校验器注入到处理器适配器
<mvc:annotation-driven conversion-service="conversionService"
validator="validator"></mvc:annotation-driven>
6.在pojo中添加校验规则
在ItemsCustom.java中添加校验规则:
public class Items {
private Integer id;
//校验名称在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}")
private Date createtime;
private String detail;
//get和set方法省略
}
7.CustomValidationMessages.properties
在CustomValidationMessages.properties配置校验错误信息:
#添加校验错误提示信息
items.name.length.error=请输入1到30个字符的商品名称
items.createtime.isNULL=请输入商品的生产日期
8.捕获校验错误信息(@Validated与BindingResult)
//商品信息修改提交
//在需要校验的pojo前边加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校验出错信息
//注意:@Validatedh和BindingResult bindingResult是配对出现,并且在形参中出现的顺序是固定的(一前一后)
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(HttpServletRequest request,Integer id,
@Validated ItemsCustom itemsCustom,BindingResult bindingResult)throws Exception{
//获取校验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors=bindingResult.getAllErrors();
for(ObjectError objectError:allErrors){
//输出错误信息
System.out.println(objectError.getDefaultMessage());
}
}
itemsService.updateItems(id, itemsCustom);
//重定向到商品的查询列表
return "redirect:queryItems.action";
}
我们先测试输出错误看看,如果能正常输出错误,我们再去让它在页面中显示
访问主界面:
点击修改,如图
然后让生产日期为空,发现报错:
说明我们的校验配置成功!
下面我们让它在页面显示校验错误提示信息
9.在页面显示校验错误信息
在controller中将错误信息传到页面即可。
//获取校验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors=bindingResult.getAllErrors();
for(ObjectError objectError:allErrors){
//输出错误信息
System.out.println(objectError.getDefaultMessage());
}
//将错误传到页面
model.addAttribute("allErrors",allErrors);
//出错之后要跳转的页面
return "items/editItems";
}
页面显示错误信息:
在商品编辑页面editItems.jsp中显示错误信息:
<!-- 显示错误信息 -->
<c:if test="${allErrors}!=null">
<c:forEach items="${allErrors}" var="error">
<font color="red">${error.defaultMessage}</font><br/>
</c:forEach>
</c:if>
然后再一次测试,不输入日期和输入长姓名,点击修改之后结果:
如图
转载请注明出处:http://blog.csdn.net/acmman/article/details/47441775