Java项目实战第4天:注册功能的实现
今天是刘小爱自学Java的第103天 。
感谢你的观看 , 谢谢你 。
话不多说 , 开始今天的学习:

文章图片
这几天时间主要是学习和注册页面相关的业务:
包括前端校验数据的合法性和完整性 , 后台校验数据的唯一性 。
以及今天要学习的注册功能 , 此外还有邮箱激活业务的实现 , 这块不知道还有没有时间去学习 。
一、前端发送注册请求
根据校验结果判断是否将数据提交:

文章图片
①提交事件
在注册页面form表单中 , 有一个提交按钮 , 也就是说该按钮一被点击就会触发提交事件 。
jQuery中使用submit()方法来绑定该事件 , 一旦registerForm中出现提交就会触发方法里的内容 。
使用console.log()可以作为一个检测 。
【Java项目实战第4天:注册功能的实现】②默认不提交
本来默认是会将form表单中的数据提交 , 但是为了节省资源 , 在前端校验和后台校验成功后才提交请求 。
所以使用returnfalse , 将表单设置成默认情况下不提交 。
③将表单数据序列化
因为注册业务需要将整个表单的数据都提交 , 如果使用键值对的方式提交数据 , 太繁琐了 。
所以使用jQuery中的serialize()方法 , 将表单数据序列化 。
④提交请求
在提交前做一个判断 , 也就是昨天做的邮箱唯一性校验 。

文章图片
如果邮箱后台校验已注册 , 不提交请求 。
如果邮箱后台校验未注册 , 提交请求 。
否则邮箱校验没啥意义 , 只是在页面提醒了用户 , 但照样还是能够提交数据到后台 。
二、Servlet优化
以前编写代码时 , 是一个请求对应一个Servlet:
邮箱校验请求对应CheckEmailServlet
注册请求对应RegisterServlet
但是事实上Servlet应该以模块划分 , 比如UserServlet对应的是和用户相关的模块 。
那么无论是邮箱校验请求还是注册请求 , 甚至是登录请求对应的都是UserSerlet的 。
如何让一个Servlet对应多个请求?

文章图片
在url路径后面拼接一个methodName来区分不同的请求 。
这样的话 , 不同的请求可以对应同一个Servlet了 。
那么Servet中的代码如何编写?一步一步来编写并优化:
1UserServlet

文章图片
凡是路径为userServlet的请求都由该Servlet接受 。
获取请求中的参数“methodName”对应的值 , 根据其值不同来实现不同的业务 。
当然上述具体的业务还没有编写 , 先写一个输出语句用来判断请求是否接收成功 。
将具体的业务封装在一个方法中 , 然后在if条件语句中直接调用对应的方法就好了 。
封装一个校验邮件唯一性的方法 , 命名为checkEamil() , 代码编写如下:

文章图片
具体的代码编写逻辑昨天详解过 , 不再赘述 。
这样的好处在于:一个方法对应一个请求业务 , 一目了然 。
但是其又有一个问题:
如果userServlet接收的请求有很多个 , 对应很多个elseif , 这个是极其不合适的 。
为了解决这个问题 , 就需要使用到反射 。
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
因为是get请求 , 所以该请求路径下 , 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对象中获取 。
最后
谢谢你的观看 。
如果可以的话 , 麻烦帮忙点个赞 , 谢谢你 。
推荐阅读
- 成龙的功夫是杂技,洪金宝胖的不灵活,周比利评价两人实战能力
- 项目|官宣!超4700亿元的大项目
- 房山区|房山区一回迁安置房项目最新进展来了
- Java|软件开发平台之争:NET VS Java,谁是更好的选择?
- IPFS/Filecoin上线后会涨的八大理由,实战讲解!
- 贵州省第二届电力青年“双创”项目挑战赛在安顺举行
- 大众报业·大众日报|重点工作攻坚看行动丨营商环境怎么样?两个项目看变化
- 喜讯!青浦又一动迁安置房项目正式开工
- 全民健身大会丨徒步项目总决赛完美收官
- 珠海边检与澳门警察联合举行通关实战演练
