农大旅游网案例第一期——用户注册(上)

前言

在学习了一段时间的JavaWeb知识后,博主近期计划写一个综合的案例——农大旅游网。

在这里面,会包括:用户登录,用户注册,用户激活,网页设计,数据库创建等多个知识。在本章的第一篇,我们首先来实现用户注册这样一个功能。

功能分析

效果:我们期望用户注册页面可以达到这样一个效果:它可以在用户输入信息后自动的去检测输入信息的合法性,并做出相应的反馈;并且当我们点击了注册按钮后,只有当输入的信息合法时,用户表单才可以提交让后台去校验。这里我们选用jQuery实现反馈效果,ajax来实现异步提交表单

页面:这里的页面我们选用的是html页面

数据库:创建一个tab_user表,记录关于用户注册的相关信息;通过Servlet,JDBC,java来实现用户信息查重和保存的操作

正文

在本节中,我们首先完成注册界面及其检验

为方便导包操作,该项目我们选择用Maven来创建

结构图如下:

 

前台:

注册页面展示:

 源码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Title</title>

    <!--1.导入CSS的全局样式:栅格系统-->
    <link rel="stylesheet" href="css/bootstrap.min.css" rel="stylesheet">
    <!--2.jQuery导入-->
    <script src="js/jquery-3.6.0.min.js"></script>
    <!--3.导入bootstrap.min.js文件-->
    <script src="js/bootstrap.min.js"></script>
    <script type="text/javascript"></script>
    <style>/*通过style引入CSS*/
    * {
        /*盒子模型,设置其窗体大小不会变*/
        margin: 0px;
        padding: 0px;
        box-sizing: border-box;
    }

    body { /*背景*/
        background: url("image/海滨云朵2.jpg") no-repeat center
    }

    .rg_layout { /*注册框*/
        /*布局*/
        width: 900px;
        height: 530px;
        /*内外边界像素差,和之间的颜色:灰*/
        border: 8px solid #EEEEEE;
        /*内边界的背景色*/
        background-color: white;
        /*水平居中*/
        /*距离上端的距离*/
        margin: 80px auto auto;
    }

    .rg_left { /*新用户注册几个字*/
        /* border: 1px solid red;*/
        float: left;
    }

    .rg_left > p:first-child { /*选择p:first-child上的父类选择器.rg_left*/
        color: rgba(89, 120, 231, 0.77);
        size: 20px;
        /*外边距*/
        margin: 15px;
    }

    .rg_left > p:last-child {
        color: #A6A6A6;
        size: 20px;
    }

    .rg_right { /*已有账号*/
        /* border: 1px solid red;*/
        float: right;
        margin: 15px;
    }

    .rg_right > p :first-child { /*立即登录*/
        color: #18d3e5;
        font-size: 14px;
    }

    .form-horizontal {
        float: left;
        margin-left: 90px;
        margin-top: 40px;
        /* border: 1px solid #5cb85c;*/
        width: 59%;
        margin-bottom: -50px;
    }

    .col-sm-2 control-label {
        margin-right: 50px;
    }

    .form-group {
        margin-left: 30px;
    }


    </style>

</head>

<body>
<div class="rg_layout">
    <div class="rg_left">
        <p>新用户注册</p>
        <p>USER REGISTER</p>
    </div>

    <div class="rg_center">
        <form action="/registerUserServlet" method="get" class="form-horizontal" id="registerFrom"><!--/myMaven/registerUserServlet-->
            <div class="form-group">
                <label for="username" class="col-sm-3 control-label">Username</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="username" placeholder="请输入姓名" name="username">
                </div>
            </div>

            <div class="form-group">
                <label for="password" class="col-sm-3 control-label">Password</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="password" placeholder="请输入密码" name="password">
                </div>
            </div>

            <div class="form-group">
                <label for="email" class="col-sm-3 control-label">Email</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="email" placeholder="请输入邮箱" name="email">
                </div>
            </div>

            <div class="form-group">
                <label for="name" class="col-sm-3 control-label">姓名</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="name" placeholder="请输入姓名" name="name">
                </div>
            </div>


            <div class="form-group">
                <label for="telephone" class="col-sm-3 control-label">号码</label>
                <div class="col-sm-7"><!--width: 83.3%-->
                    <input type="text" class="form-control" id="telephone" placeholder="请输入号码" name="telephone">
                </div>
            </div>

            <div class="form-group">
                <label class="col-sm-3 control-label">性别</label>
                <div class="col-sm-5" style="margin-top: 5px">
                    <input type="radio" name="sex" value="male" checked>男
                    <input type="radio" name="sex" value="female" style="margin-left: 20px">女
                </div>
            </div>

            <div class="form-group">
                <label for="birthday" class="col-sm-3 control-label">出生日期</label>
                <div class="col-sm-5">
                    <input type="text" class="form-control" id="birthday" name="birthday" placeholder="请输入出生日期">
                </div>
            </div>

            <div class="form-group">
                <label for="checkCode" class="col-sm-3 control-label">验证码</label>
                <div class="col-sm-7"><!--style="border: 1px solid red"-->
                    <input type="text " class="form-control" id="checkCode" placeholder="请输入验证码" name="checkCode"
                           style="width: 50%;float: left;margin-right: 30px">
                    <canvas id="canvas" onclick="dj()" style="border: 1px solid #ccc;
                             border-radius: 5px;width: 95px;height: 35px"></canvas>
                    <font id="errorMsg" style="font-family:隶书,serif;font-size: 17px "></font>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10" style="margin-top: 5px;margin-left: 150px">
                    <button type="submit" class="btn btn-success" style="width: 80px;height: 40px" id="register"
                            onclick="sublim()">Login
                    </button>
                    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp;
                    <button type="reset" class="btn btn-warning" style="width: 80px;height: 40px" id="reset">Reset
                    </button>
                </div>
            </div>
        </form>
    </div>


    <div class="rg_right">
        <p>已有账号?<a href="login.html">立即登录</a></p>
    </div>

</div>

</body>

</html>

对于用户信息合法性效验,验证码以及异步提交表单,我们通过jQuery实现:

<script>
    var codeFlag = false;//用于判断验证码是否正确

    function sublim() { //这里为提交按钮绑定单击事件,点击后自动进行验证码判断
        var val = document.getElementById("checkCode").value;
        var num = show_num.join("");
        if (val == '') {
            $("#errorMsg").html("请输入验证码!")
            $("#errorMsg").css("color", "rgba(219,174,11,0.97)");
        } else if (val.compare(num)) {
            $("#errorMsg").html("提交成功!")
            $("#errorMsg").css("color", "green");
            codeFlag = true;
            /*  alert("codeFlag="+codeFlag);*/
            document.getElementById(".input-val").val('');
            draw(show_num);


        } else {
           /* alert('验证码错误!\n你输入的是:  ' + val + "\n正确的是:  " + num + '\n请重新输入!');*/
            $("#errorMsg").html("验证码错误!");
            $("#errorMsg").css("color", "red");
            codeFlag = false;
            /* alert("codeFlag="+codeFlag);*/
            document.getElementById("code").value = '';
            draw(show_num);
        }
    }

    /**
     * 表单离焦异步校验:
     * 1.用户名:长度8-20位
     * 2.密码:单词字符,长度8-20位
     * 3.email:邮件格式
     * 4.姓名:非空
     * 5.手机号:手机号的格式(11位数字)
     * 6.出生日期:非空
     * 7.验证码:非空
     */
    //校验用户名
    function checkUsername() {
        let username = $("#username").val();
        username = username.replace(/^\s*|\s*$/g, "");
        var flag;
        if (username != null && username !== "") {
            $("#username").css("border", "");
            flag = true;
        } else {
            $("#username").css("border", "1px solid red");
            flag = false
        }
        return flag;
    }

    //校验用户名
    function checkPassword() {
        //1.获取用户名
        const password = $("#password").val();
        //2.定义正则:长度8-20位的单词字符构成
        const reg_password = /^\w{8,20}$/;
        //3.判断,给出提示信息
        const flag = reg_password.test(password);
        if (flag) {//用户名合法
            $("#password").css("border", "");
        } else {//用户名不合法
            $("#password").css("border", "1px solid red");
        }
        return flag;
    }

    function checkEmail() {
        const email = $("#email").val();
        const reg_email = /^\w+@\w+\.\w+$/;
        const flag = reg_email.test(email);
        if (flag) {
            $("#email").css("border", "");
        }
        if (!flag) {
            $("#email").css("border", "1px solid red");
        }
        return flag;
    }

    function checkName() {
        const name = $("#name").val();
        if (name != null && name != "") {
            $("#name").css("border", "");
            return true;
        } else {
            $("#name").css("border", "1px solid red");
            return false;
        }
    }

    function checkBirthday() {
        const birthday = $("#birthday").val();
        if (birthday != null && birthday != "") {
            $("#birthday").css("border", "");
            return true;
        } else {
            $("#birthday").css("border", "1px solid red");
            return false;
        }
    }

    function checkCode() {
        const code = $("#checkCode").val();
        if (code != null && code != "") {
            $("#checkCode").css("border", "");
            return true;
        } else {
            $("#checkCode").css("border", "1px solid red");
            return false;
        }
    }

    function checkTel() {
        const tel = $("#telephone").val();
        const reg_tel = /^[0-9]*$/;
        const flag = reg_tel.test(tel);
        if (flag) {
            $("#telephone").css("border", "");
        }
        if (!flag) {
            $("#telephone").css("border", "1px solid red");
        }
        return flag;
    }

    /**
     * 异步(ajax)提交表单
     * 在此使用异步提交表单是为了获取服务器响应的数据,
     * 因为我们前台使用的是html作为试图层,不能直接从servlet相关的域对象获取值
     * 只能通过ajax获取响应数据
     */
    $(function () {
        //当表单提交时,调用所有的方法,若调用的方法返回ture或没有返回值,则表单提交;若返回false则表单不提交
        $("#registerFrom").submit(function () {
            /**这里是要绑定整个表单,而不是提交按钮!!!*/
            //1.发送数据到服务器
            if (checkUsername() && checkPassword() && checkEmail() && checkName()
                && checkTel() && checkBirthday() && checkCode() && codeFlag) {//不要加括号
                alert("校验成功")

                $.get("registerUserServlet", $(this).serialize(), function (data) {
                    //处理服务器响应的数据 data {内容有:flag,data,errorMsg,}
                    alert(data.flag+" "+data.errorMsg);
                    if (data.flag) {
                        //注册成功
                        location.href="register_ok.html";  /**注意为location.href而不是Location.href*/
                       /* return true;*/
                    } else {//注册失败,给errorMeg添加信息
                        alert(data.errorMsg);
                        $("#errorMsg").html(data.errorMsg);
                        $("#errorMsg").css("color","red");
                        /*return false;*/
                    }
                });
            } else {
               /* alert("noPass!")*/
                //设置为false是效验不通过时,禁止跳转页面。保留当前页面状态
                return false;
            }
        });
        //失去焦点后调用相关方法 ( 注意函数名不要带括号!!)
        $("#username").blur(checkUsername);
        $("#password").blur(checkPassword);
        $("#email").blur(checkEmail);
        $("#name").blur(checkName);
        $("#birthday").blur(checkBirthday);
        $("#code").blur(checkCode);
        $("#telephone").blur(checkTel);
    });

    /**
     * 生成验证码
     * @param show_num
     */
    var show_num = [];
    draw(show_num);

    function draw(show_num) {
        var canvas_width = document.getElementById('canvas').clientWidth;
        var canvas_height = document.getElementById('canvas').clientHeight;
        var canvas = document.getElementById("canvas");//获取到canvas的对象,演员
        var context = canvas.getContext("2d");//获取到canvas画图的环境,演员表演的舞台
        canvas.width = canvas_width;
        canvas.height = canvas_height;
        var sCode = "A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m";
        var aCode = sCode.split(",");
        var aLength = aCode.length;//获取到数组的长度

        for (var i = 0; i <= 3; i++) {
            var j = Math.floor(Math.random() * aLength);//获取到随机的索引值
            var deg = Math.random() * 30 * Math.PI / 180;//产生0~30之间的随机弧度
            var txt = aCode[j];//得到随机的一个内容
            show_num[i] = txt;
            var x = 10 + i * 20;//文字在canvas上的x坐标
            var y = 20 + Math.random() * 8;//文字在canvas上的y坐标
            context.font = "bold 23px 微软雅黑";

            context.translate(x, y);
            context.rotate(deg);

            context.fillStyle = randomColor();
            context.fillText(txt, 0, 0);

            context.rotate(-deg);
            context.translate(-x, -y);
        }
        for (var i = 0; i <= 5; i++) { //验证码上显示线条
            context.strokeStyle = randomColor();
            context.beginPath();
            context.moveTo(Math.random() * canvas_width, Math.random() * canvas_height);
            context.lineTo(Math.random() * canvas_width, Math.random() * canvas_height);
            context.stroke();
        }
        for (var i = 0; i <= 30; i++) { //验证码上显示小点
            context.strokeStyle = randomColor();
            context.beginPath();
            var x = Math.random() * canvas_width;
            var y = Math.random() * canvas_height;
            context.moveTo(x, y);
            context.lineTo(x + 1, y + 1);
            context.stroke();
        }
    }

    function randomColor() {//得到随机的颜色值
        var r = Math.floor(Math.random() * 256);
        var g = Math.floor(Math.random() * 256);
        var b = Math.floor(Math.random() * 256);
        return "rgb(" + r + "," + g + "," + b + ")";
    }

    function dj() {
        draw(show_num);
    }

    String.prototype.compare = function (str) {//不区分大小写比较两字符串
        if (this.toLowerCase() == str.toLowerCase()) {
            return true; // 正确
        } else {
            return false; // 错误
        }
    }


</script>

效果预览:

 (此处我们的Password,姓名,号码,验证码均不合法,点击Login后页面未提交)

在本节,我们就暂时先完成页面的编写,在后续,我们会完善后台java代码的功能实现!

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值