基于黑马的视频课程制作的Springboot小项目,实现了简单的CRUD操作。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、项目总览
后端(Java文件夹内):
- config包中包含项目的配置类,如数据库连接配置、安全认证配置等。
- controller包中包含控制器类,负责处理用户的请求并返回相应的结果。
- Dao包中包含数据访问对象类,负责与数据库交互。
- domain包中包含领域模型类,表示项目中的实体类。
- service包中包含服务类,负责处理业务逻辑,并调用Dao类进行数据库操作。
前端(resources文件夹内):
- css文件夹:可能包含项目的样式文件,如CSS,less或SASS文件,用于控制页面的布局和外观。
- js文件夹:可能包含项目的脚本文件,如JavaScript文件,用于实现页面的动态效果和交互。
- pages文件夹:可能包含项目的页面文件,如HTML,jsp或其他页面模板文件,用于显示页面内容。
- plugins文件夹:可能包含项目使用的第三方库和插件,如jQuery,Bootstrap等。
二、运行逻辑概况
- 用户在前端发送一个请求,如获取某些数据或提交某些信息。
- 请求被控制器类中的对应方法接收并处理。
- 控制器类调用对应的服务类方法进行业务逻辑处理。
- 服务类调用对应的Dao类方法进行数据库操作。
- Dao类访问数据库并返回结果。
- 服务类将结果返回给控制器类。
- 控制器类将结果返回给前端。
三、具体流程
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();
});
}
- 使用axios.post()方法发送一个POST请求到/books。
- 将请求的数据放在this.formData里。
- 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 层访问数据库并返回结果给前端。