SpringMVC数据校验

数据校验

B/S系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑。但是在一些安全性要求高的系统中服务端校验是不可缺少的,SpringMVC实现控制层添加校验。SpringMVC使用Hibernate Validator的校验框架(和Hibernate ORM没有任何关系)

1. 前端校验

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center">
        <h1>数据验证</h1>
        <p><a href="views/front.jsp">前端验证</a></p>
        <p><a href="views/add.jsp">员工新增</a></p>
        <p><a href="views/edit.jsp">员工编辑</a></p>
    </div>
</body>
</html>

front.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        //客户端验证
        //优点:快捷,减轻服务器的压力
        //缺点:可控制性低
        function doVaildate(){
            var ename = $('#ename').val().trim();
            var job = $('#job').val().trim();
            var sal = $('#sal').val().trim();
            if(ename==null || ename==''){
                alert('员工姓名不能为空');
                return false;
            }
            var reg1 = /^\S{2,8}$/;
            if(!reg1.test(ename)){
                alert('员工姓名必须为2~8位非空白字符');
                return false;
            }
            if(job==null || job==''){
                alert('员工岗位不能为空');
                return false;
            }
            if(sal==null || sal==''){
                alert('员工薪资不能为空');
                return false;
            }
            var reg2 = /^\d+(.\d{1,2})?$/;
            if(!reg2.test(sal)){
                alert('员工薪资必须为整数或两位小数');
                return false;
            }
            return true;
        }
    </script>
</head>
<body>
    <div style="text-align: center;">
        <h3>前端验证</h3>
        <form action="views/success.jsp" method="post" onsubmit="return doVaildate()" >
            <p>员工姓名:<input type="text" id="ename" name="ename"></p>
            <p>员工岗位:<input type="text" id="job" name="job"></p>
            <p>员工薪资:<input type="text" id="sal" name="sal"></p>
            <p><button>提交</button></p>
        </form>
    </div>
</body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center">
        <h1>操作成功</h1>
    </div>
</body>
</html>

2. maven依赖

导入hibernate-validator的jar包

在这里插入图片描述

<dependencies>
    <!-- spring核心包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springbean包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springcontext包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- spring表达式包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springAOP包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springAspects包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- spring对web的支持 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springwebMVC -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>

    <!-- 配置javaweb环境 -->
    <!-- servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    <!-- jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <!-- jackson -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.5</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.5</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.5</version>
    </dependency>

    <!-- Hibernate Validator -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.4.1.Final</version>
    </dependency>
</dependencies>

3. SpringMVC配置

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--字符编码过滤器-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 通过隐藏域传参解决form表单的PUT与DELETE方式的请求 -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 解决put请求传递参数的问题-->
    <filter>
        <filter-name>HttpPutFormContentFilter</filter-name>
        <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HttpPutFormContentFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>/views/index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- springmvc的注解式开发 -->
    <!-- 开启组件扫描 -->
    <context:component-scan base-package="com.newcapec"/>

    <!-- MVC注解驱动 -->
    <mvc:annotation-driven validator="validator"/>

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置视图地址的前缀和后缀:简化视图地址 -->
        <property name="prefix" value="/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--不拦截静态资源-->
    <mvc:default-servlet-handler/>

    <!-- 配置springmvc的数据校验器-->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- 配置hibernate-validator框架中的数据校验器-->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
    </bean>
</beans>

4. 校验注解规则

4.1 Bean Validator内置的注解

校验注解校验的数据类型说明
@AssertFalseBoolean,boolean被注释的元素值必须为false
@AssertTrueBoolean,boolean被注释的元素值必须为true
@DecimalMax(value)BigDecimal,BigInteger,byte,short,int,long以及基本数据类型相应的包装类,任何Number的子类型,String(由String表示的数值)被注释的元素值必须小于等于@DecimalMax指定的value值
@DecimalMin(value)和@DecimalMax要求一样被注释的元素值必须大于等于@DecimalMin指定的value值
@Digits (integer=整数位, fraction=小数位)和@DecimalMax要求一样被注释的元素值的整数位数和小数位数上限
@Futurejava.util.Date,java.util.Calendar,Joda Time类库的日期类型被注释的元素值必须比当前时间晚
@Max(value)和@DecimalMax要求一样被注释的元素值必须小于等于@Max指定的value值
@Min(value)和@DecimalMax要求一样被注释的元素值必须大于等于@Min指定的value值
@NotNull任意类型被注释的元素值必须不为null
@Null任意类型被注释的元素值必须为null
@Past和@Future要求一样被注释的元素值必须比当前时间早
@Pattern(regex=正则表达式,flag=标志模式)字符串被注释的元素值必须符合指定的正则表达式
@Size(max=, min=)字符串,Collection集合,Map集合,数组被注释的元素值的大小必须在指定的范围内

4.2 Hibernate Validator拓展的注解

校验注解校验的数据类型说明
@Email字符串被注释的元素值必须是电子邮箱地址
@Length(min=,max=)字符串被注释的元素值的大小必须在指定的范围内
@NotBlank字符串被注释的元素值必须非空,非空值或非全空白字符。功能强大于@NotEmpty
@NotEmpty字符串,Collection集合,Map集合,数组被注释的元素值必须非空或非空值。功能强于@NotNull
@Range(min=,max=)BigDecimal,BigInteger,byte,short,int,long以及基本数据类型相应的包装类被注释的元素值必须在合适的范围内

5. 添加校验规则

Hibernate Validator是通过注解的方式对实体类中的成员变量进行校验,即在成员变量上配置校验规则

/**
 * hibernate validator数据验证框架
 * 作用:通过注解的方式进行数据验证,注解需要添加在实体的成员变量上
 *
 * 注解中通过的属性:
 * message: 当前验证失败时给用户提示信息
 */
public class Emp {

    private Integer empno;
    @NotBlank(message = "员工姓名不能为空")
    @Length(message = "员工姓名必须为2~8位字符",min = 2, max = 8)
    private String ename;
    @NotBlank(message = "员工岗位不能为空")
    private String job;
    @NotNull(message = "员工薪资不能为空")
    @DecimalMin(message = "员工薪资不能低于1000",value = "1000")
    private Double sal;

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}

6. 捕获校验错误信息

@Controller
@RequestMapping("/emp")
public class EmpController {

    /**
     * 开启数据验证
     * @Validated
     * 位置:形参
     * 作用:开启了请求参数的验证
     *
     * 注意:@Validated注解不能单独使用,需要在每个开启数据验证的形参后,跟随一个BindingResult类型的形参
     *      BindingResult:判断数据是否验证通过,并接收验证失败信息
     */
    @RequestMapping("/add")
    public String add(@Validated Emp emp, BindingResult bindingResult, Model model){
        System.out.println(emp);
        //判断数据验证是否通过
        if(bindingResult.hasErrors()) {
            //数据验证没有全部通过
            List<ObjectError> list = bindingResult.getAllErrors();
            for (ObjectError objectError : list) {
                //getDefaultMessage()获取验证失败信息
                System.out.println(objectError.getDefaultMessage());
            }
            model.addAttribute("errors", list);
            return "add";
        }
        return "success";
    }
}

注意:@Validated表示在对Controller方法形参绑定时进行校验,校验信息写入BindingResult中,在要校验的实体类后边添加BingdingResult,一个BindingResult对应一个实体类,且BingdingResult放在实体类的后边

7. 在页面显示校验错误信息

在Controller中已经把错误列表对象存入作用域中,在页面直接取出,遍历并显示即可

add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h3>员工新增</h3>
        <div style="color: red;">
            <ol>
                <c:forEach items="${errors}" var="e">
                    <li>${e.defaultMessage}</li>
                </c:forEach>
            </ol>
        </div>
        <form action="emp/add" method="post">
            <p>员工姓名:<input type="text" name="ename"></p>
            <p>员工岗位:<input type="text" name="job"></p>
            <p>员工薪资:<input type="text" name="sal"></p>
            <p><button>提交</button></p>
        </form>
    </div>
</body>
</html>

8. 分组校验

如果两处校验使用同一个实体类则可以设定校验分组,通过分组校验可以对每处的校验个性化

8.1 定义分组标识

定义分组标识,就是定义一个空接口

public interface EmpAddValidator {
}

public interface EmpEditValidator {
}

8.2 在校验规则中添加分组

/**
 * hibernate validator数据验证框架
 * 是通过注解的方式对数据进行验证
 * 注解需要添加在实体类的属性上,因为在springmvc中是通过实体类类型的形参接收请求参数
 *
 * 注解中通用的属性:
 * message : 当前验证失败是给用户的提交信息
 * groups : 分组校验
 */
public class Emp {
    @NotNull(message = "员工编号不能为空",groups= EmpEditValidator.class)
    private Integer empno;
    // @NotBlank(message = "员工姓名不能为空")
    @NotBlank(message = "员工姓名不能为空",groups= {EmpEditValidator.class, EmpAddValidator.class})
    // @Length(message = "员工姓名必须为2~8位字符",min = 2, max = 8)
    @Length(message = "员工姓名必须为2~8个字符", min = 2, max = 8,groups= {EmpEditValidator.class, EmpAddValidator.class})
    private String ename;
    // @NotBlank(message = "员工岗位不能为空")
    @NotBlank(message = "员工岗位不能为空",groups= {EmpEditValidator.class, EmpAddValidator.class})
    private String job;
    // @NotNull(message = "员工薪资不能为空")
    @NotNull(message = "员工薪资不能为空",groups= {EmpEditValidator.class, EmpAddValidator.class})
    // @DecimalMin(message = "员工薪资不能低于1000",value = "1000")
    @DecimalMin(message = "员工薪资不能低于1000", value = "1000", groups = {EmpEditValidator.class, EmpAddValidator.class})
    private Double sal;

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}

8.3 在@Validated注解中指定分组

@Controller
@RequestMapping("/emp")
public class EmpController {

    /**
     * 开启数据验证
     * @Validated
     * 位置:形参
     * 作用:开启了请求参数的验证
     * 属性:指定分组
     *
     * 注意:@Validated注解不能单独使用,需要在每个开启数据验证的形参后,跟随一个BindingResult类型的形参
     *      BindingResult:判断数据是否验证通过,并接收验证失败信息
     */
    @RequestMapping("/add")
    public String add(@Validated(EmpAddValidator.class) Emp emp, BindingResult bindingResult, Model model){
        System.out.println(emp);
        //判断数据验证是否通过
        if(bindingResult.hasErrors()) {
            //数据验证没有全部通过
            List<ObjectError> list = bindingResult.getAllErrors();
            for (ObjectError objectError : list) {
                //getDefaultMessage()获取验证失败信息
                System.out.println(objectError.getDefaultMessage());
            }
            model.addAttribute("errors", list);
            return "add";
        }
        return "success";
    }

    @RequestMapping("/edit")
    public String edit(@Validated(EmpEditValidator.class) Emp emp, BindingResult bindingResult, Model model){
        System.out.println(emp);
        //判断数据验证是否通过
        if(bindingResult.hasErrors()) {
            //数据验证没有全部通过
            List<ObjectError> list = bindingResult.getAllErrors();
            model.addAttribute("errors", list);
            return "edit";
        }
        return "success";
    }
}

8.4 编辑页面

edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h3>员工编辑</h3>
        <div style="color: red;">
            <ol>
                <c:forEach items="${errors}" var="e">
                    <li>${e.defaultMessage}</li>
                </c:forEach>
            </ol>
        </div>
        <form action="emp/edit" method="post">
            <p>员工编号:<input type="text" name="empno"></p>
            <p>员工姓名:<input type="text" name="ename"></p>
            <p>员工岗位:<input type="text" name="job"></p>
            <p>员工薪资:<input type="text" name="sal"></p>
            <p><button>提交</button></p>
        </form>
    </div>
</body>
</html>

9. 错误提示信息资源文件

9.1 资源文件

当属性值校验失败后,其提示信息可配置在一个资源文件中,文件名称默认为classpath:ValidationMessages.properties

emp.empno.NotNull=员工编号不能为空--2
emp.ename.NotBlank=员工姓名不能为空--2
emp.ename.Length=员工姓名必须为2~8位字符--2
emp.job.NotBlank=员工岗位不能为空--2
emp.salary.NotNull=员工薪资不能为空--2
emp.salary.DecimalMin=员工薪资不能低于1000--2

9.2 实体类

在实体中通过{}引用资源文件中的数据

/**
 * hibernate validator数据验证框架
 * 是通过注解的方式对数据进行验证
 * 注解需要添加在实体类的属性上,因为在springmvc中是通过实体类类型的形参接收请求参数
 *
 * 注解中通用的属性:
 * message : 当前验证失败是给用户的提交信息
 * groups : 分组校验
 */
public class Emp {
    // @NotNull(message = "员工编号不能为空",groups= EmpEditValidator.class)
    @NotNull(message = "{emp.empno.NotNull}",groups= EmpEditValidator.class)
    private Integer empno;
    // @NotBlank(message = "员工姓名不能为空")
    // @NotBlank(message = "员工姓名不能为空",groups= {EmpEditValidator.class, EmpAddValidator.class})
    @NotBlank(message = "{emp.ename.NotBlank}",groups= {EmpEditValidator.class, EmpAddValidator.class})
    // @Length(message = "员工姓名必须为2~8位字符",min = 2, max = 8)
    // @Length(message = "员工姓名必须为2~8个字符", min = 2, max = 8,groups= {EmpEditValidator.class, EmpAddValidator.class})
    @Length(message = "{emp.ename.Length}", min = 2, max = 8,groups= {EmpEditValidator.class, EmpAddValidator.class})
    private String ename;
    // @NotBlank(message = "员工岗位不能为空")
    // @NotBlank(message = "员工岗位不能为空",groups= {EmpEditValidator.class, EmpAddValidator.class})
    @NotBlank(message = "{emp.job.NotBlank}",groups= {EmpEditValidator.class, EmpAddValidator.class})
    private String job;
    // @NotNull(message = "员工薪资不能为空")
    // @NotNull(message = "员工薪资不能为空",groups= {EmpEditValidator.class, EmpAddValidator.class})
    @NotNull(message = "{emp.salary.NotNull}",groups= {EmpEditValidator.class, EmpAddValidator.class})
    // @DecimalMin(message = "员工薪资不能低于1000",value = "1000")
    // @DecimalMin(message = "员工薪资不能低于1000", value = "1000", groups = {EmpEditValidator.class, EmpAddValidator.class})
    @DecimalMin(message = "{emp.salary.DecimalMin}", value = "1000", groups = {EmpEditValidator.class, EmpAddValidator.class})
    private Double sal;

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}

9.3 配置

错误提示信息资源文件也可自定义名称和位置,配置如下:

<!-- 配置springmvc的数据校验器-->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <!-- 配置hibernate-validator框架中的数据校验器-->
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
    <!-- 在springmvc的数据校验中,默认的资源文件classpath:ValidationMessages.properties -->
    <!-- 指定校验使用的资源文件-->
    <property name="validationMessageSource" ref="validationMessageSource"></property>
</bean>
<!-- 配置validationMessageSource -->
<bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!-- 指定校验信息的资源文件的基本文件名称,不包括后缀,后缀默认是properties -->
    <property name="basenames">
        <list>
            <value>classpath:message</value>
        </list>
    </property>
    <!-- 指定文件的编码
    改属性为properties属性 , 键的值为  文件名字加路径名   乱码需要在此处配置utf-8即可
    -->
       <property name="fileEncodings" >
            <props>
                <prop key="classpath:message">utf-8</prop>
            </props>
        </property>
    <!-- 对资源文件内容缓存的时间,单位秒 -->
    <property name="cacheSeconds" value="120"></property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JTZ001

你的鼓励是我创作的最大动力?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值