前言
不要忘记我这次重看视频的初衷可是要整一个Android借助本地MySQL进行登录注册的功能
第3章·用户模块开发的基本流程:
整体架构分层—>用户信息分层处理 —> 封装返回信息 —> otp手机验证码开发 —> 前端页面开发—>登录注册功能开发
上一章,我们学会了:
- 构建Maven项目
- 引入SpringBoot
- 引入Mybatis
- 简单使用SpringMVC
接下来就要详细的学习使用SpringMVC了,具体知识点有:
-
MVC分层架构
-
通用返回类型
-
otp验证码生成
-
登录、注册功能
-
项目中的校验逻辑
正文
一、整体架构分层
上一章的最后我们在App.java中简单的使用了具有RESTful风格的SpringMVC,但总不能所有逻辑都写到App.java中吧,因此,急需做的事情就是先分层。
新建两个包,一个controller,一个service
在controller里新建一个UserController,service里新建一个接口UserService以及对应实现类UserServiceImpl
而Service层是要将用户模型即用户信息返回给Controller层,需要访问数据库。
这样就有需要一个DAO层,这一层Mybatis已经帮我们实现好了。
它们的关系是:
URL请求发送到Controller层,
Controller层调用Service层,
Service层调用DAO层,
DAO层通过Mybatis的mapping映射进行数据库的CURD操作(CURD就是增删改查的意思)。
对整体架构分层总结:
Controller层需要在类级别加上@Controller(…)、@RequestMapping(…)、@CrossOrigin(…)
Service层只需要在类级别加上@Service
对于Controller,注解加载子类上,BaseController不需要
对于Service,注解加载实现类上,UserService接口不需要
这些层是前辈们多少年的工业经验,作为后辈应以谦卑的心态虚心学习,理解其中的思想,诸如解耦,可扩展性,易维护性,单一职责原则(SRP)等等。
二、用户模型在三层不同的处理方式
上面的流程是从View层到Model层,下面再来理解一下从Model层到View层的流程。
-
DAO层:最底层的就是DAO从数据库一一映射过来的dataobject,DAO层需要做的就是用户信息的CURD工作。
-
Service层:在设计数据库的时候我们因为业务需求,把用户信息和密码进行了分表设计,这样就会导致出现UserDO和UserPasswordDO两个dataobject。Service层需要做的工作就是将这两个DO整合到一起并封装为model。
-
Controller层:从Service层获取到model,但具体方法需要具体使用。比如Controller层的getUser方法,前端发送localhost:8090/user/get请求,请求用户信息。前端没必要知道用户的密码,登录方式等敏感信息。因此就需要一个viewobject层,用来在返回给前端时屏蔽掉敏感信息。
疑问:model整合dataobject而来,现在又要进行屏蔽,图个啥?
回答:Controller层的具体方法具体使用,getUser方法是用来返回给前端的,用不到model中的一些信息,因此使用viewobject屏蔽用户密码等敏感信息,但是Controller层不是仅仅getUser这一个功能,比如还有登录验证login等功能,这时候就需要model更多的信息来进行比较了。
对用户信息分三层的总结:
1. DAO层 --- dataobject,与数据库一一映射
2. Service层 --- model,整合因业务需求而分离的dataobject
3. Controller层 --- viewobject,屏蔽如密码等敏感信息返回给前端
如果能够理解这三层的具体作用,对整个项目的理解会有很大的帮助。
三、Controller中方法的返回值与类型
我们知道,Controller层返回值是返回给前端页面的。
然而Controller中的方法返回值类型会出现不同,比如返回viewobject,返回null,返回异常Exception信息等等。如果每个方法都有独自的返回值类型的话,那样的设计不太好,也不容易以统一的形式(比如统一的JSON格式)呈现给前端。好的解决方法就是独立出一层:response,创建一种通用的返回值类型CommonReturnType,它有两个属性status和data。
status:success表示成功,fail表示失败;
data:会根据具体业务的不同返回正确信息viewobject或异常信息(异常信息包含errorCode和errorMsg)或空。
CommonReturnType构造对象的代码如下,正如三少老师所讲,二重奏方法:
public static CommonReturnType create(Object result){
return CommonReturnType.create(result,"success")