SpringMVC和FreeMarker整合Hibernate-validator在頁面渲染校驗錯誤信息

1、整合背景
項目中使用了SpringMVC整合FreeMarker作爲頁面渲染,在後臺管理端頁面存在大量的form輸入項,每個輸入項在提交到Controller層時都需要對數據的有效性進行校驗,工作量非常大而且繁瑣。

2、校驗框架
爲了解決數據校驗的問題,調研了一下Hibernate-validator,發現該框架功能非常的全面,能很好的解決我遇到的數據校驗問題,官方文檔:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-gettingstarted-createproject
Hibernate-validator 的優勢:
支持校驗規則分組
支持國際化錯誤消息
支持錯誤的fail-fast模式:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast
支持自定義校驗註解

3、校驗依賴包

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>5.3.5.Final</version>
</dependency>
<dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>1.1.0.Final</version>
</dependency>

4、示例代碼

UserDemoDO .java


import com.jd.jdpetrol.dao.enums.YNEnum;
import org.apache.ibatis.type.Alias;
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.constraints.NotNull;

@Alias("UserDemoDO")
public class UserDemoDO {

    @NotNull
    private Long id;

    @NotBlank
    private String name;

    private YNEnum yn;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public YNEnum getYn() {
        return yn;
    }

    public void setYn(YNEnum yn) {
        this.yn = yn;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("UserDemo{");
        sb.append("id=").append(id);
        sb.append(", name='").append(name).append('\'');
        sb.append('}');
        return sb.toString();
    }

    public static void main(String[] args) {
        String str = "/abc";
        if (str.startsWith("/")) {
            System.out.println(str.substring(1));
        }
    }

}

import java.util.HashMap;
import java.util.Map;

/**
 * Created by XFrame on 2016/1/29.
 */
public enum YNEnum {

    VALID(1, "有效"),
    INVALID(0, "無效");

    YNEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    private Integer code;

    private String desc;

    private static Map<Integer, YNEnum> map = new HashMap<Integer, YNEnum>();

    static {
        for (YNEnum ele : values()) {
            map.put(ele.code, ele);
        }
    }

    public static YNEnum getByCode(Integer code) {
        return map.get(code);
    }

    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

}

UserDemoController .java

@Controller
@RequestMapping("/demo")
public class UserDemoController {

    @RequestMapping("/user2")
    public String index(ModelMap model) {//UserDemoDO userVo

        UserDemoDO userVo = new UserDemoDO();

        model.addAttribute("userDemoDO", userVo);

        return "userdemo/user2";
    }

    @RequestMapping(value = "/user", method = POST)
    //@ResponseBody
    public ModelAndView addUser(@Validated UserDemoDO user, BindingResult br) {

        ModelAndView modelView = new ModelAndView();
        modelView.setViewName("userdemo/user2");

        //基礎校驗
        if (br.hasErrors()) {


            return modelView;
        }
        user.setYn(YNEnum.VALID);

        //userDemoService.save(user);

        return modelView;
    }
}

5、FreeeMarker 頁面

<!DOCTYPE html>

<html>
<head>
    <meta charset="UTF-8">
    <title>user demo</title>
    <style>
        .outer {
            margin-top: 20px;
        }
    </style>
</head>
<body>

<#import "/spring.ftl" as spring/>

<div class="outer">
    <form action="/demo/user/" name="user" method="post">

        <@spring.bind "userDemoDO.id" />
        用戶Id:<input type="text" id="id" name="id"/> <br/>
        <@spring.showErrors "<br>"/>


        用戶名:<input type="text" id="name" name="name"/> <br/>

        <input type="submit" value="提交">

        <br>
        <#if userDemoDO??>

            <@spring.bind "userDemoDO.id" />
            <#--<@spring.showErrors "<br>"/>-->
            <@spring.bind "userDemoDO.name" />

            <#list spring.status.errorMessages as error> <b>${error}</b> <br> </#list>

            <br>****************11****************<br>

            <@spring.bind "userDemoDO.*" />

            <@spring.showErrors "<br>"/>

        </#if>
            --------------------
        <br>
        <br>

       =====================333========================
    </form>

</div>

</body>
</html>

6、校驗效果
這裏寫圖片描述

7、解析錯誤信息的核心源代碼
org.springframework.web.servlet.support.BindStatus
這裏寫圖片描述

8、參考文章:
http://yunzhu.iteye.com/blog/2088548
http://hualong.iteye.com/blog/2038092
http://blog.csdn.net/fengyong7723131/article/details/54668905
PDF 文檔下載:https://pan.baidu.com/s/1htA4BAG

有問題歡迎加qq:787141854 交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章