JSR-303后端效验+前端效验及正则表达式和双form表单的使用教程【实战超详细】

主要内容      

目录

一.正则表达式

前言

普通字符

非打印字符

特殊字符

限定符

定位符

二.【登录实列】用户名+密码前后端

前端效验

后端效验

后端效验的另一个controller层做jsr验证的写法

三.前端效验

jQuery效验手机号|身份证|邮箱|金钱|日期|单选框|下拉框|复选框实列【一看就会】

 手机号: 要求:以13/15/18开头11位手机号

【单选框】性別: 要求:验证性别必选

【下拉框】类型: 要求:必须选择一个

【复选框】兴趣: 要求:至少选择一个

邮箱: 要求 xxx@xx.xxxx格式

身份证号: 要求:16位数字 最后一位是校验位,可能为数字或字符X x

金钱: 要求:可以整数或一位小数或两位小数

日期: 要求满足日期格式 yyyy-MM-dd

实列代码的效果展示

四.前端效验优化版【数组实现正则效验】

五.注解效验

后端注解效验(值/范围/长度/格式)

1.值效验

1.1@Null 注解

1.2@NotNull 注解

1.3@NotBlank 注解

1.4 @NotEmpty注解

1.5 @AssertTrue注解

1.6 @AssertFalse注解

2 范围效验

2.1@Min(value)注解

2.2 @Max注解

2.3 @DecimalMin注解

2.4 @DecimalMax注解

2.5 @Range注解

2.6 @Past注解

2.7 @Future注解

2.8@Digits(integer,fraction)注解

3.长度效验

3.1 @Size注解

3.2 @Length注解

4 格式校验

4.1 @Digits注解

4.2 @Pattern注解

4.3 @Email注解

注解效验使用实列

Verify.java实体类

controller控制层代码 

html层

展示错误信息

@Valid和BindingResult的解释

六.SpringMVC的form:form标签简介

使用SpringMVC中双Form表单标签的优点:

1.在JSP中声明form标签库

2.form标签库常用标签

3.form标签常用属性

4.表单元素常用属性

双Form表单组件标签

双form共有属性

单选框组件标签

复选框组件标签

 下拉框组件标签

后端效验错误显示标签

正则表达式

前言

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

字符描述
[ABC]匹配[...]内所有字符
[^ABC]匹配除了 [...] 中字符的所有字符
[A-Z][A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
.匹配除换行符(\n、\r)之外的任何单个字符,类似\n\r
[\s\S]匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。
\w匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

非打印字符

非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:

字符描述
\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 \f\n\r\t\v。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。

特殊字符

所谓特殊字符,就是一些有特殊含义的字符,如上面说的".txt"中的,简单的说就是表示任何字符串的意思。如果要查找文件名中有的文件,则需要对进行转义,即在其前加一个\。ls *.txt。

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 () 放在它们前面。下表列出了正则表达式中的特殊字符:

特别字符描述
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 $。
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
.匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[标记一个中括号表达式的开始。要匹配 [,请使用 [。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。
^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{标记限定符表达式的开始。要匹配 {,请使用 {。
|指明两项之间的一个选择。要匹配 |,请使用 |。

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。

正则表达式的限定符有:

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。

正则表达式的限定符有:

字符描述
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b匹配一个字边界,即字与空格间的位置。
\B非字边界匹配。

【登录实列】用户名+密码前后端

前端效验

用户名/密码正则表达式

 /^[\u4e00-\u9fa5]{2,10}$/      2-10位汉字
 /^[a-zA-Z]\w{5,17}$/           以字母开头,长度在6~18之间,只能包含字母、数字和下划线

user实体类

public class User {
    private Integer id;
    private String name;
    private String password;
}
set/get/构造/toString省    (Alt+Ins一键生成)

后端controller控制层代码

//去登录
@RequestMapping(value = "tolog")
public String tolog(){
    return "log";
}
​
//登录页面
@RequestMapping(value = "log")
public String log(User user, Model model){
    User user1 =regVerifyService.findByUser(user);
    if(user1!=null){
        return "redirect:verify";
    }
    model.addAttribute("ERROR","账号或密码输入错误,请重新输入");
    return "log";
}

html代码

<form action="log" method="post">
        用户名: <input type="text" placeholder="请输入2-5位汉字" name="name" onblur="regName(this.value)">
                 <span id="name" style="color: red"></span><br>
        密码:<input type="text" onblur="regPwd(this.value)" placeholder="以字母开头,长度在6~18之间,只能包含字母、数字和下划线" name="password">
            <span id="password" style="color: red"></span><br>
            <input type="submit" value="登录"><span style="color: red">${ERROR}</span><br>
    </form>

javaScript代码

<script>
    //用户名
    function regName(uname) {
        var regname = /^[\u4e00-\u9fa5]{2,10}$/;
        if(!regname.test(uname)){
            $("#name").html("请输入2-10位汉字");
        }else{ $("#name").html("")}
    }
    //密码
    function regPwd(upwd) {
        var regpwd = /^[a-zA-Z]\w{5,17}$/;
        if(!regpwd.test(upwd)){
            $("#password").html("以字母开头,长度在6~18之间,只能包含字母、数字和下划线");
        }else{ $("#password").html("")}
    }
</script>

页面效果展示

后端效验

用户名/密码正则表达式

 /^[\u4e00-\u9fa5]{2,10}$/      2-10位汉字
 /^[a-zA-Z]\w{5,17}$/           以字母开头,长度在6~18之间,只能包含字母、数字和下划线

user实体类

public class User {
​
    private Integer id;
​
    /*@NotBlank  //不能为空,检查时会将空格忽略*/
    @Pattern(regexp = "^[\u4e00-\u9fa5]{2,5}$",message = "请输入2-10位汉字")
    private String name;
    @Pattern(regexp = "^[a-zA-Z]\\w{5,17}$",message = "以字母开头,长度在6~18之间,只能包含字母、数字和下划线")
    private String password;
}
set/get/构造/toString省    (Alt+Ins一键生成)

 controller控制层代码

@RequestMapping(value = "tologin")
public String tologin(@ModelAttribute User user){
    return "login";
}
@RequestMapping(value = "login")
public String login(@Validated User user, BindingResult result,Model model){
    if(result.hasErrors()){//判断格式是否正确
        return "login";
    }
    User user1 =regVerifyService.findByUser(user);//判断用户是否正确
    if(user1!=null){
        return "redirect:verify";
    }
    model.addAttribute("ERROR","账号或密码输入错误,请重新输入");
    return "login";
}

@Valid和BindingResult的解释

  • @Valid和BindingResult配套使用,@Valid用在参数前,BindingResult作为校验结果绑定返回。
 @Validation 是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束。 作用在类、方法和参数上 
BindingResult 用在实体类校验信息返回结果绑定 
bindingResult.hasErrors()判断是否校验通过,校验未通过, 
bindingResult.getFieldError().getDefaultMessage()获取在TestEntity的属性设置的自定义message,如果没有设置,则返回默认值"javax.validation.constraints.XXX.message"。

注意:在实体类使用校验注解时,controller一定要使用bindingResult处理校验结果,且实体类作为查询参数时,避免被其他方法使用,不然的地方需要限制,有的没有,不需要限制的方法会报错。

html代码

<form:form modelAttribute="user" method="post" action="login">
    用户名:<form:input path="name"></form:input>
    <form:errors path="name" cssStyle="color: red"></form:errors><br>
    密码:<form:input path="password"></form:input>
    <form:errors path="password" cssStyle="color: red"></form:errors><br>
    <input type="submit" value="登录"><span style="color: red">${ERROR}</span><br>
</form:form>

页面效果展示

后端效验的另一个controller层做jsr验证的写法

BindingResult下的rejectValue方法的使用

前端效验

前言

数据校验分为前端校验和后台校验,前端校验类似于后台校验的子级,在逻辑和安全方面没有后台校验的要求高。为什么使用了后台校验还要在页面上加入前端校验呢?

后台校验考虑的是数据安全,前台校验则考虑的是用户体验(花里胡哨)。

jQuery效验手机号|身份证|邮箱|金钱|日期|单选框|下拉框|复选框实列【一看就会】

先看要完成的实图

 手机号: 要求:以13/15/18开头11位手机号

html代码

手机号:<input type="text" name="phone" placeholder="以13/15/18开头11位" onblur="regPhone(this.value)">
<span id="phone" style="color: red"></span>

javaScrip代码

function regPhone(val) {
    var reg = /^1(3|5|8)\d{9}$/;
    if(!reg.test(val)){
        $("#phone").html("以13/15/18开头共11位手机号")
    }else{
        $("#phone").html("");
    }
}

【单选框】性別: 要求:验证性别必选

html代码

性别:<input type="radio" name="sex" value="0">男
    <input type="radio" name="sex" value="1">女
<span id="sex" style="color: red"></span>

javaScrip代码

let val = $(":radio:checked").val();
if(val){
    $("#sex").html("");
}else{
    $("#sex").html("性别必须选择");
}

【下拉框】类型: 要求:必须选择一个

html代码

类型:<select name="type" id="type">
        <option value="">请选择</option>
        <option value="java">JAVA</option>
        <option value="python">Python</option>
        <option value="c">C++</option>
     </select>
    <span id="t" style="color: red"></span>

javaScrip代码

if($("#type").val()){   //有值true  无值false
    $("#t").html("");
}else{
    $("#t").html("类型必须选择");
}

【复选框】兴趣: 要求:至少选择一个

html代码

 <input type="checkbox" name="hobby" value="eat">eat
                <input type="checkbox" name="hobby" value="sleep">sleep
                <input type="checkbox" name="hobby" value="swim">swim
                <input type="checkbox" name="hobby" value="sing">sing
                <span id="hobby" style="color: red"></span>

javaScript代码

let length = $(":checkbox:checked").length;
        if(length>0){
            $("#hobby").html("");
        }else{
            $("#hobby").html("兴趣至少选择一个");
        }

邮箱: 要求 xxx@xx.xxxx格式

html代码

邮箱:<input type="text" name="email" placeholder="xxx@xx.xxxx" onblur="regEmail(this.value)">
<span id="email" style="color: red"></span>

javaScript代码

function regEmail(val) {
    //^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$  邮箱正则
    var reg  = /^\w+@\w+\.\w+$/;    
    if(!reg.test(val)){
        $("#email").html("邮箱格式错误: xxx@xx.xxxx")
    }else{
        $("#email").html("");
    }
}

身份证号: 要求:16位数字 最后一位是校验位,可能为数字或字符X x

html代码

身份证号:<input type="text" name="cdid" placeholder="18位最后位x|X|\d" onblur="regCdid(this.value)">
<span id="cdid" style="color: red"></span>

javaScript代码

function regCdid(val) {
    var reg  = /^\d{17}(\d|X|x)$/;
    if(!reg.test(val)){
        $("#cdid").html("18位  最后一位是校验位,可能为数字或字符X x")
    }else{
        $("#cdid").html("");
    }
}

金钱: 要求:可以整数或一位小数或两位小数

html代码

金钱:<input type="text" name="money" placeholder="整数或一位小数或两位小数" onblur="regMoney(this.value)">
<span id="money" style="color: red"></span>

javaScript代码

function regMoney(val) {
    var reg  = /^\d+(.\d{1,2})?$/;
    if(!reg.test(val)){
        $("#money").html("整数或一位小数或两位小数")
    }else{
        $("#money").html("");
    }
}

日期: 要求满足日期格式 yyyy-MM-dd

html代码

日期:<input type="text" name="date" onblur="regDate(this.value)">
<span id="date" style="color: red"></span>

javaScript代码

function regDate(val) {
    var reg  = /^\d{4}-\d{1,2}-\d{1,2}$/;
    if(!reg.test(val)){
        $("#date").html("日期格式不正确")
    }else{
        $("#date").html("");
    }
}

实列代码的效果展示

以上大家可以看到,所有效验都是单独效验的,这样的好处是对单个处理较为方便,但较为麻烦,代码量较大!下面教大家一个优化上方代码---前端效验优化版【数组实现正则效验】

【单选框/复选框/下拉框】这些无需正则效验的还是要单独拉出来效验!!!

前端效验优化版【数组实现正则效验】

先看效果图

html代码

手机号:<input type="text" name="phone" index="0">
邮箱:<input type="text" name="email" index="1">
身份证号:<input type="text" name="cdid" index="2">
金钱:<input type="text" name="money" index="3">
日期:<input type="text" name="date" index="4">
<input type="button" value="验证">

javaScrpt代码

$(function () {
    //正则数组      手机号/邮箱/身份证/金钱/日期
    let reg  = [
        /^1(3|5|8)\d{9}$/,
        /^\w+@\w+\.\w+$/,
        /^\d{17}(\d|X|x)$/,
        /^\d+(.\d{1,2})?$/,
        /^\d{4}-\d{1,2}-\d{1,2}$/
    ];
    //提示错误信息数组
    let err = [
        "以13/15/18开头共11位手机号",
        "邮箱格式错误: xxx@xx.xxxx",
        "18位  最后一位是校验位,可能为数字或字符X x",
        "整数或一位小数或两位小数",
        "日期格式不正确"
    ]
    //在每一个有index 属性后面 追加一个span标签  来提示错误
    $("[index]").after("<span><span>")
    $("[index]").blur(function () {
        //读取index的值
        let index = $(this).attr("index");
        //读取当前文本框的值
        let value = $(this).val();
        //进行正则
        let flag = reg[index].test(value);
        if(flag){
            //验证为true 清空文字
            $(this).next().html("");
        }else{
            //flag      //提示错误
            $(this).next().css("color","red").html(err[index]);
        }
    }) 
})

好啦,现在前端的效验就分享到这了,大家如果想让样式更加好看更省事可以关注后期我会持续更新!!

jquery-validation/nice-validator前端JS效验框架的使用等等

注解效验

前言

通常来说,为了提高系统运行效率,都会在前端进行数据校验,但后端的数据校验仍然必不可少,因为用户还是可能在获取数据接口后手动传入非法数据,所以后端还是需要做数据校验

后端注解效验(值/范围/长度/格式)

1.值效验

1.1@Null 注解

被注释的元素必须为 null

@Null(message = "必须为null")
private String name;

1.2@NotNull 注解

被注释的元素必须不为 null

@NotNull(message = "必须不为null")
private String name;

1.3@NotBlank 注解

验证注解的元素值不为空(不为null、去除首位空格后长度为0) ,并且类型为String。

@NotBlank(message = "必须不为空")
private String name;

1.4 @NotEmpty注解

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) ,并且类型为String。

@NotEmpty(message = "必须不为null且不为空")
private String name;

1.5 @AssertTrue注解

被注解的元素必须为true,并且类型为boolean。

@AssertTrue(message = "必须为true")
private boolean state;

1.6 @AssertFalse注解

被注解的元素必须为false,并且类型为boolean。

@AssertFalse(message = "必须为false")
private boolean state;

2 范围效验

2.1@Min(value)注解

被注释的元素必须是一个数字,其值必须大于等于指定的最小值 ,并且类型为int,long,float,double

@Min(value = 18, message = "必须大于等于18")
private int age;

2.2 @Max注解

被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double。

@Max(value = 18, message = "必须小于等于18")
private int age;

2.3 @DecimalMin注解

验证注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal。

@DecimalMin(value = "150", message = "必须大于等于150")
private BigDecimal height;

2.4 @DecimalMax注解

验证注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal。

@DecimalMax(value = "300", message = "必须大于等于300")
private BigDecimal height;

2.5 @Range注解

验证注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long。

@Range(max = 80, min = 18, message = "必须大于等于18或小于等于80")
private int age;

2.6 @Past注解

被注解的元素必须为过去的一个时间,并且类型为java.util.Date。

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Past(message = "必须为过去的时间")
private Date createDate;

2.7 @Future注解

被注解的元素必须为未来的一个时间,并且类型为java.util.Date。

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Future(message = "必须为未来的时间")
private Date createDate;

2.8@Digits(integer,fraction)注解

验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

@Digits(integer=20, fraction=6,message = "金额最多26位,包含6位小数")
private String money;

3.长度效验

3.1 @Size注解

被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map。

@Size(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
private String len;

3.2 @Length注解

验证注解的元素值长度在min和max区间内 ,并且类型为String。

@Length(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
private String len;

4 格式校验

4.1 @Digits注解

验证注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。

@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")
private BigDecimal height;

4.2 @Pattern注解

被注解的元素必须符合指定的正则表达式,并且类型为String。

@Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")
private String mobile;
4.3 @Email注解

4.3 @Email注解

验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String

  @Email(message = "必须是邮箱")
private String email;

注解效验使用实列

举一些常用的列子:便于大家更快理解

Verify.java实体类

public class Verify {
​
    //@Pattern(regexp = "/^[\u4e00-\u9fa5]{2,5}$/",message = "用户名在2~5位")    汉子验证
    @Length(min = 2, max = 5, message = "用户名长度要求在{min}-{max}之间")
    @NotBlank(message = "用户名不不能空")
    private String username;     //用户名
​
    @Pattern(regexp = " ^[a-zA-Z]\\w{5,17}$" , message = "以字母开头,长度在6~18之间,只能包含字母、数字和下划线")
    @NotBlank(message = "请输入密码.不能为空")
    private String password;     //密码
​
    @Pattern(regexp = "^1(3|5|8)\\d{9}$" ,message = "请输入以13/15/18开头共11位手机号")
    @Length(min = 11 ,max = 11 ,message = "请输入11位手机号")
    private Integer phone;       //手机号
​
    //验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String
    @Email(regexp = "^\\w+@\\w+\\.\\w+$" , message = "邮箱格式错误: xxx@xx.xxxx")
    private String email;         //邮箱
​
    //两种写法  自行取用  DecimalMin/Max    注解表示对应属性值的下限/上限
    @Min(value = 18, message = "未成年不满足要求")      //@DecimalMin(value = 18 ,message = "未成年不满足要求")
    @Max(value = 80, message = "年龄错误")              // @DecimalMax(value = 80 ,message = "年龄错误")
    private Integer age;        //年龄
​
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Past(message =  "必须为过去的时间")
​
    @NotEmpty(message = "身份证号不能为空")
    @Pattern(regexp = "^\\d{17}(\\d|X|x)$" ,message = "18位  最后一位是校验位,可能为数字或字符X x")
    private String cdid;      //身份证号
​
    @Digits(integer=20, fraction=6,message = "金额最多26位,包含6位小数")
    private String money;
​
    @Range(min = 0, max = 1, message = "性别选择错误")
    private Integer sex;     //性别
    
    @NotEmpty(message="请输入会议地址")
    private String address;
    
    @Pattern(regexp="\\d{0,4}-\\d{0,8}",message="区号最多4位数,号码最多8位数")
    private String telephone;
}

controller控制层代码 

//jsr注解前端效验跳转页面
@RequestMapping(value = "toverifyreg")
public String toverifyreg(Verify verify,Model model){
    model.addAttribute("verify",verify);
    return "verifyreg";
}
​
@RequestMapping(value = "verifyreg")
public String verifyreg(@Validated Verify verify,BindingResult result,Model model){
    if(result.hasErrors()){ //验证是否满足后端效验
        return "verifyreg";
    }
    return "succeed";
}

html层

同最上面的登录一样.这里给大家一个模范

<form:form modelAttribute="verify" method="post" action="verifyreg">
    <form:input path="username"></form:input>   <!--path对应实体类属性名-->
    <form:errors path="username"></form:errors> <!--报错提示-->
</form:form>

展示错误信息

<form:errors path="meetingName" />          获取校验失败信息 name实体类属性名

@Valid和BindingResult的解释

  • @Validated 使校验规则生效

  • BindingResult 封装校验失败的信息 必须紧跟要校验的对象

@Valid和BindingResult配套使用,@Valid用在参数前,BindingResult作为校验结果绑定返回。 @Validation 是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束。 作用在类、方法和参数上 BindingResult 用在实体类校验信息返回结果绑定 bindingResult.hasErrors()判断是否校验通过,校验未通过, bindingResult.getFieldError().getDefaultMessage()获取在TestEntity的属性设置的自定义message,如果没有设置,则返回默认值"javax.validation.constraints.XXX.message"。

注意:在实体类使用校验注解时,controller一定要使用bindingResult处理校验结果,且实体类作为查询参数时,避免被其他方法使用,不然的地方需要限制,有的没有,不需要限制的方法会报错。

下面对后端验证所使用的双form标签做解释

SpringMVC的form:form标签简介

使用SpringMVC中双Form表单标签的优点:

  • SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑表单值的回显

1.在JSP中声明form标签库

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

2.form标签库常用标签

标签对应HTML的标签或Spring中的对象
form<form action=""></form>
input<input type="text" />
password<input type="password" />
hidden<input type="hidden" />
checkbox<input type="checkbox" />
radiobutton<input type="radio" />
select<select name="" id=""></select>
textarea<textarea name="" id="" cols="30" rows="10"></textarea>
errorsorg.springframework.validation.Errors

3.form标签常用属性

标签对应HTML的标签或Spring中的对象
modelAttributeModel 中绑定的属性,默认值是 command
action请求地址
method请求方法
<form:form modelAttribute="verify" method="post" action="verifyreg">

4.表单元素常用属性

标签对应HTML的标签或Spring中的对象
path绑定 JavaBean 的属性(必选)
cssClassCSS 类,相当于<input>的class属性

双Form表单组件标签

双form共有属性

path:表单字段,对应 html 元素的 name 属性,支持级联属性

单选框组件标签

1.单个单选框

form:radiobutton:当表单 bean 对应的 属性值和 value 值相等时,单选框被选中

2.用于构造多个单选框

form:radiobuttons: items:可以是一个 List、String[] 或 Map 
itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个 属性值 
itemLabel:指定 radio 的 label 值 
delimiter:多个单选框可以通过 delimiter 指定分隔符
<form:radiobutton path="sex"></form:radiobutton>
<form:radiobuttons path="sex2" items="${sexs}" itemLabel="name"></form:radiobuttons>

复选框组件标签

form:checkbox:。用于构造单个复选框

form:checkboxs:用于构造多个复选框。使用方式同 form:radiobuttons 标

<form:checkboxes path="hooby" items="${hoobys}" itemLabel="hid" itemValue="hname"></form:checkboxes>
<form:checkbox path="hooby2"></form:checkbox>

 下拉框组件标签

form:select: 使用方式同 form:radiobuttons 标签
form:option:
​​​​​​​<form:select path="type" items="${types}" itemLabel="name" itemValue="tid"></form:select>

后端效验错误显示标签

form:errors:显示表单组件或数据校验所对应的错误 
<form:errors path= “ *” /> :显示表单所有的错误 
<form:errors path= “ user*” /> :显示所有以 user 为前缀的属性对应的错误 
<form:errors path= “ username” /> :显示特定表单对象属性的错误
<form:errors path="meetingName" />          获取校验失败信息 name实体类属性名 

这篇文章吸取了前辈的各大小知识点加上我的总结而出!!

正则语法|前端后端效验|springMvc效验总结到这就占告一段落了!!!你学会了吗??留下疑问,互动交流吧!!

Thanks!!!

  • 7
    点赞
  • 8
    收藏
  • 打赏
    打赏
  • 4
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论 4

打赏作者

北九二七

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值