写在前面
抛弃JSP,只做纯粹的前后端分离项目。
作为一个资深前端工作者,想要转JavaWeb开发,无论是书籍,还是网上视频、资料,竟然没有一篇能清楚明白地讲解怎样搭建一个前后端分离项目。这让小编很是纠结了好久。好在在经过时断时续的学习Java及spring boot之后,结合小编的工作经验,终于清楚明白了如何搭建一个真正的前后端分离项目。
如果你也与我一样,不想学习JSP,只想做纯粹的前后端分离项目,那就关注我吧。
新建工程
工具:IntelliJ IDEA Ultimate 2021.1.1


知识点
Lombok是开发Java的使用插件,用来帮助开发人员简化冗长的Java代码,尤其是对POJO(Plain Ordinary Java Objects,简单的Java对象)非常有用。Lombok通过注解的方式来达到帮助程序员简化代码的目的。
编辑工程
在开始写代码之前,此时心中应该有了一个工程目录的雏形。这样你才能清楚明白应该怎样输出自己的代码。由于小编也是JavaWeb开发新手,所以初期想法比较简单。大致就是:接收前端传过来的JSON对象参数,然后进行业务处理,最后返回带结果信息的JSON对象给前端。
接收前端传过来的JSON对象。
springMVC是通过controller层来接收用户输入的数据的。所以要在项目工程目录下新建controller包,并在该包中新建User Controller类。
package com.example.rpm.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(String username, String password) {
return 'Hello';
}
}
知识点
@Rest Controller注解在类名上,作用相当于@ResponseBody加@Controller;
@RequsetMapping注解在类名或方法上,如果注解在类名上,则表示所有响应请求的方法都是以该地址作为父路径的,注解在方法上,则表示前端访问该接口【方法】的具体路径。该注解有6个属性:Params【指定Request中必须包含某些参数值,才让该方法处理】、Headers【指定Request中必须包含某些指定的header值,才能让该方法处理请求】、Value【指定请求的实际地址,指定的地址可以是URI Template模式】、Method【指定请求的Method类型,如GET、POST】、Consumes【指定处理请求的提交内容类型Content-Type,如“application/json,text/html”】、Produces【指定返回的内容类型。只有当Request请求头中的Accept类型中包含该指定类型时才返回】
依据前端传过来的数据,进行业务处理
springMVC中业务判断逻辑是在Service层,所以在项目目录下新建Service包,并在该包中新建UserService接口类。
package com.example.rpm.service;
import org.springframework.stereotype.Service;
public interface UserService {
public String login(String name,String password);
}
在Service包中新建一个Impl包,并在该包下新建一个UserService接口类的实现类UserServiceImpl。
package com.example.rpm.service;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
@Override
public String login(String name,String password) {
if (name.equals("admin") && password.equals("admin")) {
return "Success";
}
return "Error";
}
}
知识点
@Service用于声明一个业务处理类(接口类的实现类),用于标注服务层,处理业务逻辑。
返回带结果信息的JSON对象
在实际项目开发中,接口返回的数据格式通常是固定【事先约定好的】的。在这个项目中,小编也固定了一个格式。
// 异常信息
{
"code": 999999,
"msg":"异常信息",
"data": null
}
// 成功信息
{
"code": 200,
"msg": "成功",
"data": {
"id": 1,
"name": "zero"
}
}
想要达到如此目的,我们首要要封装一个返回对象。
在项目目录下新建一个response包,并在该包中新建一个Response类。
package com.example.rpm.result;
import lombok.Data;
@Data
public class Response {
private Number code = 200;
private String msg = "操作成功";
public Response() {
}
public Response(ExceptionMsg msg){
this.code=msg.getCode();
this.msg=msg.getMsg();
}
public Response(Number code) {
this.code = code;
this.msg = "";
}
public Response(Number code, String msg) {
this.code = code;
this.msg = msg;
}
}
继续新建一个带返回数据对象的ResponseData类。
package com.example.rpm.result;
import lombok.Data;
@Data
public class ResponseData extends Response {
private Object data;
public ResponseData(Object data) {
this.data = data;
}
public ResponseData(ExceptionMsg msg) {
super(msg);
}
public ResponseData(Number code, String msg) {
super(code, msg);
}
public ResponseData(Number code, String msg, Object data) {
super(code, msg);
this.data = data;
}
public ResponseData(ExceptionMsg msg, Object data) {
super(msg);
this.data = data;
}
}
继续在该包中新建一个响应的枚举类ExceptionMsg。
package com.example.rpm.result;
public enum ExceptionMsg {
SUCCESS(200,"操作成功"),
FAILED(999999,"操作失败");
private Number code;
private String msg;
private ExceptionMsg(Number code,String msg) {
this.code = code;
this.msg = msg;
}
public Number getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
知识点
枚举类;类的继承;
接下来就是如何把项目的工作流程串联起来。大致思路如下:Response是我们要返回的对象,那么就得更改login方法的返回值类型【String -> Response】。首先必须清楚项目的工作流程:Controller层负责接收用户输入参数,然后调用Service层的方法,进行业务逻辑处理【由于此次没有使用数据库,所以不牵扯Dao层】,Service层业务逻辑处理完成之后,返回相应的响应对象。
首先更改Service层,UserServiceImpl
package com.example.rpm.service;
import com.example.rpm.result.ExceptionMsg;
import com.example.rpm.result.Response;
import com.example.rpm.result.ResponseData;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService{
protected Response response() {
return new Response();
}
@Override
public Response login(String name,String password) {
if (name.equals("admin") && password.equals("admin")) {
return response();
}
return new ResponseData(ExceptionMsg.FAILED);
}
}
UserService
package com.example.rpm.service;
import com.example.rpm.result.Response;
public interface UserService {
public Response login(String name,String password);
}
UserController
package com.example.rpm.controller;
import com.example.rpm.result.Response;
import com.example.rpm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserController {
private UserService userService;
@Autowired
public void setUserService (UserService userService) {
this.userService = userService;
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public Response login(String username, String password) {
return userService.login(username,password);
}
}
到此简单的用户登录接口完成,可以启动项目,进行接口调式了。
原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/java/spring-boot-login-api.html