springmvc(10) springmvc校验

17 篇文章 0 订阅

目录

检验理解

校验思路:

环境准备

配置校验器-springmvc.xml

将validator加到处理器适配器

配置方式一(推荐)

配置方式二

在pojo中添加校验规则

建立 CustomValidationMessages.properties配置文件

捕获校验错误信息

controller

jsp页面

分组校验

检验分组

在校验规则中添加分组

在controller方法中使用指定分组的校验


 

检验理解

项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。

服务端校验:

         控制层conroller:校验页面请求的参数的合法性。在服务端控制层conroller校验,不区分客户端类型(浏览器、手机客户端、远程调用)

         业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。

         持久层dao:一般是不校验的。

springmvc检验需求

springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。

校验思路:

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

具体需求:

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

环境准备

hibernate的校验框架validation所需要jar包:

 

配置校验器-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>

将validator加到处理器适配器

配置方式一(推荐)

<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>

配置方式二

<!-- 自定义webBinder -->
	<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="webBindingInitializer" ref="customBinder"></property>
	</bean>

在pojo中添加校验规则

在ItemsCustom.java中添加校验规则:

建立 CustomValidationMessages.properties配置文件

捕获校验错误信息

 

//在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校 验出错信息

   //注意:@ValidatedBindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。

controller

	@RequestMapping("/editItemsSubmit")
	public String editItemsSubmit(Model model ,Integer id,@Validated ItemsCustormer itemsCustormer,BindingResult bindingResult)throws Exception{
		List<ObjectError> allErrors =null;
		//获取校验错误信息 
		if(bindingResult.hasErrors()){
			allErrors = bindingResult.getAllErrors();
			for (ObjectError objectError:allErrors){
				System.out.println(objectError.getDefaultMessage());
			}	
		}
		
		model.addAttribute("allErrors", allErrors);
		
		//出错返回到商品页面 
		return "items/editItem";
		
		//调用service方法 页面需要将商品信息传到此方法 
		//.......
		//itemsService.updateItem(id, itemsCustormer);
		
		
		//返回modelAndView
		//ModelAndView modelAndView = new ModelAndView();
		//返回一个成功页面 
		//modelAndView.setViewName("success");

	}

jsp页面

页面显示错误信息jstl表达式获取 

<%@ 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"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改商品信息</title>

</head>
<body> 
<!-- 显示错误信息 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors }" var="error">
${ error.defaultMessage}
</c:forEach>
</c:if>
<form id="itemForm" action="${pageContext.request.contextPath }/items/editItemsSubmit.action" method="post">
<input type="hidden" name="id" value="${item.id }"/>
修改商品信息:
<table width="100%" border=1>
<tr>
	<td>商品名称</td>
	<td><input type="text" name="name" value="${item.name }"/></td>
</tr>
<tr>
	<td>商品价格</td>
	<td><input type="text" name="price" value="${item.price }"/></td>
</tr>
<tr>
	<td>商品生产日期</td>
	<td><input type="text" name="createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
</tr>
<tr>
	<td>商品图片</td>
	<td>
		<c:if test="${item.pic !=null}">
			<img src="/pic/${item.pic}" width=100 height=100/>
			<br/>
		</c:if>
		<input type="file"  name="pictureFile"/> 
	</td>
</tr>
<tr>
	<td>商品简介</td>
	<td>
	<textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
	</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"/>
</td>
</tr>
</table>

</form>
</body>

</html>

测试:

出现乱码,但是功能已经实现 

分组校验

需求

在pojo中定义校验规则,而pojo是被多个 controller所共用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

解决方法:

定义多个校验分组(其实是一个java接口),分组中定义有哪些规则

每个controller方法使用不同的校验分组

检验分组

创建接口,不需要定义任何方法只需要添加备足 被哪些腰间规则应用 

在校验规则中添加分组

在controller方法中使用指定分组的校验

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值