【当当网】电子书城-03-注册表单的验证功能

news2024/10/5 13:19:20

前文传送门:

【当当网】电子书城-01-市场背景与项目搭建-CSDN博客

【当当网】电子书城-02-验证码的实现-CSDN博客

点波关注,不迷路

🌲 注册表单验证功能

🌿 为什么要进行表单验证

        表单验证,是指数据在加入到数据库之前,对用户输入的数据进行约束,从而保证进入到数据库中的数据的有效性。

        表单验证可以在前端浏览器中进行也可以在后端服务器中进行。但是需要注意的是,如果全部在后端服务器中进行,那么会对服务器造成很大的压力。因此我们一般将简单的非空、长度、格式等验证放在前端。而需要和服务器进行数据比对的验证,比如:验证邮箱是否被使用、验证码是否正确等等可以放在服务器端进行验证。从而减轻服务器端的压力。

🌿 验证框架的使用

        本项目中我们使用JQueryValidate.js验证框架进行表单验证,由于JQueryValidate表单验证是基于JQuery的,所以在进行在使用之前,需要先引入JQuery框架。

<script src="../js/jquery-1.4.3.js"></script>
<%--		引入JQuery Validate 框架--%>
<script type="text/javascript" src="../js/jquery.validate.min.js"></script>

        validate验证框架首先需要找到需要添加验证规则的表单,然后通过validate()函数中的rules设置验证规则,通过messages设置触犯验证规则后显示的消息,如下面代码所示:

$("#regist_form").validate({
  // 制定验证规则
  rules:{

  },
  // 制定当触犯验证规则时显示的消息
  messages:{

  }
});

        设置验证规则时,我们需要通过表单输入框的name属性来查找对应的输入框并设置验证规则和消息,比如项目中邮箱的输入框如下:

<input name="user.email" type="text" id="txtEmail" class="text_input"/>

那么给邮箱输入框设置验证规则的代码就可以写成如下格式:

$("#regist_form").validate({
  // 制定验证规则
  rules:{
    // 找到name属性为“user.email”标签,添加验证规则
    "user.email":{
      // required 表示是否为必填项, true 表示为必填
      required : true,
      // email 表示是否开启邮箱格式的验证
      email:true,
      remote:{
        type: "GET",
        url:"userAction?method=checkEmail",
        data:{
          email:function(){
            return $("#txtEmail").val();
          }
        }
      }
    }
  },
  // 制定当触犯验证规则时显示的消息
  messages:{
    "user.email":{
      required:"请输入邮箱",
      email:"邮箱格式错误",
      remote:"邮箱已经被注册"
    }
  }
});

最后我们需要为触犯验证消息时错误消息的展示设置label标签,具体写法如下:

<label for="txtEmail" style="color:red" class="error"></label>
  1. 当触犯验证规则时,错误消息,需要显示到label标签中
  2. for="txtEmail" 表示为id为txtEmail的标签显示错误消息
  3. class="error" 表示,当有错误消息时,会根据class="error"自动识别label标签,显示错误消息

测试时需要注意以下几点:

1. Jquery validate验证框架需要基于Jquery框架的,所以先引入JQuery再引入validate

2. 如果引入了validate.js 但是运行起来之后找不到验证框架,需要点Build-》rebuild Project重构一下项目

3. 如果错误消息显示的是英文,就检查messages是否写成了message

4. 如果错误消息显示的是黑体,就检查label是否写对了

常见的验证规则:

序号

规则

描述

1

required:true

必须输入的字段。

2

remote:"check.php"

使用 ajax 方法调用 check.php 验证输入值。

3

email:true

必须输入正确格式的电子邮件。

4

url:true

必须输入正确格式的网址。

5

date:true

必须输入正确格式的日期。日期校验 ie6 出错,慎用。

6

dateISO:true

必须输入正确格式的日期(ISO),

例如:2009-06-23,1998/01/22。只验证格式,不验证有效性。

7

number:true

必须输入合法的数字(负数,小数)。

8

digits:true

必须输入整数。

9

creditcard:

必须输入合法的信用卡号。

10

equalTo:"#field"

输入值必须和 #field 相同。

11

accept:

输入拥有合法后缀名的字符串(上传文件的后缀)。

12

maxlength:5

输入长度最多是 5 的字符串(汉字算一个字符)。

13

minlength:10

输入长度最小是 10 的字符串(汉字算一个字符)。

14

rangelength:[5,10]

输入长度必须介于 5 和 10 之间的字符串(汉字算一个字符)。

15

range:[5,10]

输入值必须介于 5 和 10 之间。

16

max:5

输入值不能大于 5。

17

min:10

输入值不能小于 10。

🌿 注册时的表单验证

首先给注册页面所有的表单输入框添加验证规则:

// 给id为regist_form的表单添加验证规则
$("#regist_form").validate({
  // 制定验证规则
  rules:{
    // 找到name属性为“user.email”标签,添加验证规则
    "user.email":{
      // required 表示是否为必填项, true 表示为必填
      required : true,
      // email 表示是否开启邮箱格式的验证
      email:true,
      remote:{
        type: "GET",
        url:"userAction?method=checkEmail",
        data:{
          email:function(){
            return $("#txtEmail").val();
          }
        }
      }
    },
    "user.nickname":{
      required:true,
      // rangelength: 设置长度范围
      rangelength:[4,20]
    },
    "user.password":{
      required:true,
      rangelength:[6,20]
    },
    "password1":{
      required:true,
      // equalTo:表示输入框中输入的内容要和指定的输入框中的一致
      // 下面代码表示,当前输入框的内容要和id为txtPassword的输入框中的内容一致
      equalTo:"#txtPassword"
    },
    "number":{
      required:true,
      // 异步验证
      remote:{
        // 异步请求的方式
        type:"GET",
        // 异步请求的地址
        url:"userAction?method=checkCode",
        // 携带的数据
        data:{
          // 将验证码的内容,封装成名字为number的数据
          number:function(){
            // 获取验证码输入框中的内容,
            return $("#txtVerifyCode").val();
          }
        }
      }
    }
  },
  // 制定当触犯验证规则时显示的消息
  messages:{
    "number":{
      required:"请输入验证码",
      remote:"验证码错误"
    },
    "password1":{
      required:"请确认密码",
      equalTo:"两次输入的密码不一致"
    },
    "user.password":{
      required:"请输入密码",
      rangelength:"长度必须为6-20个字符"
    },
    "user.email":{
      required:"请输入邮箱",
      email:"邮箱格式错误",
      remote:"邮箱已经被注册"
    },
    "user.nickname":{
      required:"请输入昵称",
      rangelength:"长度必须为4-20个字符"
    }
  }
});

然后分别给每个输入框设置显示错误消息的label:

<label for="txtEmail" style="color:red" class="error"></label>
<label for="txtNickName" style="color:red" class="error"></label>
<label for="txtPassword" style="color:red" class="error"></label>
<label for="txtRepeatPass" style="color:red" class="error"></label>
<label for="txtVerifyCode" style="color:red" class="error"></label>

在验证验证码时,我们前面将输入的验证码发送到服务器里面去匹配并获取到结果,服务器端代码具体如下:

/**
     * 处理检查验证码的请求
     * 1. 从session中获取保存的验证码
     * 2. 从请求中获取用户输入的验证码
     * 3. 比较两个验证码
     * @param req
     * @param resp
     */
public void checkCode(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    //1. 从session中获取保存的验证码
    String sessionCode = (String)req.getSession().getAttribute("code");
    //2. 从请求参数中获取验证码
    String inputCode = req.getParameter("number");
    //3. 比较两个验证码
    boolean result = sessionCode.equalsIgnoreCase(inputCode);
    //将结果返回给客户端
    PrintWriter out = resp.getWriter();
    out.println(result);  // 此处返回的是true,验证通过,返回false,验证失败

}

在验证邮箱中,我们将输入的邮箱发到了服务里面查询一下当前邮箱是否被占用了,如果被占用就不能注册此邮箱,保证我们数据库中的邮箱是唯一的,服务端代码写法如下:

/**
     * 检查邮箱是否被注册
     * @param req
     * @param resp
     */
public void checkEmail(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    // 从请求中获取邮箱
    String email = req.getParameter("email");
    // 创建与用户相关的业务人员
    UserService service = new UserServiceImpl();
    // 让业务人员去检查邮箱是否可用,并返回结果
    boolean result = service.checkEmail(email);
    // 将处理结果返回给浏览器
    PrintWriter out = resp.getWriter();
    out.println(result);

}

在业务端中,我们需要添加检查邮箱是否被占用的业务逻辑,具体代码如下:

/**
     * 检查邮箱是否可用
     * @param email
     * @return
     */
@Override
public boolean checkEmail(String email) {
    // 创建仓库管理员(Dao)
    UserDao dao = new UserDaoImpl();
    // 让仓库管理员拿着邮箱去数据库中查找是否有对应的用户
    User user = dao.findUserByEmail(email);
    // 将结果返回给控制器层
    return user==null;
}

在dao中,我们需要让dao根据邮箱去数据库中查找数据,看是否能查到数据,具体代码如下:

/**
     * 根据制定邮箱查询用户
     * @param email
     * @return
     */
@Override
public User findUserByEmail(String email) {
    String sql = "select * from d_d_user where email=?";
    return DBUtils.queryOne(User.class,sql,email);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何获取网页内嵌入的视频?

如何获取网页内嵌入的视频&#xff1f; 有时插件无法识别的视频资源&#xff0c;可以通过手动使用浏览器的开发者工具来抓取。你可以按照以下步骤操作&#xff1a; 步骤&#xff1a; 打开网页并按 F12&#xff1a;在视频页面按下 F12 或右键点击网页并选择“检查”或“Inspe…

Spring Boot实现的大学生就业市场解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【案例】距离限制模型透明

开发平台&#xff1a;Unity 2023 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、路线图 三、案例分析 核心思路&#xff1a;计算算式&#xff1a;透明值 实际距离 / 最大距离 &#xff08;实际距离 ≤ 最大距离&#xff09;   3.1 说明 | 改变 Alpha 值 在 …

简易投影仪的制作

今天不做开发类的文章&#xff0c;来给大家整个活哈哈哈哈哈。由于前几天室友说看小屏幕的抖音太不舒服&#xff0c;比较累眼睛&#xff0c;所以我萌生出来一个制作投影仪的想法。于是查阅了资料最终完成以下的设计。 以下设计价格最高的是一部旧的可拆卸的智能手机 简易投影仪…

C++11新特性(基础)【2】

目录 1.范围for循环 2.智能指针 3.STL中一些变化 4.右值引用和移动语义 4.1 左值引用和右值引用 4.2 左值引用与右值引用比较 4.3 右值引用使用场景和意义 4.4 右值引用引用左值及其一些更深入的使用场景分析 4.5 完美转发 1.范围for循环 int main() {int array[10] { 1,2,3,4…

CSS | CSS中强大的margin负边距

css中的负边距(negative margin)是布局中的一个常用技巧&#xff0c;只要运用得合理常常会有意想不到的效果。很多特殊的css布局方法都依赖于负边距&#xff0c;所以掌握它的用法对于前端的同学来说&#xff0c;那是必须的。本文非常基础&#xff0c;老鸟可以略过。 一、负边距…

【宽搜】3. leetcode 515 在每个树行中找最大值

1 题目描述 题目链接&#xff1a;在每个树行中找最大值 2 题目解析 根据题目描述&#xff0c;是找出每一行中的最大值&#xff0c;这毋庸置疑是使用宽度优先遍历了。我在这篇文章中讲解了宽度优先遍历的模板&#xff0c;如果没有看的同学可以先去看一下。 这道题和模板的不…

基于微信小程序的调查问卷管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

数据结构与算法(七)静态链表

目录 前言 一、静态链表的引入 二、线性表的静态链表存储结构 三、静态链表的插入操作 四、静态链表的删除操作 五、静态链表的优缺点总结 1、优点 2、缺点 3、小结 六、单链表小结——Tecent面试题 1、普通解法&#xff1a; 2、高级解法&#xff1a; 前言 静态链表…

基于CAN总线的TMS320F28335 Bootloader设计说明

1 设计目的 根据客户要求&#xff0c;开发一款基于CAN总线的TI公司TMS320F28335 DSP&#xff08;数字信号处理器&#xff09;bootloader&#xff0c;以方便应用程序的刷写。CAN设备采用周立功CAN卡&#xff08;USBCAN-I、USBCAN-II、USBCAN-E-mini&#xff09;。 2 专有信息 …

一篇文章吃透OA系统

一、OA系统是什么&#xff0c;都有什么功能&#xff1f; OA系统&#xff08;Office Automation System&#xff09;是办公自动化系统的简称&#xff0c;是一种利用计算机技术和网络通信技术&#xff0c;为企业和组织提供办公管理和协作支持的信息化系统。OA系统旨在提高办公效…

讯飞星火编排创建智能体学习(五):变量和文本拼接

引言 在讯飞星火编排创建智能体学习&#xff08;四&#xff09;&#xff1a;网页读取-CSDN博客中&#xff0c;我介绍了如何用网页读取功能从网上搜索车次信息。其中&#xff0c;我使用用大模型节点从文本中提取车次并合成了所需要的URL&#xff0c;今天介绍一下如何用变量和文…

win7怎么禁用驱动强制数字签名?win7驱动程序强制数字签名禁用方法

在Windows 7 64位操作系统中&#xff0c;安装驱动程序时可能会遇到“数字签名”的问题&#xff0c;这是微软为了确保驱动程序的安全性和可靠性而引入的一项安全机制。本文将深入探讨这个问题&#xff0c;并提供有效的解决方案。 理解数字签名的概念是至关重要的。数字签名是一…

LabVIEW机床加工监控系统

随着制造业的快速发展&#xff0c;机床加工的效率与稳定性成为企业核心竞争力的关键。传统的机床监控方式存在效率低、无法远程监控的问题。为了解决这些问题&#xff0c;开发了一种基于LabVIEW的机床加工监控系统&#xff0c;通过实时监控机床状态&#xff0c;改进生产流程&am…

新闻推荐系统:Spring Boot的架构优势

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

详解JavaScript函数属性、方法和构造函数

函数属性、方法和构造函数 JS中&#xff0c;函数是值&#xff0c;对函数执行typeof运算会返回function&#xff0c;但是函数是JS中特殊的对象&#xff0c;也可以拥有属性和方法。 length属性 函数体里面&#xff0c;arguments.length表示传入函数的实参个数&#xff0c;而函…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第2关---8G 显存玩转书生大模型 Demo

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV18x4y147SU/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/Demo/rea…

数据结构与算法——Java实现 29.优先级队列

事缓则圆&#xff0c;人缓则安 —— 24.10.5 一、优先级队列 优先级队列 一端进&#xff0c;另一端出 按优先级出队 普通队列 一端进&#xff0c;另一端出 先进先出FIFO 二、无序数组实现 Type parameters…

IIOT工业物联网的标准与互操作性—SunIOT

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 工业物联网&#xff08;IIoT&#xff09;正以惊人的速度重塑着工业领域的生产方式、运营模式和价值创造。然而&#xff0c;要实现工业物联网的广泛应用和充分发挥…

qt cmake自定义资源目录,手动加载资源(图片, qss文件)

1. 目录创建 因为使用非qtcreator或者自定义工程结构就没法自动加载图标&#xff0c;所以需要手动加载&#xff0c;这里使用vscode和自定义工程结构 vscode qt 环境搭建&#xff1a; https://blog.csdn.net/qq_51355375/article/details/140733495 qt 自定义工程结构参考(因使…