【JavaWeb】日程管理系统 添加Ajax注册校验 第四期

14 篇文章 1 订阅
11 篇文章 0 订阅
本文详细描述了前端JavaScript如何通过Ajax与后端Java配合,实现用户注册时的用户名校验,以及后端如何通过定义业务码、JSON响应格式和工具类来确保数据交互的规范性。
摘要由CSDN通过智能技术生成


注册校验 :

还存在的问题:
当校验不通过时 , 表单依旧能够提交
之后使用VUE 的 axios 结合 promise 处理

需求:

注册提交前校验用户名是否占用功能

使用 后端 传递JSON 的方式 原因:

  • 解决响应乱码问题
  • 规范响应信息格式
    • 后端响应信息建立统一的格式:
    • 响应一个JSON
      {
      “code”:“200 505… 就是自定义的业务状态码 用于说明这次的业务请求状态”
      “message”: “针对业务状态码的补充说明/描述”
      “data”:“{}” 本次响应的数据 成功/不成功 List<Schedule>

      }

业务码 响应: 成功 200
2

业务码 响应: 被占用 505
3

客户端代码编写处理 :

regist.html页面代码

主要代码:

<script>
  function checkUsername() {
            var usernameReg = /^[a-zA-Z0-9]{5,10}$/
            var usernameInput = document.getElementById("usernameInput")
            var username = usernameInput.value
            var usernameMsg = document.getElementById("usernameMsg")
            if (!usernameReg.test(username)) {
                usernameMsg.innerText = "格式有误"
                return false
            }
            // Ajax 验证 用户名 是否已被占用
            let request = new XMLHttpRequest();
            // 设置回调函数 对响应回来的数据进行处理
            request.onreadystatechange = function () {
                if (request.readyState == 4 && request.status == 200) {
                    // usernameMsg.innerText = request.responseText;
                    //接收 服务端响应回来的JSON
                    let result = JSON.parse(request.responseText);
                    // 返回的code 业务码不为200 即失败 用户名已存在
                    if (result.code != 200) {
                        usernameMsg.innerText = "不可用"
                    }
                }
            }

            // 设置请求方式 以及 请求目标资源的路径
            request.open("GET", "/user/checkUsernameUsed?username=" + username)
            request.send();

            usernameMsg.innerText = "OK"
            return true
        }
        </script>

服务端代码处理 :

公共工具类:
2

定义业务码格式的枚举类

package com.doug.wake.common;

/**
 * 业务含义和状态码对应关系的枚举
 *
 */
public enum ResultCodeEnum {
    /**
     * 成功 200
     */
    SUCCESS(200,"success"),
    USERNAME_ERROR(501,"usernameError"),
    PASSWORD_ERROR(503,"passwordError"),
    NOTLOGIN(504,"notLogin"),
    USERNAME_USED(505,"userNameUsed")
    ;

    private Integer code;
    private String message;
    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    public Integer getCode() {
        return code;
    }
    public String getMessage() {
        return message;
    }
}

添加公共的JSON数据响应格式工具类

package com.doug.wake.common;

/**
 * 全局统一响应的JSON格式处理类
 */
public class Result<T> {
    // 返回码
    private Integer code;
    // 返回消息
    private String message;
    // 返回数据
    private T data;

    public Result() {
    }

    // 返回数据
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null) {
            result.setData(data);
        }
        return result;
    }

    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    /**
     * 操作成功
     *
     * @param data baseCategory1List
     * @param <T>
     * @return
     */
    public static <T> Result<T> ok(T data) {
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

    public Result<T> message(String msg) {
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code) {
        this.setCode(code);
        return this;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

增加Jackson依赖

Java JSON 解析器
2

添加WEBUtil工具类

用于JSON对象转换

package com.doug.wake.util;

import com.doug.wake.common.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;

/**
 * JSON对象转换工具类
 */
public class WebUtil {
    private static ObjectMapper objectMapper;

    // 初始化objectMapper
    static {
        objectMapper = new ObjectMapper();
        // 设置JSON和Object转换时的时间日期格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     *     从请求中获取JSON串并转换为Object
      */
    public static <T> T readJson(HttpServletRequest request, Class<T> clazz) {
        T t = null;
        BufferedReader reader = null;
        try {
            reader = request.getReader();
            StringBuffer buffer = new StringBuffer();
            String line = null;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            t = objectMapper.readValue(buffer.toString(), clazz);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return t;
    }

    /**
     * 将Result对象转换成JSON串并放入响应对象
     * @param response
     * @param result
     */
    public static void writeJson(HttpServletResponse response, Result result) {
        response.setContentType("application/json;charset=UTF-8");
        try {
            String json = objectMapper.writeValueAsString(result);
            response.getWriter().write(json);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

用户名校验业务接口代码

    /**
     * 用于处理前端Ajax传递的用户名 是否被占用的判断
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void checkUsernameUsed(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        SysUser user = userService.findUserByUsername(username);

        //String info = "用户名可以使用!";
        //if (null != user) {
        //    info = "用户名已存在!";
        //}
        //resp.getWriter().write(info);

        Result result = Result.ok(null);
        if (null != user) {
            result = Result.build(null, ResultCodeEnum.USERNAME_USED);
        }

        //将result对象转换为JSON响应给客户端
        WebUtil.writeJson(resp, result);
    }

总结

regist.html页面完整代码 :

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

        .ht {
            text-align: center;
            color: cadetblue;
            font-family: 幼圆;
        }

        .tab {
            width: 500px;
            border: 5px solid cadetblue;
            margin: 0px auto;
            border-radius: 5px;
            font-family: 幼圆;
        }

        .ltr td {
            border: 1px solid powderblue;

        }

        .ipt {
            border: 0px;
            width: 50%;

        }

        .btn1 {
            border: 2px solid powderblue;
            border-radius: 4px;
            width: 60px;
            background-color: antiquewhite;

        }

        .msg {
            color: gold;
        }

        .buttonContainer {
            text-align: center;
        }
    </style>

    <script>
        function checkUsername() {
            var usernameReg = /^[a-zA-Z0-9]{5,10}$/
            var usernameInput = document.getElementById("usernameInput")
            var username = usernameInput.value
            var usernameMsg = document.getElementById("usernameMsg")
            if (!usernameReg.test(username)) {
                usernameMsg.innerText = "格式有误"
                return false
            }
            // Ajax 验证 用户名 是否已被占用
            let request = new XMLHttpRequest();
            // 设置回调函数 对响应回来的数据进行处理
            request.onreadystatechange = function () {
                if (request.readyState == 4 && request.status == 200) {
                    // usernameMsg.innerText = request.responseText;
                    let result = JSON.parse(request.responseText);
                    if (result.code != 200) {
                        usernameMsg.innerText = "不可用"
                    }
                }
            }

            // 设置请求方式 以及 请求目标资源的路径
            request.open("GET", "/user/checkUsernameUsed?username=" + username)
            request.send();

            usernameMsg.innerText = "OK"
            return true
        }

        function checkUserPwd() {
            var userPwdReg = /^\d{6}$/
            var userPwdInput = document.getElementById("userPwdInput")
            var userPwd = userPwdInput.value
            var userPwdMsg = document.getElementById("userPwdMsg")
            if (!userPwdReg.test(userPwd)) {
                userPwdMsg.innerText = "格式有误"
                return false
            }
            userPwdMsg.innerText = "OK"
            return true
        }


        function checkReUserPwd() {
            var userPwdReg = /^\d{6}$/
            // 再次输入的密码的格式
            var reUserPwdInput = document.getElementById("reUserPwdInput")
            var reUserPwd = reUserPwdInput.value
            var reUserPwdMsg = document.getElementById("reUserPwdMsg")
            if (!userPwdReg.test(reUserPwd)) {
                reUserPwdMsg.innerText = "格式有误"
                return false
            }
            // 获得上次密码,对比两次密码是否一致
            var userPwdInput = document.getElementById("userPwdInput")
            var userPwd = userPwdInput.value
            if (reUserPwd != userPwd) {
                reUserPwdMsg.innerText = "两次密码不一致"
                return false
            }
            reUserPwdMsg.innerText = "OK"
            return true
        }


        function checkForm() {
            var flag1 = checkUsername()
            var flag2 = checkUserPwd()
            var flag3 = checkReUserPwd()

            return flag1 && flag2 && flag3
        }


    </script>


</head>
<body>
<h1 class="ht">欢迎使用日程管理系统</h1>
<h3 class="ht">请注册</h3>
<form method="post" action="/user/regist" onsubmit="return checkForm()">
    <table class="tab" cellspacing="0px">
        <tr class="ltr">
            <td>请输入账号</td>
            <td>
                <input class="ipt" id="usernameInput" type="text" name="username" onblur="checkUsername()">
                <span id="usernameMsg" class="msg"></span>
            </td>
        </tr>
        <tr class="ltr">
            <td>请输入密码</td>
            <td>
                <input class="ipt" id="userPwdInput" type="password" name="userPwd" onblur="checkUserPwd()">
                <span id="userPwdMsg" class="msg"></span>
            </td>
        </tr>
        <tr class="ltr">
            <td>确认密码</td>
            <td>
                <input class="ipt" id="reUserPwdInput" type="password" onblur="checkReUserPwd()">
                <span id="reUserPwdMsg" class="msg"></span>
            </td>
        </tr>
        <tr class="ltr">
            <td colspan="2" class="buttonContainer">
                <input class="btn1" type="submit" value="注册">
                <input class="btn1" type="reset" value="重置">
                <button class="btn1"><a href="login.html">去登录</a></button>
            </td>
        </tr>
    </table>

</form>
</body>
</html>
  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb图书管理系统中,使用了AJAX技术实现了一些功能。AJAX(Asynchronous JavaScript And XML)是一种在Web应用中,无需刷新整个页面的情况下,通过异步方式与服务器进行通信的技术。它能够动态地更新页面内容,提升用户体验。 在该图书管理系统中,AJAX被广泛应用于以下功能: 1. 用户查询功能:用户可以通过多条件和模糊查询来查找图书。使用AJAX可以在用户输入查询条件时,实时向服务器发送请求并获取匹配结果,然后动态更新页面显示的图书列表。这样用户无需刷新整个页面就可以得到查询结果。 除了AJAX,还使用了其他技术来构建该系统,如Intellij IDEA作为开发工具,Java语言和HTML、JavaScript来编写代码,MySQL数据库存储数据,Tomcat作为web服务器提供服务,使用了MVC设计模式和MyBatis、jQuery、Bootstrap等框架来实现功能。这些技术和工具的结合使得该图书管理系统具有丰富的功能和用户友好的界面。 另外,图书管理系统还具有其他的功能,如用户管理、图书管理、借还管理、出版社管理、系统管理、系统监控、数据分析等。系统管理员和图书馆管理员可以对这些功能进行操作,而读者则可以进行图书查询和借阅操作。 总的来说,AJAXJavaWeb图书管理系统中用于实现用户查询功能,通过异步方式与服务器通信,动态更新页面内容。该图书管理系统还拥有丰富的功能和使用了多种技术和框架来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加文格罗夫斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值