Springboot基本结构——注册 控制层
在控制层,我们要处理的是各种响应,比如各种状态码、状态描述信息等。它们经常会被用到,所以最好是把它们放在一个工具类中封装,并返回给前端浏览器。
我们创建一个utils包,里面有一个JsonResult类,这个就是我们要集中处理的类。
这个类里面有状态码,状态描述信息和数据:
可以看到data的类型是一个泛型。这很正常,因为你也不确定用户要查询的到底是什么类型的数据,它可能多种多样,所以用泛型是最好的选择。
然后就是一些正常的构造方法和get还有set方法:
这一部分完成后,就该设计请求了,其目的是将用户数据发送到数据库,其实就是向后端发送请求。
对于请求,首先规划的就是请求路径。只要是注册的请求,全部都应该是/users/register这个路径。
更多请求的设计详情请看下面:
设计完请求现在就应该处理请求了。这是控制层应该要干的事,所以现在我们创建一个controller包并在里面创建一个基本的控制类:
1 //控制层类的基类 2 public class BaseController { 3 //操作成功的状态码 4 public static final int OK = 200; 5 6 //请求处理方法,这个函数的返回值就是需要传递到前端的数据 7 //自动将异常对象传递到此方法的参数列表上 8 @ExceptionHandler(ServiceException.class) //统一处理抛出的异常 9 public JsonResult<Void> handleException(Throwable e) { 10 JsonResult<Void> result = new JsonResult<>(e); 11 if (e instanceof UsernameDuplicatedException) { 12 result.setState(4000); 13 result.setMessage("用户名已经被占用"); 14 } else if (e instanceof InsertException) { 15 result.setState(5000); 16 result.setMessage("注册时产生未知的异常"); 17 } 18 return result; 19 } 20 }
这个类也是控制层的基类。
可以注意到这里有一个ExceptionHandler的注解,这个注解用来统一处理抛出的异常。现在问题来了,到底什么样类型的异常呢?我们业务层的功能之一是处理异常,基类是ServiceException,那这个注解的参数列表就给个这个ServiceException.class就好了。
此时这个方法就成了请求处理方法,其返回值就是要传递给前端的数据。
现在创建一个UserController类:
@RestController //直接返回一个对象 @RequestMapping("users") public class UserController extends BaseController { @Autowired private IUserService userService; @RequestMapping("register") public JsonResult<Void> register(@RequestBody User user) { //参数里面有一个RequestBody注解,这个可以把前台的json对象转成后台的java对象 userService.register(user); return new JsonResult<>(OK); } }
这个类要继承BaseController类。你会注意到还有一个RequestMapping注解,这个注解就是标识一个类,设置映射请求的请求路径的初始信息。
还有一个RestController注解,意思是它的作用相当于Controller和RequestBody这两个注解,但在实际测试过程中(我用的是postman)效果并不好,所以就还是加了RequestBody这个注解。
我们控制层是处理请求,处理啥请求?用户的注册请求。这个最开始是在哪里定义的?是在业务层。所以我们定义一个IUserService类型的对象就好了,在这里直接调用它的register方法。
现在来分析一下为什么在这里我们需要这个控制层的基类。其实也可以不要,但是需要在UserController里面编写异常的处理方法。这只是一个UserController,如果有其他很多这样的需要编写异常处理方法的类怎么办?那岂不是每个类里面都要写一个这样的处理逻辑?太麻烦了,所以索性写一个专门的类来处理,后续要用到的话直接继承过来就好,所以这就是BaseController的由来。