首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【JavaWeb】103:用户注册功能的实现

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

感谢你的观看,谢谢你。

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

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

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

以及今天要学习的注册功能。

此外还有邮箱激活业务的实现,这块不知道还有没有时间去学习。

一、前端发送注册请求

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

提交事件

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

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

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

默认不提交

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

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

将表单数据序列化

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

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

提交请求

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

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

如果邮箱后台校验未注册,提交请求。

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

二、Servlet优化

以前是一个请求对应一个Servlet:

邮箱校验请求对应CheckEmailServlet

注册请求对应RegisterServlet

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

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

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

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

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

那么Servet中的代码如何编写?

一步一步来编写并优化代码:

1UserServlet

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

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

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

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

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

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

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

但是其又有一个问题:

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

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

2UserServlet优化之BaseServlet

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

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

这样做的好处在于:

BaseServlet中专门用来处理请求。

UserServlet中专门用来处理具体的业务。

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

获取方法对象

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

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

getClass:获取UserServlet的Class对象。

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

methodName:对应的方法名,也就是请求路径中携带的参数。

后面两个参数为该方法对应参数的Class对象,也就是请求和响应。

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

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

invoke方法

method.invoke(this,request,response)

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

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

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

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

/userServlet?methodName=register

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

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

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

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

最后在UserServlet实现具体的业务处理。

三、注册业务完善

1web层代码编写

BeanUtils.populate()

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

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

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

Service层注册方法

返回值类型为boolean:如果为true,注册成功;如果为false,注册失败。

如果有异常的话,返回false并提示信息。

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

2service层

密码加密处理

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

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

设置激活状态为0

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

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

生成激活码

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

3dao层

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

就是数据表字段很多,所以需要一个个地从user对象中获取。

最后

谢谢你的观看。

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200726A049DA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券