SpringMVC 校验及国际化
SpringMVC校验
针对于插入数据和修改数据时,可以利用校验来对数据进行检验
校验所需
- 需要校验的bean对象
- 配置messageSource消息源
- 自定义Validator实现类
- 错误信息配置文件
- Controller交互类
- 前端页面(<f:form>标签)
配置MessageSource消息源消息源
在之前使用org.springframework.context.support.ReloadableResourceBundleMessageSource时,会有报错,所以更改成org.springframework.context.support.ResourceBundleMessageSource,实践可行。
<!-- 配置MessageSource消息源 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!--
此处的配置文件是放在resources底下
可放在/WEB-INF/下
-->
<property name="basename" value="msg"/>
</bean>
Validator实现类
public class StuValidate implements Validator {
/**
* 用于指定当前类是否支持校验
* @param clazz
* @return
*/
@Override
public boolean supports(Class<?> clazz) {
// 判断是否是Student类
return Student.class.isAssignableFrom(clazz);
}
/**
* 具体校验方法
* @param target 目标对象
* @param errors
*/
@Override
public void validate(Object target, Errors errors) {
Student stu = (Student) target;
/**
* errorCode:对应于msg配置文件的key
* field:对应于校验的实体类的属性名
*/
ValidationUtils.rejectIfEmpty(errors,"stuNo","stu.no");
ValidationUtils.rejectIfEmpty(errors,"stuName","stu.name");
ValidationUtils.rejectIfEmpty(errors,"stuSex","stu.sex");
ValidationUtils.rejectIfEmpty(errors,"stuAge","stu.age");
Integer age = stu.getStuAge();
// 判断age属性
if(age < 0){
errors.rejectValue("stuAge","stu.age.invalidate");
}
}
}
错误信息配置文件
stu.no=the stuNo of employee cannot be empty.
stu.name=the stuName of employee cannot be empty.
stu.age=the stuAge of employee cannot be empty.
stu.sex=the stuSex of employee cannot be empty.
stu.age.invalidate=the stuAge of employee cannot be negative.
Controller
@Controller
public class ValidatorController {
/**
* 校验
* @return
*/
@GetMapping("/saveStu")
public ModelAndView saveStu(){
return new ModelAndView("validate","student",new Student());
}
/**
* 此处的Student对象名必须为student,对象名小写
* @param student 前端封装对象数据
* @param errors 错误信息集合
* @param model 模型对象
* @return
*/
@PostMapping("/saveStu")
public String saveStu( Student student, BindingResult errors, Model model) {
StuValidate sv = new StuValidate();
sv.validate(student, errors);
// 如果错误集合中存在错误信息
if (errors.hasErrors()) {
// 将前端输入的信息再返回前端
model.addAttribute("student", student);
return "validate";
}
return "success";
}
}
注意:在调用校验对象的方法中的参数里,前端传回来的对象参数必须写成bean小写,不能简写或写成其他名字
前端
/WEB-INF/view/saveEmp.jsp, 该页面要注意,引入了Spring MVC的form标签,表单使用的就是SpringMVC的form表单
-
f:form:使用的是Spring MVC的form标签,里面有一个属性叫做modelAttribute,这个值是从后端传递过来的对象名,注意要与bean的小写方式一致(必须项!!)
-
f:input类似于html中的input标签,但是将name换成了path,代表的是bean的属性名
-
f:errors,这个标签可以用来展示如果当前表单有错误信息时,可以在对应的域之上进行回显,一般都被放在对应的f:input标签之后,用来描述该属性的错误信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 使用spring框架的标签 -->
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>index</title>
</head>
<body>
<f:form action="saveStu" method="post" modelAttribute="student">
stuNo:<f:input path="stuNo"/> <f:errors path="stuNo"/><br>
stuName:<f:input path="stuName"/><f:errors path="stuName"/><br>
stuAge:<f:input path="stuAge"/><f:errors path="stuAge"/><br>
stuSex:<f:input path="stuSex"/><f:errors path="stuSex"/><br>
<input type="submit" value="sub">
</f:form>
</body>
</html>
遇到的问题
- 在resources下放置两个错误信息配置文件:msg_en_US.properties和msg_zh_CN.properties时,会出现乱码问题
解决办法:将中文的配置文件移除即可
- 在提交之后,报错显示前端页面语句错误时,往往不是真的前端错误,可能是配置文件放置位置 或者 消息源配置的类型无法使用 或者 提交数据后,接受数据的对象不是bean小写方式的问题。
配置文件问题:也可以尝试将配置文件放在/WEB-INF下,将读取配置文件的xml更改读取路径
消息源配置问题:将ReloadableResourceBundleMessageSource换ResourceBundleMessageSource
接受数据问题:在@ModelAttribute接受的对象数据的参数里,必须写成bean实体类的全名称小写
- 错误信息乱码问题,在提交表单后,提示出来的错误信息如果出现乱码
解决办法:注意配置文件的编码格式需要是UTF-8;或者浏览器设置语言问题
未解决的问题
此demo还存在许多漏洞,当我将配置文件放在/WEB-INF下时,发现一直报错
org. apache. jasper. JasperException: org. spr ingframework. cont ext. NoSuchMessageException: No message found under code’ emp. name’’for locale’ zh_ _CN .或者locale’ en’
但我的配置文件都有这些所需要的文件和内容
心态崩了,巨tm奇怪!!
上一篇: jQuery 源码分析笔记(7) Queue_jquery
下一篇: 「Python」应该怎么发音?