Spring验证框架,简单使用Vue 属性

Spring验证框架:SpringValidation

是一个用于验证指定实体类中的属性值得验证框架,可以规定这个实体类中的属性值得格式(正则),如果不符合规定,可以反馈错误

为什么需要Spring验证框架

我们之前都使用js来验证用户输入的信息,但是前段验证并不是可靠的,无论前端有没有验证,java后台都必须验证信息,保证数据安全

添加依赖 pom.xml文件添加如下依赖

<!-- 验证框架 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

转到要验证的实体类添加验证代码,以项目 RegisterVo示例:

@Data
public class RegisterVo implements Serializable {
    // @NotBlank针对字符串类型不能为null也不能为""
    @NotBlank(message = "邀请码不能为空")
    private String inviteCode;
    
    @NotBlank(message = "手机号不能为空")
    @Pattern(regexp = "^1\\d{10}$",message = "手机号不正确")
    private String phone;
    
    @NotBlank(message = "昵称不能为空")
    @Pattern(regexp = "^.{2,20}$",message = "昵称长度是2到20个字符")
    private String nickname;
    @NotBlank(message = "密码不能为空")
    @Pattern(regexp = "^\\w{6,20}$",message = "密码是6到20个字母,数字,_组成")
    private String password;
    @NotBlank(message = "确认密码不能为空")
    private String confirm;

}

SpringValidation常用的验证注解

@NotBlank,针对字符串类型,不能是null或""

@NotNull,针对任何引用类型不能是null,但是如果是字符串可以是""

@NotEmpty,一般针对集合,不能为null且长度不能是0

@Pattern,编写正则表达式

要想启动验证,需要在使用实体类的位置添加注解,SystemController类中注册方法代码 示例:

@PostMapping("/register")
    public R registerStudent(@Validated RegisterVo registerVo,
                             BindingResult res){
        //@Validated表示要SpringValidation验证 registerVo
        //BindingResult res来保存SpringValidation验证的结果
        //方法中先来判断res有没有错误
        if(res.hasErrors()){
            //如果有错误,获得第一个错误信息
            String error=res.getFieldError().getDefaultMessage();
            return R.unproecsableEntity(error);
        }
        //判断两次密码输入是否一致
        if(!registerVo.getPassword().equals(registerVo.getConfirm())){
            return R.unproecsableEntity("两次密码输入不一致");
        }

       
    }

Vue

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="bower_components/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>Vue Demo</h1>
    <p v-text="message">这是演示信息</p>
    <input type="text" v-model="desc">
    <button type="button" v-on:click="hello">演示</button>
</div>
</body>
<script>
    let app=new Vue({
        el:"#app",
        data:{
            message:"Hello Vue!!!",
            desc:"2021-1-15"
        },
        methods:{
            hello:function(){
                console.log(this.desc);
                this.message=this.desc;
            }
        }
    })
</script>
</html>

Vue的运行可以实现页面数据和vue变量的双向绑定

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css">
    <link rel="stylesheet" href="bower_components/plugins/css/vueAlert.css">
    <link rel="stylesheet" href="css/login.css">
    <script src="bower_components/jquery/dist/jquery.min.js" ></script>
    <script src="bower_components/bootstrap/dist/js/bootstrap.min.js" ></script>
    <script src="bower_components/vue/dist/vue.js"></script>
</head>
<body class="bg-light">
<div class="container-fluid">
    <div class="row">
        <div class="mx-auto mt-5" style="width: 400px">
            <div class="bg-white p-4" id="app">
                <p class="text-center"><b>注册新用户</b></p>
                <div id="error" class="alert alert-danger" style="display: none"
                     v-bind:class="{'d-block':hasError}">
                    <i class="fa fa-exclamation-triangle"></i>
                    <span v-text="message">邀请码错误!</span>
                </div>
                <form action="/register" method="post" v-on:submit.prevent="register">
                    <div class="form-group has-icon">
                        <input type="tel" name="phone" class="form-control" placeholder="请输入手机号"
                               pattern="^\d{11}$" required="required" v-model="phone">
                        <span class=" fa fa-phone form-control-icon"></span>
                    </div>
                    <div class="form-group has-icon">
                        <input type="text" name="nickname" class="form-control" placeholder="请设置昵称,字数为2-20之间"
                               pattern="^.{2,20}$" required="required" v-model="nickname">
                        <span class="fa fa-user form-control-icon"></span>
                    </div>
                    <div class="form-group has-icon">
                        <input type="password" name="password" class="form-control" placeholder="设置密码6-20个字母、数字、下划线"
                               required="required" pattern="^\w{6,20}$" v-model="password" >
                        <span class="fa fa-lock form-control-icon"></span>
                    </div>
                    <button type="submit" class="btn btn-primary btn-block btn-flat" >注册</button>
                </form>
                <a href="login.html" class="text-center d-inline-block mt-3">已有账号,立即登录</a>
            </div>
            <!-- /.form-box -->
        </div>
    </div>
</div>
</body>
<script src="js/utils.js"></script>
<script src="js/register.js"></script>
</html>

v-bind主要用于解决HTML元素属性值的绑定问题,用于响应更新HTML元素的属性,将一个或多个属性或一个组件的prop动态绑定到表达式。
v-bind绑定class,绑定方式:对象语法,含义class后面跟的是一个对象

v-text是用于操作纯文本,它会替代显示对应的数据对象上的值。当绑定的数据对象上的值发生改变,插值处的内容也会随之更新。注意:此处为单向绑定,数据对象上的值改变,插值会发生变化;但是当插值发生变化并不会影响数据对象的值。

v-on:submit.prevent指在该表单中的任何提交按钮都可以触发该事件

v-model一般用于双向绑定:

允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。


<!--引入标签的导航栏-->
<div class="container-fluid"  th:fragment="tags_nav" >
    <div class="nav font-weight-light" id="tagsApp">
        <a href="tag/tag_question.html" class="nav-item nav-link text-info"><small>全部</small></a>
        <a href="tag/tag_question.html" class="nav-item nav-link text-info"
           v-for="tag in tags">
            <small v-text="tag.name">Java基础</small></a>
    </div>
</div>

v-for:指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名

let app = new Vue({
    el:'#app',
    data:{
        phone:'',
        nickname:'',
        password:'',
        message: '',
        hasError: false
    },
    methods:{
        register:function () {
            console.log('Submit');
            let data = {
                phone: this.phone,
                nickname: this.nickname,
                password: this.password,
            }
            console.log(data);
            if(data.password !== data.confirm){
                this.message = "确认密码不一致!";
                this.hasError = true;
                return;
            }
            $.ajax({
                url:"/register",
                method: "POST",
                data: data,
                success: function (r) {
                    console.log(r);
                    if(r.code == CREATED){
                        console.log("注册成功");
                        console.log(r.message);
                        app.hasError = false;
                        location.href = '/login.html?register';
                    }else{
                        console.log(r.message);
                        app.hasError = true;
                        app.message = r.message;
                    }
                }
            });
        }
    }
});

猜你喜欢

转载自blog.csdn.net/c202003/article/details/115057412