前言
在学习了一段时间的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>
<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代码的功能实现!
|