1、spring-mvc.xml的配置
配置MessageSource,即消息源
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/msg" />
</bean>
这个bean的id必须叫做messageSource。
在resource目录下创建一个properties配置文件,Spring MVC框架会读取该id所对应的bean对象来读取资源配置文件,里面设置了basename属性,用作读取该文件,该文件的配置只需要文件名,不能加后缀。
msg.properties
book.id=not empty.
book.name=书名不能为空
book.price=not empty.
book.price.invalidate=价格不能为负数.
2、创建一个BookBeanValidate类
创建一个BookBeanValidate类实现Validator接口
里面包含两个方法:supports和validate
supports:
@Override
public boolean supports(Class<?> clazz) {
return BookBean.class.isAssignableFrom(clazz);
}
supports方法的意思是当前类用来对于哪个类实现校验
BookBean.class.isAssignableFrom(clazz);意思是完成对BookBean的校验
validate:
@Override
public void validate(Object target, Errors errors) {
BookBean bookBean = (BookBean) target;
/**
*
* 非空校验
*
* 使用ValidationUtils工具类来实现对于某些非空字段的校验,该方法包含三个参数:
* 1. 错误对象,用来收集并存储错误信息
* 2. 要校验的字段
* 3. 错误码,在msg配置文件中配置的key信息
*/
ValidationUtils.rejectIfEmpty(errors, "id", "book.id");
ValidationUtils.rejectIfEmpty(errors, "name", "book.name");
ValidationUtils.rejectIfEmpty(errors, "price", "book.price");
double price = bookBean.getPrice();
/**
* 合法性校验,使用errors对象的rejectValue()方法完成合法性校验,里面包含了两个参数
*
* 1. field,在哪个字段上完成校验
* 2. 错误码,会在msg文件中找到该key对应的错误信息
*/
if(price < 0){
errors.rejectValue("price", "book.price.invalidate");
}
}
validate方法,完成真正的校验,一定是满足了supports方法之后才会进入该方法来进行校验。
分为两种校验。一种为非空校验,使用ValidationUtils工具类来实现对于某些非空字段的校验。一种为合法性校验。使用errors对象的rejectValue()方法完成合法性校验。什么是合法性校验,如本例就是price不能为负,若为负则不合法。
3、校验页面,以新增页面save.jsp为例
该页面要注意引入Spring MVC的form标签,表单使用的就是SpringMVC的form表单
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>
(1)f:form:使用的是Spring MVC的form标签,里面有一个属性叫做commandName,这个值是从后端传递过来的对象名,注意要与bean的小写方式一致
(2)f:input类似于html中的input标签,但是将name换成了path,代表的是属性名
(3)f:errors,这个标签可以用来展示如果当前表单有错误信息时,可以在对应的域之上进行回显,一般都被放在对应的f:input标签之后,用来描述该属性的错误信息
<f:form method="post" action="/save" commandName="bookBean">
编号:<input path="id"><font color="red"><f:errors path="id" /></font> <br>
书名:<input path="name"><font color="red"><f:errors path="name" /></font> <br>
价格:<input path="price"><font color="red"><f:errors path="price" /></font> <br>
<input type="submit" value="submit">
</f:form>
4、Controller控制器
@GetMapping("/save")
public ModelAndView save(){
return new ModelAndView("save.jsp", "bookBean", new BookBean());
}
GetMapping("/save")代表以get方式请求该资源,里面写了一个ModelAndView对象,传了三个参数,第一个是viewname,视图名,拼接上前后缀可以得到真正的物理视图,来打开该物理视图所对应的页面,第二个参数为modelname,模型名,相当于给模型起名字,这里要注意,该模型名意识要被叫做bean对象的小写形式BookBean (bookBean),第三个参数为modelObject,模型对象,将该对象通过模型名传递给第一个参数viewname所对应的页面,在那个页面中可以渲染该数据。
总的来说就是以get方式请求去save页面
@PostMapping("/save")
public String save(BookBean bookBean, BindingResult errors, Model model){
BookBeanValidate bv = new BookBeanValidate();
bv.validate(bookBean, errors);
if(errors.hasErrors()){
model.addAttribute("book", bookBean);
return "save.jsp";
}
return "redirect:/book";
}
PostMapping("/save"),该注解的意思是页面上的表单通过post请求将save的请求来在这里进行处理。该方法包含有三个参数,第一个是BookBean对象,可以自动封装表单中的属性为Bean对象,第二个参数为BindingResult对象,该对象我们通过源码可以发现是Spring中的Errors的子接口,可以用来接收并存储错误信息,这个对象可以接收从BookBeanValidate校验类中产生的错误信息,存储以交给错误页面的f:errors标签来展示错误信息,第三个参数是Model对象,可以用来储存对象,目的是可以使的bean对象的错误数据进行回显。