【Springboot自学】小项目复盘

基于黑马的视频课程制作的Springboot小项目,实现了简单的CRUD操作。

GitHub自用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


提示:以下是本篇文章正文内容,下面案例可供参考

一、项目总览

请添加图片描述

后端(Java文件夹内):

  • config包中包含项目的配置类,如数据库连接配置、安全认证配置等。
  • controller包中包含控制器类,负责处理用户的请求并返回相应的结果。
  • Dao包中包含数据访问对象类,负责与数据库交互。
  • domain包中包含领域模型类,表示项目中的实体类。
  • service包中包含服务类,负责处理业务逻辑,并调用Dao类进行数据库操作。

数据库内容

前端(resources文件夹内):

  • css文件夹:可能包含项目的样式文件,如CSS,less或SASS文件,用于控制页面的布局和外观。
  • js文件夹:可能包含项目的脚本文件,如JavaScript文件,用于实现页面的动态效果和交互。
  • pages文件夹:可能包含项目的页面文件,如HTML,jsp或其他页面模板文件,用于显示页面内容。
  • plugins文件夹:可能包含项目使用的第三方库和插件,如jQuery,Bootstrap等。

前端页面

二、运行逻辑概况

  1. 用户在前端发送一个请求,如获取某些数据或提交某些信息。
  2. 请求被控制器类中的对应方法接收并处理。
  3. 控制器类调用对应的服务类方法进行业务逻辑处理。
  4. 服务类调用对应的Dao类方法进行数据库操作。
  5. Dao类访问数据库并返回结果。
  6. 服务类将结果返回给控制器类。
  7. 控制器类将结果返回给前端。

三、具体流程

1.前端请求

以添加功能为例:

//
handleAdd() {
    axios.post("/books", this.formData).then((res) => {
        //判断当前操作是否成功
        if (res.data.flag) {
            //1.关闭弹层
            this.dialogFormVisible = false;
            this.$message.success(res.data.msg);
        } else {
            this.$message.error(res.data.msg);
        }
    }).finally(() => {
        //2.重新加载数据
        this.getAll();
    });
}
  1. 使用axios.post()方法发送一个POST请求到/books。
  2. 将请求的数据放在this.formData里。
  3. res为后端的响应。

其中,this.formData的数据类型由Vue 实例中的data规定:

<script>
    var vue = new Vue({
        el: '#app',
        data: {
			...
            formData: {},//表单数据,其中各数据的属性由前文的div元素指定
			...
            }
        }
        ...
	})
<\script>

在 JavaScript 代码中, var vue = new Vue({ el: ‘#app’,…}) 中的 el 选项指定了 Vue 实例需要挂载(绑定)到的元素。具体来说, Vue 实例会将模板渲染到 el 选项所指定的元素中,并且这个元素以及它的子元素都会成为 Vue 实例的一部分,可以被 Vue 的数据和方法所管理。因此,< div id=“app” > 代表的是 Vue 实例的挂载点,Vue实例会将模板渲染到这个元素中。

这样,前端就将形如{type: "教材", name: "数据结构", description: "第一版"}的JSON格式数据发送给了后端。


在解释后端处理逻辑之前,首先理清每个类和接口的作用和逻辑:

基本逻辑
其中控制器包下的R类用于向前端返回操作成功与否的布尔值提示信息分页对象,本身不参与CRUD。


接下来分析接收到请求后后端的行为,以添加记录为例:

@RestController
@RequestMapping("/books")
public class BookController {

    //当使用@Autowired注解装配依赖时,Spring会查找能够装配到这个依赖的bean
    //即,此时iBookService实际上是BookServiceImpl的一个实例。调用方法时自然使用的是重写的方法
    @Autowired
    private IBookService iBookService;  
    @PostMapping
    public R save(@RequestBody Book book) throws IOException {
        if (book.getName().equals("BUG"))
            throw new IOException();
        boolean flag = iBookService.save(book);
        return new R(flag, flag ? "添加成功!" : "添加失败!");
    }
}

2.后端控制器处理

控制器接收到数据后,通过@RequestBody注解将JSON数据通过字段匹配的方式填充了Book类型的book变量。

数据是填充通过SpringMVC中的HttpMessageConverter完成的。HttpMessageConverter是一个接口,它用于将HTTP请求/响应与Java对象之间进行转换。

当SpringMVC接收到一个HTTP请求时,它会使用HttpMessageConverter将请求的数据转换为Java对象。默认情况下,SpringMVC提供了许多HttpMessageConverter,如MappingJackson2HttpMessageConverter和FormHttpMessageConverter等,它们可以将JSON或表单数据转换为Java对象。

在上面的例子中,请求的数据是JSON格式的,SpringMVC会使用MappingJackson2HttpMessageConverter将请求的JSON数据转换为Book对象。具体来说,通过反射的方式将请求的JSON数据映射到User对象的属性上,这样就完成了填充User类型的参数user的过程。映射的规则是根据JSON数据中的字段名称与User对象中的属性名称进行匹配,如果匹配成功,就将JSON数据中的字段值赋值给User对象中对应的属性。

这里不需要使用构造函数,因为HttpMessageConverter会自动实例化一个Book对象,然后将请求的JSON数据映射到这个对象的属性上。

3.调用服务类方法

执行iBookService.save(book);
iBookService实际类型是BookServiceImpl类,后者继承了Mybatis-Plus的ServiceImpl实现类,因此save()方法实际来源于IService接口的默认方法:

public interface IService<T> {
	...
    default boolean save(T entity) {
        return SqlHelper.retBool(getBaseMapper().insert(entity));
    }
    ...
}

4.调用Dao类方法

执行getBaseMapper().insert(entity),将book插入数据库(id自增)。

5.结果返回Dao类

若成功,则SqlHelper.retBool(getBaseMapper().insert(entity))=true

6.结果返回控制器类

由第5步,iBookService.save(book)=true,得到flag=true返回封装了布尔值与文本信息的R对象。

7.结果返回前端

根据后端返回的R对象判断操作是否成功,并输出相应的消息给用户。

总结

前端使用 axios 发送 HTTP 请求,后端的 Spring 控制器接收请求并处理,然后调用服务类中的方法进行业务逻辑处理,最后使用 Mybatis-Plus 的 Dao 层访问数据库并返回结果给前端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值