【JavaWeb】103:客户注册功能的实现
来源:     阅读:659
依创模板店
发布于 2020-11-08 05:02
查看主页

今天是刘小爱自学Java的第103天。

感谢你的观看,谢谢你。

话不多说,开始今天的学习:

image

这几天时间主要是学习和注册页面相关的业务:

包括前台校验数据的合法性和完整性,后端校验数据的唯一性。

以及今天要学习的注册功能,此外还有邮箱激活业务的实现,这块不知道还有没有时间去学习。

一、前台发送注册请求

根据校验结果判断能否将数据提交:

image

①提交事件

在注册页面form表单中,有一个提交按钮,也就是说该按钮一被点击就会触发提交事件。

jQuery中使用submit()方法来绑定该事件,一旦registerForm中出现提交就会触发方法里的内容。

使用console.log()可以作为一个检测。

②默认不提交

原本默认是会将form表单中的数据提交,但是为了节省资源,在前台校验和后端校验成功后才提交请求。

所以使用return false,将表单设置成默认情况下不提交。

③将表单数据序列化

由于注册业务需要将整个表单的数据都提交,假如使用键值对的方式提交数据,太繁琐了。

所以使用jQuery中的serialize()方法,将表单数据序列化。

④提交请求

在提交前做一个判断,也就是昨天做的邮箱唯一性校验。

image

假如邮箱后端校验已注册,不提交请求。

假如邮箱后端校验未注册,提交请求。

否则邮箱校验没啥意义,只是在页面提示了客户,但照样还是能够提交数据到后端。

二、Servlet优化

以前编写代码时,是一个请求对应一个Servlet:

但是事实上Servlet应该以模块划分,比方UserServlet对应的是和客户相关的模块。

那么无论是邮箱校验请求还是注册请求,甚至是登录请求对应的都是UserSerlet的。

如何让一个Servlet对应多个请求?

image

在url路径后面拼接一个methodName来区分不同的请求。

这样的话,不同的请求可以对应同一个Servlet了。

那么Servet中的代码如何编写?一步一步来编写并优化:

1UserServlet

image

但凡路径为userServlet的请求都由该Servlet接受。

获取请求中的参数“methodName”对应的值,根据其值不同来实现不同的业务。

当然上述具体的业务还没有编写,先写一个输出语句用来判断请求能否接收成功。

将具体的业务封装在一个方法中,而后在if条件语句中直接调用对应的方法就好了。

封装一个校验邮件唯一性的方法,命名为checkEamil(),代码编写如下:

image

具体的代码编写逻辑昨天详解过,不再赘述。

这样的好处在于:一个方法对应一个请求业务,一目了然。

但是其又有一个问题:

假如userServlet接收的请求有很多个,对应很多个else if,这个是极其不合适的。

为理解决这个问题,就需要使用到反射。

2UserServlet优化之BaseServlet

这一块比较难了解,弄了好久才弄明白:

创立一个类BaseServlet,继承HttpServlet类,将doPost方法和doget方法封装在这个类中,再让UserServlet继承BaseServlet。

这样做的好处在于:

BaseServlet中专门用来解决请求。

UserServlet中专门用来解决具体的业务。

回顾一下反射的知识点,这块我在第51天仔细讲解过。

image

①获取方法对象

this是指谁调用我就是谁,这里是谁调用了doGet方法?

是UserServlet对象,为什么是它,后面有图片分析,此处着重讲下反射。

getClass:获取UserServlet的Class对象。

getDeclaredMethod:获取UserServlet中的方法,其有3个参数:

为什么要有后面两个参数?

由于方法可以重载的,同名的方法可能会有好几个,需要使用参数来确定对应的是哪一个方法。

②invoke方法

method.invoke(this,request,response)

这个就相当于method调用了它自己。

method是谁?是根据前台提交的请求路径中的methodName来确定的。

所以该方法执行的就是this(也就是UserServlet中的)方法,具体是那个需要看前台提交的请求路径。

为了方便了解,画一个流程图:

image

/userServlet?methodName=register

由于是get请求,所以该请求路径下,UserServlet会接受该请求,并执行doGet方法。

但是它自己没有doGet方法了,所以就会去它的父类BaseServlet中找对应的请求方法。

所以此时②中的this指的就是UserServlet。

②中获取请求路径中的methodName,这里是checkEmail,所以会执行UserServlet中的checkEmail。

最后在UserServlet实现具体的业务解决。

三、注册业务完善

也就是经典的三层代码编写。

1web层代码编写

image

①BeanUtils.populate()

前台页面数据、数据库中的数据在Java中都可以对应成一个类。

注册页面客户提交的数据是有很多,使用getParamterMap方法可以将这些数据以map的形式获取。

而BeanUtils.populate()就是将map转换成一个JavaBean,上述例子中就是User这个类。

②Service层注册方法

返回值类型为boolean:

假如为true:注册成功;假如为false:注册失败。

假如有异常的话,返回false并提醒信息。

将这些数据存放在一个map中,后面转换成一个json数据响应给前台。

2service层

image

①密码加密解决

使用Md5Util可以将密码加密,不然的话不安全,客户的密码很容易就被知道了。

加密之后,再将其存到user对象中。

②设置激活状态为0

这个是和邮件激活业务相对应的,我们很多时候去注册一个网站,经常都需要在邮箱中激活一下。

若为0表示还未在邮箱中激活,激活了就将对应客户的该属性设置成1。

③生成激活码

这里使用的是UUID,尽可能保证激活码的唯一性,也是和邮箱业务相对应的。

3dao层

image

使用jdbcTemplate的update方法就可插入数据。

基本的一个插入方法,就是数据表字段很多,所以需要一个个地从user对象中获取。

最后

谢谢你的观看。

假如可以的话,麻烦帮忙点个赞,谢谢你。

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 windows
相关推荐
教你修改Red Hat  Enterprise Linux的grub启动界面背景
大神话架构,码农聊语言,说说你最喜欢的编程语言?
零基础怎么学IT?新手如何快速入门
JS事件对象中 target 和 currentTarget 的区别
2020 一起读 vue 源码
首页
搜索
订单
购物车
我的