前言
在學習了一段時間的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代碼的功能實作!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/296905.html
標籤:其他
