今天是刘小爱自学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对象中获取。
最后
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。
领取专属 10元无门槛券
私享最新 技术干货