1. 程式人生 > >Spring 筆記 -07- 使用 jQuery Ajax 非同步登入,並驗證使用者輸入資訊(maven)

Spring 筆記 -07- 使用 jQuery Ajax 非同步登入,並驗證使用者輸入資訊(maven)

Spring 筆記 -07- 使用 jQuery Ajax 非同步登入,並驗證使用者輸入資訊(maven)

本篇是對上一篇的專案的另一種實現加完善,上一篇 Spring 筆記 -06- 從 MySQL 建庫到 登入驗證資料庫資訊(maven)

本篇內容:
(1)上一篇是使用同步的請求實現登入,並由 Servlet 決定登陸後下一步做哪些事情,本篇使用 jQuery Ajax 的方式,實現非同步登入,登入成功後執行的內容在 js 中定義。
(2)在登入之前,在 js 中驗證表單中的,使用者名稱是否為空,密碼是否為空,密碼是否是 6-12 位,登入失敗後,返回提示資訊。
(3)登入成功後,返回使用者表的所有資訊,以表格形式展示:
(4)效果截圖:

本篇部分內容看起來和上一篇相似,但又很多改動,請認真檢視。


一、建立使用者資訊 MySQL 資料庫

(建議名稱一致,建庫同上一篇,再介紹一次)

(1)安裝 MySQL 請百度或參考:MySQL 安裝 + 入門大全 + 常用命令合集

(2)開啟 cmd ,登入 mysql 的 root 使用者,建立 studb 資料庫,建立表 tb_user :

(3)顯示錶結構,插入 3 條使用者資料:

(4)資料庫 studb,表 tb_user 建立好了。

二、建立 Maven Web 專案,配置

(1)建立專案和修改目錄結構,因為常用,所以寫在了單獨的一篇文章,請檢視:

Spring 筆記 -05- 建立 Maven Web 專案 + Tomcat 及目錄結構配置

(2)序號(1)中說的,一篇文章,全部需要!

(3)配置 Maven 的配置檔案 pom.xml 檔案,位置在下面有提示:

本篇多加一個 fastjson,請注意!!

請更新為下面的 pom 最新配置:

<dependencies>
	<!-- 本篇多加一個 fastjson,請注意 -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
<groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> </dependencies>

在這裡插入圖片描述

(4)點選自動匯入:

(5)建立如下目錄及檔案:

(6)下面需要先做一件事,就是在 js 目錄中,引入 Bootstrap3 和 jQuery

注意:只能是 Bootstrap3 版本:

配置步驟:

  • 安裝 Node.js ,因為要使用 npm
  • 在專案中 js 目錄,右鍵 Open in Explorer 可以開啟該目錄,並複製
  • 在 cmd 進入專案的 js 目錄
  • 使用命令:
npm install bootstrap3
npm install jQuery

三、具體檔案編碼:

貼程式碼前,先看一下整個完整的專案目錄結構:

前臺檔案:

後臺檔案目錄結構:

所有檔案程式碼:

(1)findUserInfoForAjax.html 檔案,用於登入成功時跳轉,該檔案在瀏覽器開啟時,js 會執行一個 findAllUser 方法,先請求 Servlet,然後 Servlet 去查詢資料庫資訊,創 User 實體類,再轉換成 json 資料格式,前端處理 json 資料,再顯示在頁面中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>findUserInfoForAjax</title>

    <link rel="stylesheet" href="js/node_modules/bootstrap3/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="js/node_modules/bootstrap3/dist/css/bootstrap-theme.css">
    <script type="text/javascript" src="js/node_modules/jquery/dist/jquery.min.js"></script>
    <script>
        function findAllUser() {
            $.ajax({
                url:"userServletForAjax",
                method:"get",
                //dataType:"jsonp",
                //async:true,
                success:function (result) {
                    var obj = JSON.parse(result);
                    var str = "";
                    $.each(obj,function (index,row,ee) {
                        str+="<tr><td>"+row.id+"</td><td>"+row.uname+"</td><td>"
                            +row.upwd+"</td><td>"+row.lastLoginTime+"</td><td>"+row.role+"</td></tr>"

                    });
                    $("#alluser").html(str);

                },
                error:function () {
                    alert("伺服器請求失敗")
                }
            })

        }
        findAllUser();
    </script>

</head>
<body>
<table class="table table-striped table-hover">
    <tr>
        <td>id</td>
        <td>uname</td>
        <td>upwd</td>
        <td>lastLoginTime</td>
        <td>role</td>
    </tr>
    <tbody id="alluser">

    </tbody>
</table>
</body>
</html>

(2)login_ajax.html 檔案,是登入的前端介面,在請求 Servlet 之前,會先檢查資料的格式,有使用者名稱是否為空,密碼是否為空,密碼是否為 6-12 位。

當格式正確再去請求,驗證資料庫中的使用者資訊是否匹配,成功則跳轉到上面的 findUserInfoForAjax.html 檔案,不成功提示使用者名稱或密碼錯誤!:

原始碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用者登入</title>
    <link rel="stylesheet" href="js/node_modules/bootstrap3/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="js/node_modules/bootstrap3/dist/css/bootstrap-theme.css">
    <script type="text/javascript" src="js/node_modules/jquery/dist/jquery.min.js"></script>
    <script type="text/javascript">
        function login() {
            var uname = $("#uname").val();
            var upwd = $("#upwd").val();
            if (uname == null || uname == "") {
                $("#unameMsg").html("使用者名稱不能為空!");
                return;
            } else
                $("#unameMsg").html("");
            if (upwd.length == 0) {
                $("#upwdMsg").html("密碼不能為空!");
                return;
            } else
                $("#upwdMsg").html("");
            if (upwd.length < 6 || upwd.length > 12) {
                $("#upwdMsg").html("密碼應該在 6-12 位之間!");
                return;
            } else
                $("#upwdMsg").html("");
            $.ajax({
                url: "Servlet",
                method: "get",
                data: {
                    "uname": $("#uname").val(),
                    "upwd": $("#upwd").val(),
                    "role": $("#role").val()
                },
                success: function (result) {
                    if (result == "1") {
                        window.location.href = "findUserInfoForAjax.html";
                    } else {
                        $("#loginMsg").html("登入失敗,請重試!");
                    }
                },
                error: function () {
                    alert("請求伺服器失敗!");
                }
            });
        }

    </script>

</head>
<body>
<br><br>
<br><br>

<form name="loginForm" id="loginForm">
    <div class="center-block" style="width: 45%;height: 350px">
        <div class="panel panel-primary">
            <div class="panel-heading">
                <span class="glyphicon glyphicon-apple"></span>使用者登入

            </div>
            <div class="panel-body">
                <div class="text-success" align="center">
                    <h3>歡迎使用資源統一管理系統</h3>
                </div>
                <div class="input-group">
                    <label class="input-group-addon">使用者名稱</label>
                    <input class="form-control" type="text" id="uname" name="uname" placeholder="請輸入使用者名稱">
                    <label class="input-group-addon text-warning">*</label>
                </div>
                <label id="unameMsg" style="color: red"></label><br>
                <div class="input-group">
                    <label class="input-group-addon">&nbsp;&nbsp;&nbsp;</label>
                    <input class="form-control" type="password" id="upwd" name="upwd" placeholder="請輸入密碼">
                    <label class="input-group-addon text-warning">*</label>
                </div>
                <label id="upwdMsg" style="color: red"></label><br>
                <div class="input-group">
                    <label class="input-group-addon">&nbsp;&nbsp;&nbsp;</label>
                    <select name="role" class="form-control ">
                        <option value="admin">管理員</option>
                        <option value="teacher">經理</option>
                        <option value="student">使用者</option>
                    </select>
                </div>
            </div>
            <div align="center">
                <label id="loginMsg" style="color: red"></label>
                <a href="javascript:login()" class="btn btn-danger"><span
                        class="glyphicon glyphicon-log-in"></span> 登入</a>&nbsp;&nbsp;
                <a href="javascript:loginForm.reset()" class="btn btn-primary"><span
                        class="glyphicon glyphicon-remove"></span> 重置</a>
            </div>
            <br>
            <div class="panel-footer">
                <div align="center">
                    &copy;2018-2019 肖朋偉的 CSDN 部落格 Copy Right

                </div>

            </div>

        </div>

    </div>
</form>


</body>
</html>

如果成功引入 Bootstrap3 ,開啟伺服器,開啟本頁面,會有下面介面:

在這裡插入圖片描述

(3)User.java 檔案(有更新):

package com.pojo;

//用來存放使用者登入時,輸入輸出的資訊
public class User {
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private String uname;
    private String upwd;
    private String lastLoginTime;

    public String getLastLoginTime() {
        return lastLoginTime;
    }

    public void setLastLoginTime(String lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }

    private String role;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpwd() {
        return upwd;
    }

    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }


}

(4)UserDAO.java 檔案(有更新):

package com.dao;

import com.dbutil.DBUtils;
import com.pojo.User;

import java.util.List;

public class UserDAO {

    public List<User> findAllUser(){
        DBUtils dbUtils = new DBUtils();

        return dbUtils.findAllUser();
    }

    //返回 0 或 1
    public int login(User user){
        DBUtils dbUtils = new DBUtils();

        //與資料庫是否匹配,匹配為 1
        int temp = dbUtils.login(user);
        return temp;
    }
}

(5)DBUtils.java 檔案:
!!! 成敗在與這個檔案

  • 自行更改資料庫名
  • 自行更改表名(兩個)
  • 自行更改 root 的密碼
  • 檢查服務是否啟動
package com.dbutil;

import com.pojo.User;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DBUtils {
    Connection conn;
    //預處理
    PreparedStatement pstmt;
    //結果集
    ResultSet rs;

    public DBUtils(){
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/studb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","xiaopengwei");

        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public int login(User user){
        try{
            pstmt=conn.prepareStatement("select * from tb_user where uname = ? and upwd = md5(?)");
            pstmt.setString(1, user.getUname());
            pstmt.setString(2, user.getUpwd());
            rs = pstmt.executeQuery