欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC 校验及国际化

程序员文章站 2022-05-24 14:45:26
...

SpringMVC校验

​ 针对于插入数据和修改数据时,可以利用校验来对数据进行检验

校验所需

  1. 需要校验的bean对象
  2. 配置messageSource消息源
  3. 自定义Validator实现类
  4. 错误信息配置文件
  5. Controller交互类
  6. 前端页面(<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>



遇到的问题

  1. 在resources下放置两个错误信息配置文件:msg_en_US.propertiesmsg_zh_CN.properties时,会出现乱码问题

解决办法:将中文的配置文件移除即可

  1. 在提交之后,报错显示前端页面语句错误时,往往不是真的前端错误,可能是配置文件放置位置 或者 消息源配置的类型无法使用 或者 提交数据后,接受数据的对象不是bean小写方式的问题。

配置文件问题:也可以尝试将配置文件放在/WEB-INF下,将读取配置文件的xml更改读取路径

消息源配置问题:将ReloadableResourceBundleMessageSourceResourceBundleMessageSource

接受数据问题:在@ModelAttribute接受的对象数据的参数里,必须写成bean实体类的全名称小写

  1. 错误信息乱码问题,在提交表单后,提示出来的错误信息如果出现乱码

解决办法:注意配置文件的编码格式需要是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奇怪!!