SpringMVC+RESTful的使用
我们搭建后台服务的整体框架是SpringMVC,设计风格是RESTful,下面就来学学SpringMVC,RESTful
@RestController注解与@RequestMapping注解
@RestController,作用于类上,用于声明这是一个Controller,也就是MVC中的C层
@RequestMapping("/home"),作用于类内具体方法上,对相应的URL请求进行映射
SpringMVC+RESTful的使用总结
SpringBoot是Spring家族的一个集合,集成了Spring,SpringMVC等等,而Spring家族框架的特色就是使用注解开发。
RESTful就是一种访问资源的风格,也就是浏览器地址栏输入的风格:
1. 原始风格:http://localhost:8080/home.html或者http://localhost:8080/home.jsp ,带后缀名
2. RPC风格(Doubble):http://localhost:8080/print.home ,带方法调用
3. RESTful风格(SpringMVC):http://localhost:8080/home ,啥都不带,最多会有?parm=value加个参数之类的
用户注册流程
用户填写viewobject-->转化为model-->拆分为dataobject-->通过DAO插入数据库
Controller层:传递用户填写的数据给Service层,要考虑信息安全性,对于用户敏感信息,诸如密码之类,一定不能明文存到数据库,一定要在Controller层进行加密然后再传递给Service层,执行插入数据库操作。
Service层:具体的逻辑判断,且要注意有判空处理
用户登录流程
用户填写viewobject-->转化为model-->拆分为dataobject-->通过DAO在数据库中进行查询操作
查询密码的时候,需要修改两个文件(Mybatis自动生成的只有selectByPrimaryKey)
-
UserPasswordDOMapper.xml 添加 selectByUserId
-
UserPasswordDOMapper.java 添加 selectByUserId
UserPasswordDOMapper.java中的方法与UserPasswordDOMapper.xml 中数据库CURD语句一一映射。
整体架构分层
1. DAO层 --- dataobject,与数据库一一映射
2. Service层 --- model,整合因业务需求而分离的dataobject
3. Controller层 --- viewobject,屏蔽如密码等敏感信息返回给前端
URL请求发送到Controller层,
Controller层调用Service层;从Service层获取到model,但具体方法需要具体使用。比如Controller层的getUser方法,前端发送localhost:8090/user/get请求,请求用户信息。前端没必要知道用户的密码,登录方式等敏感信息。因此就需要一个viewobject层,用来在返回给前端时屏蔽掉敏感信息。
Service层调用DAO层;在设计数据库的时候我们因为业务需求,把用户信息和密码进行了分表设计,这样就会导致出现UserDO和UserPasswordDO两个dataobject。Service层需要做的工作就是将这两个DO整合到一起并封装为model。
DAO层通过Mybatis的mapping映射进行数据库的CURD操作
对整体架构分层总结:
Controller层需要在类级别加上@Controller(…)、@RequestMapping(…)、@CrossOrigin(…)
Service层只需要在类级别加上@Service
对于Controller,注解加载子类上,BaseController不需要
对于Service,注解加载实现类上,UserService接口不需要
Controller中方法的返回值与类型
我们知道,Controller层返回值是返回给前端页面的。
然而Controller中的方法返回值类型会出现不同,比如返回viewobject,返回null,返回异常Exception信息等等。如果每个方法都有独自的返回值类型的话,那样的设计不太好,也不容易以统一的形式(比如统一的JSON格式)呈现给前端。好的解决方法就是独立出一层:response,创建一种通用的返回值类型CommonReturnType,它有两个属性status和data。
status:success表示成功,fail表示失败;
data:会根据具体业务的不同返回正确信息viewobject或异常信息(异常信息包含errorCode和errorMsg)或空。
对返回值与类型的总结:
- CommonReturnType有自己独立一层:response
- CommonError、BusinessException、EmBusinessError也都有独立一层:error
- CommonError是一个接口,有两个实现类一个是BusinessException,它继承自Exception另一个EmBusinessError,它是一个枚举类,指定了具体的errorCode和errorMsg属性值,用来构造BusinessException对象。
- BusinessException具体异常具体分析,其他非BusinessException异常统一为未知错误。
- 这些异常不只在UserController会发生,因此将异常抽象到BaseController中,其他Controller都继承BaseController,实现代码复用。