前面我们实现了注册和登录的业务逻辑,我们本章实现controller层,编写对接前端的网络访问的接口。
前端访问一般会带上url,比如127.0.0.1/user/login等;
那我们的后端就要对接"/user/login"这个访问请求,将/user/login这个访问路径对应到java的某个方法;
而这个方法再去调用我们之前的userRegister或者userLogin等执行实际业务的代码。
在/com.tfzhang.backend/controller/中新建UserController.java文件,代码结构:
x("/user")public class UserController { private UserService userService; /** * 用户注册 */ ("/register") public Long userRegister() { //调用service接口; }
/** * 用户登录 */ ("/login") public User userLogin() { //调用service接口; }此处头部的路径"/user",然后每个方法前的路径名为"/register"和"/login",与前端访问的路径/user/register和/user/login分别对应。
我们先从userRegister入手开始编写代码,要解决的两个问题:
如何接收前端的参数;
代码中如何调用service接口;
根据spring web特性,当客户端发送一个POST或PUT请求,并且请求体中包含JSON或XML数据时,我们需要使用@RequestBody注解来接收这些数据。在这种情况下,通常还需要将请求体绑定到一个Java对象上,因此也需要进行封装。
所以为了接收数据,我们在/com.tfzhang.backend/model下创建request包,然后在其中创建UserRegisterRequest类:
xxxxxxxxxxpackage com.tfzhang.backend.model.request;import lombok.Data;import java.io.Serializable;
public class UserRegisterRequest implements Serializable { private static final long serialVersionUID = 3190829218873263336L;
private String userAccount; private String userPassword; private String checkPassword;}有几个点需要说明下:
@Data标签,用于自动生成get、set等方法,免去代码的手动编写;
实现Serilizable接口用于序列化,实现Serializable接口意味着这个类的对象可以被序列化,通常用于网络传输或保存到文件中,上述的serialVersionUID可以借助插件来生成,插件名称:GenerateSerialVersionUID;
完成上述的UserRegisterRequest后,我们再来书写userRegister的代码:
xxxxxxxxxx ("/register") public Long userRegister( UserRegisterRequest userRegisterRequest){ if(userRegisterRequest==null){ return null; }
String userAccount = userRegisterRequest.getUserAccount(); String userPassword = userRegisterRequest.getUserPassword(); String checkPassword = userRegisterRequest.getCheckPassword();
if(StringUtils.isAnyBlank(userAccount,userPassword,checkPassword)){ return null; } Long result = userService.userRegister(userAccount, userPassword, checkPassword); return result; }为什么参数中要使用@RequestBody标签,我们前面已经提过;至于为什么是返回null,因为Long虽然是长整数,但它是对象型数据。
对于userLogin的代码也是同样,我们先在model/request/中创建UserLoginRequest类,然后再实现controller/UserController中的userLogin方法;
UserLoginRequest.java的代码:
xxxxxxxxxxpackage com.tfzhang.backend.model.request;import lombok.Data;import java.io.Serializable;
public class UserLoginRequest implements Serializable { private static final long serialVersionUID = -8338104189763826441L; private String userAccount; private String userPassword;
}userLogin的方法:
xxxxxxxxxx ("/login") public User userLogin( UserLoginRequest userLoginRequest, HttpServletRequest request){ if(userLoginRequest==null){ return null; }
String userAccount = userLoginRequest.getUserAccount(); String userPassword = userLoginRequest.getUserPassword();
if(StringUtils.isAnyBlank(userAccount,userPassword)){ return null; } User result = userService.userLogin(userAccount, userPassword,request); return result; }
测试的步骤:
1、启动我们的BackendApplication,等待连接请求;
2、利用 IDEA自带的网络访问工具,创建访问,并发起访问;
我们先启动BackendApplication,如图1所示:

然后利用IDEA自带网络测试工具,如图2所示:

我们先创建登录的测试访问,如图3所示,测试成功过,后端的确返回user数据:

按照同样的方式,我们再来测试注册接口,注册成功返回大于0的正数,否则返回负数;
逻辑删除的测试
假设我们现在将"tfzhang2" 用户的逻辑删除位设置为1,那么再用tfzhang2登录应该失败,我们来尝试下。
至于如何将tfzhang2的isDelete设置为1,则参考图4:

当isDelete设置为1时,再次登录,发现返回数据为空,说明逻辑删除的确发挥作用。
至此,对于login和register我们的controller开发完成,后续我们要完成用户管理接口:查找用户和删除用户。