Springmvc-Validate(数据校验)
数据校验概述
1、项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。
2服务端校验:
-控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
-业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
-持久层dao:一般是不校验的。
3、springmvc使用hibernate的校验框架validation
-校验思路:
-页面提交请求的参数,请求到controller方法中,使用validation进行校验。
-如果校验出错,将错误信息展示到页面
4、数据校验步骤
-springmvc数据校验步骤
1、导入校验jar文件
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
2、配置校验器
<!-- 配置数据校验的校验器bean
-->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<property name="validationMessageSource" ref="messageResource"></property>
</bean>
<!-- 校验信息提供的资源文件bean -->
<bean id="messageResource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:validationMessageResource</value>
</list>
</property>
<property name="fileEncodings" value="utf-8"></property>
</bean>
3、校验器注入到处理器适配器中
这段配置validator属性意思是:在调用controller方法之后,马上 让数据校验bean开始工作,对数据进行校验
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
4、添加校验规则
在domain包里的类添加校验规则
5、错误信息文件
把配置文件放到类路径中
6、捕获错误信息
//如果controller方法绑定的参数需要框架帮你校验,那么你要说一声--在参数前面加个注解@Validated
@RequestMapping("/addProduct.do")
public String addProduct(@Validated Product product ,BindingResult bindingResult,Model model) {
//当进入到本方法时,参数校验应该已经搞定了,我们可以获取校验的结果了,可以通过绑定参数bindingResult拿到
if(bindingResult.hasErrors()) {
List<FieldError> list=bindingResult.getFieldErrors();
for(FieldError fe:list) {
System.out.println(fe.getDefaultMessage());
}
}
7、显示错误信息
在后台controller
//校验完了想返回页面查询校验出错信息怎么办?
model.addAttribute("fieldErrors",bindingResult.getFieldErrors());
model.addAttribute("product", product);
在jsp页面
<!-- 页面怎样展示出错数据呢?c标签 -->
<c:if test="${fieldErrors!=null}">
<c:forEach items="${fieldErrors}" var="f">
${f.defaultMessage}
</c:forEach>
</c:if>
<form action="${pageContext.request.contextPath}/addProduct.do" method="post">
商品名称:<input type="text" name="name" value="${product.name}"/><br>
商品单价:<input type="text" name="price" value="${product.price}"/><br>
生产日期:<input type="text" name="birth" value="${product.birth}"/><br>
商品描述:<input type="text" name="desc" value="${product.desc}"/><br>
<input type="submit" value="添加"/>
</form>