四,SSM整合-前后端分离(实现分页+前后端校验)

分页与校验

  • 实现功能07-分页显示列表
    • 需求分析/图解
    • 思路分析
    • 代码实现
    • 完成测试
  • 实现功能08-带条件查询分页显示列表
    • 需求分析/图解
    • 思路分析
    • 代码实现
  • 实现功能09-添加家居表单前端校验
    • 需求分析/图解
    • 思路分析
    • 代码实现
  • 实现功能10-添加家居表单后端校验
    • 需求分析/图解
    • 思路分析
    • 代码实现
  • SSM项目[前后端分离]小结+作业要求

上一讲, 我们学习的是 SSM整合-前后端分离(实现增删改查)

现在打开furn-ssm项目 和 ssm_vue项目

在这里插入图片描述

实现功能07-分页显示列表

需求分析/图解

在这里插入图片描述

思路分析

1.后台使用MyBatis PageHelper插件完成分页查询.前端使用分页组件.

2.修改FurnController, 增加处理分页显示代码 API/接口

3.完成前台代码, 加入分页导航, 并将分页请求和后台接口结合.

4.简单回顾JavaWeb原生项目的分页模型. 说明: 有了MyBatis PageHelper和前端的分页组件, 完成分页就非常的方便, 但是底层的分页模型和前面我们的java web原生项目一样.

代码实现

1.修改pom.xml, 加入分页插件

<!--引入mybatis pageHelper分页插件-->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.1</version>
</dependency>

2.修改mybatis-config.xml, 配置分页拦截器

<!--说明
1.plugins标签需要放在typeAliases标签后, 是DOCTYPE约束的
2.配置分页拦截器
-->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><!--解读配置分页合理化1.如果用户请求的pageNum > pages, 就显示查询最后一页2.如果用户请求的pageNum < 0, 就显示查询第一页--><property name="reasonable" value="true"/></plugin>
</plugins>

3.修改FurnController.java, 增加分页查询处理

/*** 分页请求接口** @param pageNum:  要显示第几页, 默认为1* @param pageSize: 每页要显示几条记录, 默认为5* @return*/
@RequestMapping("/furnsByPage")
@ResponseBody
public Msg listFurnsByPage(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize) {//设置分页参数//解读//1.调用findAll完成查询, 底层会进行物理分页, 而不是逻辑分页//2.会根据分页参数来计算 limit ?, ?, 在发出sql语句时, 会带limit//3.我们后面会给大家抓取SQLPageHelper.startPage(pageNum, pageSize);List<Furn> furns = furnService.findAll();//将分页查询的结果, 封装到PageInfo//PageInfo 对象包含了分页的各个信息, 比如当前页面pageNum, 共有多少记录PageInfo pageInfo = new PageInfo(furns, pageSize);//将pageInfo封装到Msg对象, 返回return Msg.success().add("pageInfo", pageInfo);
}

4.使用Postman进行测试, 看看分页查询是否OK
在这里插入图片描述

数据包含在了list属性里

在这里插入图片描述在这里插入图片描述

5.修改HomeView.vue, 完成分页导航显示, 分页请求. 给标签属性绑定值

1)添加分页导航控件

<div style="margin: 10px 0px"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange"v-bind:current-page="currentPage"v-bind:page-sizes="[5, 10]"v-bind:page-size="pageSize"layout="total, sizes, prev, pager, next, jumper"v-bind:total="total"></el-pagination>
</div>

2)增加分页初始化数据

data() {return {//增加分页相应的数据绑定currentPage: 1,//当前页pageSize: 5,//每页显示记录数total: 10,//共有多少记录}
}

3)修改list方法, 换成分页请求数据的接口

list() {//请求分页的接口request.get("/api/furnsByPage", {params: {//指定请求携带的参数pageNum: this.currentPage,pageSize: this.pageSize,}}).then(res => {//处理返回的分页信息this.tableData = res.extend.pageInfo.list;this.total = res.extend.pageInfo.total;})
},

4)处理当前页变化, 比如点击分页链接, 或者go to 第几页

handleCurrentChange(pageNum) {//处理分页请求//当用户点击分页超链接时, 会携带pageNum// console.log("pageNum=", pageNum);this.currentPage = pageNum;//发出请求this.list();
},

5)处理每页显示多少条记录变化

handleSizeChange(pageSize) {this.pageSize = pageSize;//发出请求this.list();
},

完成测试

在这里插入图片描述

实现功能08-带条件查询分页显示列表

需求分析/图解

在这里插入图片描述

思路分析

1.完成后台代码从 dao ->service -> controller, 并对每层代码进行测试

2.完成前台代码, 使用axios发送http请求, 完成带条件查询分页显示

代码实现

1.修改FurnService.javaFurnServiceImpl.java, 增加条件查询

//根据家居名查询家居信息
public List<Furn> findByCondition(String name);
@Override
public List<Furn> findByCondition(String name) {FurnExample furnExample = new FurnExample();//通过criteria 对象可以设置查询条件FurnExample.Criteria criteria = furnExample.createCriteria();//判断name是否有具体的内容if (StringUtils.hasText(name)) {criteria.andNameLike("%" + name + "%");}//说明: 如果没有传值, 即为null, "", "   "时, 依然是查询所有的记录return furnMapper.selectByExample(furnExample);
}

2.修改FurnServiceTest.java, 测试findByCondition方法.

@Test
public void findByCondition() {List<Furn> furns = furnService.findByCondition("风格");for (Furn furn : furns) {System.out.println("furn--" + furn);}
}

3.修改FurnController.java, 处理带条件分页查询, 并使用Postman完成测试.

/*** 根据家居名进行分页查询-带条件** @param pageNum* @param pageSize* @return*/
@RequestMapping("/furnsByConditionPage")
@ResponseBody
public Msg listFurnsByCondition(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize,@RequestParam(defaultValue = "") String search) {//设置分页参数//解读//1.调用findAll完成查询, 底层会进行物理分页, 而不是逻辑分页//2.会根据分页参数来计算 limit ?, ?, 在发出sql语句时, 会带limit//3.我们后面会给大家抓取SQLPageHelper.startPage(pageNum, pageSize);List<Furn> furns = furnService.findByCondition(search);//将分页查询的结果, 封装到PageInfo//PageInfo 对象包含了分页的各个信息, 比如当前页面pageNum, 共有多少记录PageInfo pageInfo = new PageInfo(furns, pageSize);//将pageInfo封装到Msg对象, 返回return Msg.success().add("pageInfo", pageInfo);
}

在这里插入图片描述

4.修改HomeView.vue

<!--margin: 顶部距离 左侧距离-->
<div style="margin: 10px 5px"><el-input v-model="search" style="width: 20%" placeholder="请输入家居名"/><el-button style="margin: 10px" type="primary" @click="list">检索</el-button>
</div>

数据池

data() {return {search: '',//检索条件, 可以在进行分页时保留上次的检索条件}
},

list方法

list() {//请求分页的接口-带检索条件request.get("/api/furnsByConditionPage", {params: {//指定请求携带的参数pageNum: this.currentPage,pageSize: this.pageSize,search: this.search,}}).then(res => {//处理返回的分页信息this.tableData = res.extend.pageInfo.list;this.total = res.extend.pageInfo.total;})
},

5.测试
在这里插入图片描述

实现功能09-添加家居表单前端校验

需求分析/图解

在这里插入图片描述

在这里插入图片描述

说明: 参考 element-plus 表单验证

思路分析

1.完成前台代码, 使用ElementPlus的表单 rules 验证即可

2.参考element-plus 表单验证文档

代码实现

1.修改HomeView.vue, 增加表单验证处理代码. 验证数字
增加对表单各个字段的校验规则

data() {return {//定义添加表单校验规则rules: {name: [//这里我们可以写多个针对name属性的校验规则{required: true, message: "请输入家居名", trigger: "blur"}],maker: [//这里我们可以写多个针对maker属性的校验规则{required: true, message: "请输入厂商", trigger: "blur"}],price: [//这里我们可以写多个针对price属性的校验规则{required: true, message: "请输入价格", trigger: "blur"},//使用正则表达式对输入的数据进行校验{pattern: /^([1-9]\d*|0)(\.\d+)?$/, message: "请输入数字", trigger: "blur"}],sales: [//这里我们可以写多个针对sales属性的校验规则{required: true, message: "请输入销量", trigger: "blur"},{pattern: /^([1-9]\d*|0)$/, message: "请输入数字", trigger: "blur"}],stock: [//这里我们可以写多个针对stock属性的校验规则{required: true, message: "请输入库存", trigger: "blur"},{pattern: /^([1-9]\d*|0)$/, message: "请输入数字", trigger: "blur"}],}}
},

指定将创建的规则引用到form表单, 注意名称要对应
在这里插入图片描述

2.测试, 就可以看到验证规则生效了. 是光标离开输出框时, 出现检验效果, 因为是trigger: "blur"事件, 但是用户提交还是能成.

3.修改HomeView.vue, 但表单验证不通过时, 不提交表单
修改save方法

save() {//将填写的表单数据,发送给后端//修改和添加时走的同一个方法if (this.form.id) {//表示修改//本质发出ajax请求-异步处理//...} else {//表示添加//表单验证是否通过this.$refs['form'].validate(valid => {//valid就是表单校验后返回的结果if (valid) {//如果校验通过//解读//1.url: http://localhost:8080/ssm/save//2.this.form: 携带的数据request.post("/api/save", this.form).then(res => {// console.log("res=", res);//关闭对话框this.dialogVisible = false;//调用list方法, 刷新数据this.list();});} else {//校验没有通过this.$message({type: "error",message: "表单校验失败, 不提交"})return false;//放弃提交}})}//这里有一个注意事项...
},

修改add方法

add() {//显示添加对话框-带表单//显示对话框this.dialogVisible = true;//情况添加表单数据this.form = {};//清空上次校验的信息this.$refs['form'].resetFields();
},

在这里插入图片描述

实现功能10-添加家居表单后端校验

需求分析/图解

1.为什么前端校验了, 后端还需要校验? -使用Postman添加数据, 打破前端校验机制
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.后端校验-需求分析, 但后端校验没有通过, 会出现灰色框提示, 后台不真正入库数据在这里插入图片描述

思路分析

1.后台 使用JSR303数据校验, 引入hibernate-validator.jar, 学习SpringMVC JSR303校验时遇到过.

2.前端 使用ElementPlus进行数据绑定, 并显示错误信息

代码实现

1.修改pom.xml, 引入hibernate-validator jar文件

<!--JSR303数据校验支持引入hibernate-validator-->
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.1.1.Final</version>
</dependency>

2.修改Furn.java, 使用hibernate-validator

@NotEmpty(message = "请输入家居名")
private String name;@NotEmpty(message = "请输入厂商")
private String maker;@NotNull(message = "请输入数字")
@Range(min = 0, message = "价格不能小于0")
private BigDecimal price;@NotNull(message = "请输入数字")
@Range(min = 0, message = "销量不能小于0")
private Integer sales;@NotNull(message = "请输入数字")
@Range(min = 0, message = "库存不能小于0")
private Integer stock;

3.修改FurnController.java, 处理带条件分页查询, 并使用Postman完成测试.

@PostMapping("/save")
@ResponseBody
public Msg save(@Validated @RequestBody Furn furn, Errors errors) {Map<String, Object> map = new HashMap<>();List<FieldError> fieldErrors = errors.getFieldErrors();for (FieldError fieldError : fieldErrors) {map.put(fieldError.getField(), fieldError.getDefaultMessage());}if (map.isEmpty()) {//说明后端校验通过, 因为没有发现校验错误furnService.save(furn);//没有抛出异常, 就返回成功信息Msg success = Msg.success();return success;} else {//校验失败, 就把错误信息封装到Msg对象, 并返回return Msg.fail().add("errors", map);}
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述
4.修改HomeView.vue, 显示服务器校验返回的提示信息
在数据池, 增加显示错误信息的变量

data() {return {//存放后端校验的错误信息serverValidErrors: {},}
},

修改save方法, 显示错误提示

if (valid) {//如果校验通过//解读//1.url: http://localhost:8080/ssm/save//2.this.form: 携带的数据request.post("/api/save", this.form).then(res => {console.log("res=", res);if (res.code === 200) {//添加成功//关闭对话框this.dialogVisible = false;//调用list方法, 刷新数据this.list();} else {//后端校验失败//取出校验失败的信息, 赋给serverValidErrorsthis.serverValidErrors.name = res.extend.errors.name;this.serverValidErrors.maker = res.extend.errors.maker;this.serverValidErrors.price = res.extend.errors.price;this.serverValidErrors.sales = res.extend.errors.sales;this.serverValidErrors.stock = res.extend.errors.stock;}});
}

修改对话框, 显示后台返回的校验错误信息

<el-form ref="form" :model="form" :rules="rules" label-width="120px" style="width: 80%"><el-form-item label="家居名" prop="name"><el-input v-model="form.name" style="width: 50%"/>{{serverValidErrors.name}}</el-form-item><el-form-item label="厂商" prop="maker"><el-input v-model="form.maker" style="width: 50%"/>{{serverValidErrors.maker}}</el-form-item><el-form-item label="价格" prop="price"><el-input v-model="form.price" style="width: 50%"/>{{serverValidErrors.price}}</el-form-item><el-form-item label="销量" prop="sales"><el-input v-model="form.sales" style="width: 50%"/>{{serverValidErrors.sales}}</el-form-item><el-form-item label="库存" prop="stock"><el-input v-model="form.stock" style="width: 50%"/>{{serverValidErrors.stock}}</el-form-item>
</el-form>

为了触发后端校验, 先把前端校验解除

} else {//表示添加//表单验证是否通过this.$refs['form'].validate(valid => {//这里我们让前端校验放行, 测试后端校验的效果, 测试完毕, 再改回来valid = true;//valid就是表单校验后返回的结果if (valid) {//如果校验通过

测试
在这里插入图片描述

修改add()方法, 清空错误信息

add() {//显示添加对话框-带表单//显示对话框this.dialogVisible = true;//情况添加表单数据this.form = {};//清空上次前端校验的信息this.$refs['form'].resetFields();//清空上次后端校验的信息this.serverValidErrors = {};
},

SSM项目[前后端分离]小结+作业要求

●说明: 前后端分离开发, 前端框架Vue + 后端框架SSM

1.前端框架Vue

2.后端框架-SSM (Spring + SpringMVC + MyBatis)

3.数据库-MySQL

4.项目的依赖管理-Maven

5.分页-pagehelper

6.逆向工程-MyBatis Generator

7.其它…


●前端框架Vue
1.使用了ElementPlus来展示数据
2.使用Axios对象来请求数据 / 接口

●后端框架SSM
1.使用了经典的三层结构
2.使用MyBatis Generator 和 MyBatis pageHelper

●作业
1.把我们写的项目. 小伙伴可以独立地完整地写出来.
2.一定要自己写, 培养自己独立解决问题的能力, 并且提高解决Bug能力
3.逐步形成自己的编程套路 / 思路.
4.前端这块可以展示就可以了, 不需要写的非常好看, 关键是梳理清楚前后端数据通信机制. 多写, 多总结, 多梳理, 形成自己的知识.


在这里插入图片描述
🔜 下一讲预告 🔜
敬请期待:MyBatis系列一: MyBatis初步入门


📚 目录导航 📚

  1. SSM整合-前后端分离(项目环境搭建)
  2. SSM项目-前后端分离(搭建Vue前端工程)
  3. SSM整合-前后端分离(实现增删改查)
  4. SSM整合-前后端分离(实现分页+前后端校验)

💬 读者互动 💬
你在学习SSM分页和校验功能时遇到了哪些问题?欢迎在评论区留言,我们一起讨论。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为海思CPU解读

安全可靠CPU测评结果&#xff08;华为海思篇&#xff09; 中国信息安全测评中心于2024年5月20日发布安全可靠测评结果公告&#xff08;2024年第1号&#xff09;&#xff0c;公布依据《安全可靠测评工作指南&#xff08;试行&#xff09;》的测评结果&#xff0c;自发布起有效期…

可视化数据科学平台在信贷领域应用系列七:自动机器学习(下篇)

在当今金融科技迅速发展的时代&#xff0c;自动机器学习&#xff08;AutoML&#xff09;逐步成为了信贷风控领域的重要工具。随着大数据和人工智能技术的进步以及信贷风险环境的快速变化&#xff0c;传统人工建模模式的时效性已经难以应对复杂多变的挑战。自动机器学习框架将数…

海外版coze前端代码助手

定位 解决前端同事的开发问题 参数配置 测试 支持 最屌的大模型及语音播报。 体验地址 海外版前端代码助手 需要魔法才能体验油

2024.6最最新版MySQL数据库安装(保姆级教程,不懂你捶我)

1.MySQL数据库下载 1.打开MySQL官网 如下页面 2.下翻网页到最底部,找到Download,点击第一个MySQL Community Server 3.选择自己需要的版本以及系统的MySQL: 4.跳转页面会有一个登录/注册页面,这里我们不鸟他,直接开始下载 2.MySQL数据库安装 1.双击我们刚刚下载的安装包 2.勾…

编码RNA Terc-53和透明质酸受体Hmmr可调节小鼠的衰老

近期&#xff0c;厦门大学王耿教授团队在Protein & Cell&#xff08;IF21.1&#xff09;上发表题为“Noncoding RNA Terc-53 and hyaluronan receptor Hmmr regulate ageing in mice.”的研究。研究团队构建了一系列Terc-53小鼠模型&#xff0c;发现Terc-53小鼠表现出与年龄…

艾尔登法环攻略教程 教你怎么达成怎么进入DLC的前置条件

《艾尔登法环》是一款黑暗幻想风开放世界角色扮演动作游戏&#xff0c;该游戏让玩家走进辽阔的场景与地下迷宫探索未知&#xff0c;挑战困难重重的险境&#xff0c;同时体验登场角色之间的利害关系谱成的群像剧。其广阔的开放世界、深邃的剧情探索、极具挑战性的战斗系统&#…

stable diffusion 模型融合

【抛砖引玉】GhostMixV2.0的制作过程及关于Checkpoint模型融合的一点经验 - 知乎大家好,我是Ghost_Shell,也是GhostMix的作者。本来想写一篇文章整体介绍一下模型,一些你们可能没察觉到,但我非常固执的理念,也算是模型的特性。结果发现写太长了,就分开两部分,第一部分是…

【C++ | 重载运算符】一文弄懂C++运算符重载,怎样声明、定义运算符,重载为友元函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-21 2…

银河麒麟V10安装docker和docker-compose

1. 说明 系统镜像使用的是Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso如果是在VMware中安装这个系统&#xff0c;需选择Ubuntu&#xff0c;如果选Centos会有问题。 尝试使用在线方式安装docker&#xff0c;报了很多错误&#xff0c;比较麻烦&#xff0c;建议使用离…

xss初识(xss-lab)

XSS跨站脚本 XSS漏洞概述 XSS被称为跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;由于和CSS&#xff08;Cascading Style Sheets&#xff09; 重名&#xff0c;所以改为XSS。 XSS主要基于javascript语言完成恶意的攻击行为&#xff0c;因为javascri…

前端代码打包教程

一、 首先解压并进入源码包中&#xff0c;源码文件是下载的完整版安装包的 view/ 目录下,平台后台是 admin.zip ,商户后台是 mer.zip , H5/公众号/小程序是 uniapp.zip ,2.0级以上版本还有客服的源码包&#xff1b; 二、 打包&#xff0c;移动端和后台的打包方式不同 平台后台…

echarts+vue2实战(一)

目录 一、项目准备 二、(横向分页)柱状图 2.1、动态刷新 2.2、UI调整 2.3、分辨率适配 三、(竖向平移)柱状图 3.1、平移动画 3.2、不同数值显示不同颜色 四、(下拉切换)折线图 4.1、切换图表和分辨率适配 4.2、UI调整 五、(三级分类)饼图 5.1、数据切换 六、圆环…

使用Tkinter创建带查找功能的文本编辑器

使用Tkinter创建带查找功能的文本编辑器 介绍效果代码解析创建主窗口添加菜单栏实现文件操作实现查找 完整代码 介绍 在这篇博客中&#xff0c;我将分享如何使用Python的Tkinter库创建一个带有查找功能的简单文本编辑器。 效果 代码解析 创建主窗口 import tkinter as tkcl…

Offset Explorer 连接SASL PLAIN鉴权的Kafka

1、填写Kafka信息 2、配置鉴权信息 Security 选择 SASL PLAINTEXT JAAS Config 配置账号密码 org.apache.kafka.common.security.plain.PlainLoginModule required username"账号"password"密码";

[Vulnhub] Troll FTP匿名登录+定时任务权限提升

信息收集 IP AddressPorts Opening192.168.8.104TCP:21,22,80 $ nmap -sC -sV 192.168.8.104 -p- --min-rate 1000 Nmap scan report for 192.168.8.104 (192.168.8.104) Host is up (0.0042s latency). Not shown: 65532 closed tcp ports (conn-refused) PORT STATE SER…

openh264 宏块级码率控制源码分析

openh264 宏块级码率控制函数关系 宏块级核心函数分析 WelsRcMbInitGom函数 功能&#xff1a;openh264 码率控制框架中宏块级码率控制函数&#xff0c;根据是否启用GOM QP来决定如何设置宏块的QP值&#xff0c;以控制编码的质量和比特率。原理过程&#xff1a; 函数参数&…

“打造智能售货机系统,基于ruoyi微服务版本开源项目“

目录 # 开篇 售货机术语 1. 表设计说明 2. 页面展示 2.1 区域管理页面 2.2 合作商管理页面 2.3 点位管理页面 3. 建表资源 3.1 创建表的 SQL 语句&#xff08;包含字段备注&#xff09; 1. Region 表 2. Node 表 3. Partner 表 4. 创建 tb_vending_machine 表的 S…

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(一)芯片性能

【启明智显产品介绍】工业级HMI芯片Model3C详解&#xff08;一&#xff09;芯片性能 Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU&#xff0c;配置平头哥E907&#xff0c;主频400MHz&#xff0c;强大的 2D 图形加速处理器、PNG/JPEG 解码引擎…

【Conda】修改 Conda 默认的虚拟环境位置

文章目录 问题描述分析与解决查看默认安装位置修改 .condarc 文件修改权限 参考资料 问题描述 Conda 的虚拟环境默认安装在 C 盘。时间久了&#xff0c;C 盘上的内存会被大量占用&#xff0c;影响电脑性能。于是想到修改虚拟环境的默认存放位置&#xff0c;改到自定义的位置。…

找不到d3dx9_43.dll无法继续执行代码的几种解决方法

在工作或生活使用电脑都会遇到丢失dll文件应用无法启动的情况&#xff0c;比如你安装完一款你最喜欢的游戏在启动的时候提示系统缺少d3dx9_39.dll、d3dx9_40.dll、d3dx9_41.dll、d3dx9_42.dll、d3dx9_43.dll、xinput1_3.dll 文件而无法正常游戏&#xff0c;或你在工作的时候安装…