spring boot练习篇之用户登录系统【接口篇】

写在前面

抛弃JSP,只做纯粹的前后端分离项目。

作为一个资深前端工作者,想要转JavaWeb开发,无论是书籍,还是网上视频、资料,竟然没有一篇能清楚明白地讲解怎样搭建一个前后端分离项目。这让小编很是纠结了好久。好在在经过时断时续的学习Java及spring boot之后,结合小编的工作经验,终于清楚明白了如何搭建一个真正的前后端分离项目。

如果你也与我一样,不想学习JSP,只想做纯粹的前后端分离项目,那就关注我吧。

新建工程

工具:IntelliJ IDEA Ultimate 2021.1.1

spring boot练习篇之用户登录系统【接口篇】
新建工程1
spring boot练习篇之用户登录系统【接口篇】
新建工程2

知识点

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

Like (1)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
Previous 2021年3月8日
Next 2021年5月28日

相关推荐

  • JAVA学习路线之夯实基础

    第一章 开发环境 JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环…

    2020年1月14日
    1.5K
  • Spring Boot的常用注解

    未来的框架趋势是“约定大于配置”,代码的封装会更加严密。开发人员会将更多的精力放在代码的整体优化和业务逻辑上,所以注解式编程会被更加广泛地使用。那么什么是注解?Spring Boo…

    2024年8月29日
    261
  • Java自学之String类

    在实际项目开发中,String是一个必须使用的程序类,可以说是项目的核心组成类。在Java程序里所有的字符串都要求使用【’‘】进行定义,同时也可以利用【+】实现字符串的连接处理。 …

    2020年11月30日
    1.2K
  • STS插件mybatis-generator安装及使用

    断断续续学习Java也有好长时间了,没有师傅带,没有项目练手,学习超级慢,也很烦。视频、书籍翻看了一大推,还是没有目标。 相信滴水成海,外加条条大路通罗马,只要坚持,自己终能达成目…

    2019年12月27日
    2.1K
  • Java自学之泛型

    在Java语言中,为了方便接收参数类型的统一,提供了核心类Object,利用此类对象可以接收所有类型的数据(包括基本数据类型和引用数据类型)。但是由于其所描述的数据范围过大,所以在…

    2020年12月8日
    1.2K
  • spring4.x学习之创建工程

    断断续续学习Java有两三个月了,目前还是处于入门阶段。关于java及spring那些的设计理念方面的理论知识,不花费大量精力及时间是看不懂的(至少对于我这么一个前端转后端的初学者…

    2019年3月19日
    1.7K
  • Java自学之类与对象

    定义 类是由成员属性和方法组成。成员属性主要定义类的一个具体信息,实际上一个成员属性就是一个变量,而方法是一些操作的行为。类的定义基础语法如下。 一个类定义完成后并不能够被直接使用…

    2020年11月25日
    1.1K
  • Java自学之抽象类与接口

    面向对象程序设计中,类继承的主要作用的扩充已有类的功能。子类可以根据自己的需要选择是否要覆写父类中的方法,所以一个设计完善的父类是无法对子类做出任何强制性的覆写约定。为了解决这样的…

    2020年12月7日
    1.1K
  • Java自学之内部类

    内部类是一种常见的嵌套结构,利用这样的结构使得内部类可以与外部类共存,并且方便地进行私有操作的访问。 内部类基本概念 内部类(内部定义普通类、抽象类、接口的统称)是指一种嵌套的结构…

    2020年12月14日
    1.3K
  • Java自学之反射机制

    重用性是面向对象设计的核心原则。为了进一步提升代码的重用性,Java提供了反射机制。反射技术首先考虑的是“反”与“正”的操作,所谓的“正”操作,是指当开发者使用一个类的时候,一定要…

    2020年12月24日
    1.1K