美文网首页程序员
【JavaWeb】103:用户注册功能的实现

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

作者: 刘小爱 | 来源:发表于2020-08-02 21:02 被阅读0次

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

    感谢你的观看,谢谢你。

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

    image

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

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

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

    一、前端发送注册请求

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

    image

    ①提交事件

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

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

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

    ②默认不提交

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

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

    ③将表单数据序列化

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

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

    ④提交请求

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

    image

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

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

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

    二、Servlet优化

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

    • 邮箱校验请求对应CheckEmailServlet

    • 注册请求对应RegisterServlet

    但是事实上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个参数:

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

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

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

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

    ②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对象中获取。

    最后

    谢谢你的观看。

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

    相关文章

      网友评论

        本文标题:【JavaWeb】103:用户注册功能的实现

        本文链接:https://www.haomeiwen.com/subject/dcrmrktx.html