web开发中如何知道表单的数据是否发生了变更,后端框架又是如何响应的,都有哪些方案

news2025/1/19 23:11:24

前言

针对web界面开发,今天对于一些细节做了一点总结与回想,好久不做web开发了,今天竟然都忘记了以前的界面组件、后端orm映射框架的一些基础知识了,今天主要总结的内容是,当界面提交一个表单后,vue是如何监听到表单的变化的,如果对于传统的orm框架,如mybatis及hibernate 它们又是怎样实现的。

orm框架的响应

当我们在使用某些后端框架进行表单提交操作时,我们有时需要知道表单的数据是否发生了变更,以避免重复提交或其他不必要的操作。下面将介绍如何通过Hibernate框架来判断表单数据变更,并了解后端框架的响应机制。

首先,让我们来看一下客户端的表单提交过程。当用户填写表单并点击提交按钮时,表单数据将通过HTTP协议发送到服务器。在服务器端,后端框架将获得表单数据,并且将其映射到对应的实体对象中。这里我们以Hibernate框架为例。

当表单数据映射到实体对象后,我们就需要判断表单数据是否发生了变更。Hibernate框架提供了一个saveOrUpdate方法来判断实体对象的状态,并将其自动保存到数据库中。如果表单数据发生了变更,Hibernate会在数据库中自动更新实体对象的属性值。如果表单数据没有发生变更,则不会进行任何数据库操作。这样,我们可以避免重复提交和其他不必要的操作,提高系统的性能和效率。

在程序中,我们可以多次调用saveOrUpdate方法,但如果表单数据没有发生变更,Hibernate会忽略多余的操作。在第一次调用时,Hibernate将实体对象保存到数据库中,并将其转化为持久化状态;在后继的调用中,Hibernate会检测到该对象已经处于持久化状态,避免重复更新数据库。

总之,了解如何判断表单数据是否发生变更,以及后端框架响应的机制,对于我们编写高效、可靠的程序非常有帮助。在使用Hibernate框架时,我们可以通过调用saveOrUpdate方法来进行数据持久化操作,并且避免重复提交和其他不必要的操作。

在这里插入图片描述

关于一些组件

接着我又调研了一下常用的框架组件,比如jeecgboot框架中的多行编辑组件,这种情况当列表新增了一些记录后,每一次保存又是如何知道哪些记录修改过,哪些没有修改过,保存时是如何做到只更新变更的记录,而不去处理未做修改的记录呢?
jeecg JgEditable Table行编辑表格 的特性,以及保存表格数据时,如何区分哪些记录变更了,哪些没有变更,如何只保存变更的数据,这种情况也可结合后台springboot框架来说明

JgEditable Table行编辑表格是 Jeecg 框架提供的一种编辑表格方式,它可以让用户通过行内编辑的方式来进行数据录入,十分方便。与普通的表格不同的是,JgEditable Table 表格支持对单行数据进行编辑,并在保存时只保存有变更的数据,从而提高了数据的录入效率,减少了不必要的数据提交操作。

JgEditable Table 表格提供了以下特性:

  1. 可编辑单元格

通过设置表格的编辑模式,可以将单元格变为可编辑状态,让用户可以直接在单元格内进行数据的编辑。

  1. 行新增和删除

在表格末尾或自定义位置,提供了添加或删除一行的功能,并同时提供实时统计列信息的功能。

  1. 行内编辑器

对于一些特殊类型的字段,可以自定义使用哪种类型的编辑器进行编辑。例如,对于日期类型的字段,可以使用日期选择器作为编辑器。

当需要保存表格数据时,我们通常需要通过比较前后的数据来确定哪些数据发生了变更。Jeecg 框架提供了一种比较方便的方式来实现这一目标。我们可以在保存时,在后台利用 ORM 框架对前台传过来的数据进行保存。在保存之前,我们可以通过比较更新前后的数据,判断哪些数据发生了变化,并只保存发生变化的数据,提高了数据的录入效率,减少了不必要的数据提交操作。

以 Spring Boot 框架为例,我们可以使用 Mybatis-plus ORM 框架来实现这一功能。Mybatis-plus 提供了如下方法来进行新增、修改和删除操作:

  1. insert(entity):插入一条数据。

  2. updateById(entity):根据 ID 更新一条数据。

  3. deleteById(id):根据 ID 删除一条数据。

同时,Mybatis-plus 还提供了 Wrapper 来进行复杂查询和更新操作。通过继承 MyBaseMapper 接口,我们可以为数据表设置自定义的 Mapper,然后在 Service 层进行调用。

在保存 JgEditable Table 表格数据时,我们可以通过将前台传过来的 JSON 数据转化为实体类,然后调用 Mybatis-plus 提供的方法来进行数据的保存。在进行保存操作前,我们需要通过比较更新前后的数据,判断哪些数据发生了变化,并只保存发生变化的数据。

示例代码如下(假设表格数据对应的实体类为 DemoEntity):

@Service
public class DemoService {

  @Autowired
  private DemoMapper demoMapper;

  public void save(List<DemoEntity> dataList) {
    for (DemoEntity data : dataList) {
      DemoEntity oldData = demoMapper.selectById(data.getId()); // 根据 ID 查询更新前的数据
      if (oldData == null) {
        demoMapper.insert(data); // 插入一条新数据
      } else {
        if (!oldData.equals(data)) {
          demoMapper.updateById(data); // 根据 ID 更新一条已有数据
        }
      }
    }
  }
}

在上述代码中,我们通过 demoMapper.selectById() 方法查询了更新前的数据,然后通过比较更新前后的数据,判断哪些数据发生了变化,并调用 demoMapper.insert() 方法或 demoMapper.updateById() 方法来进行保存,从而实现了只保存变更的数据的功能。

vue如何监听表单的变化

紧接着,我又想到了vue 中watch也有这个特性,便又想到了这个问题,下面是其原理:

在 Vue 中可以通过 watch 捕捉表单中的值变化事件。当我们需要监听表单变化时,我们可以利用如下的方法来监听:

watch: {
  formData: {
    handler(newData, oldData) {
      console.log('表单数据已改变')
    },
    deep: true
  }
}

其中,formData 是我们需要监听的表单对象。

Vue 的监听原理是当对象或数组变化时,Vue 会将其转化成 Dep 以及 Watcher。在 Vue 中,每一个响应式对象都会被附加一个信使 (Dep)。当一个属性转变为响应式时,它就会被绑定在当前的 Dep 上,当这个属性发生变化时,它会通知这个 Dep,Dep 触发 watcher 实例对象的 update() 方法。在这个方法中,我们可以实现对变化的监听和后续的处理。

在上例中,我们监听了 formData 这个对象,当这个对象发生变化,Vue 会自动触发依赖于 formData 的 watcher 的 update() 方法,从而执行我们设置的 handler。

需要注意的是,这里的 deep 属性要设置为 true,这是因为对于对象内部的属性修改,Vue 默认不会执行监听操作。例如,在上例中,我们监听的是一个表单对象,表单对象内包含了多个属性,如果仅监听整个对象变化,当表单内部的某个属性改变时,不会触发监听,故需要添加 deep: true。

总结起来便是:

  • vue watch如何监听form表单是否变更了,有多种方法,其中一种常用的方法是在data中定义一个form对象,用来存储表单的数据,然后在watch中定义一个form的侦听器,用来监听form对象的变化。可以在侦听器中设置handler函数,当form对象发生变化时,这个函数会被触发,并执行相应的逻辑。可以在handler函数中设置一个标志变量,用来记录表单是否变更过。
  • 这种方法的原理是利用了vue的响应式系统,它可以在数据发生变化时通知视图更新。当我们在data中定义一个form对象时,vue会对这个对象进行劫持,并收集依赖。当我们在watch中定义一个form的侦听器时,vue会将这个侦听器添加到form对象的依赖列表中。当我们修改form对象的属性时,vue会触发form对象的setter方法,并通知所有依赖更新。这时,watch中的handler函数就会被调用,并执行相应的逻辑 。
  • 这种方法的优点是简单易用,不需要额外的库或插件;缺点是可能会受到对象属性顺序的影响,如果两个对象的内容相同,但是属性顺序不同,那么它们转换后的字符串也会不同。因此,在使用这种方法时,需要保证对象属性顺序的一致性。

其他实现方案

保存表格数据时,如何区分哪些记录变更了,哪些没有变更,如何只保存变更的数据,有多种方法,其中一种常用的方法是在获取表格数据时,使用JSON.stringify方法将每条记录转换为字符串,并保存为一个数组,例如oldDataArray。然后在修改表格数据后,再次使用JSON.stringify方法将每条记录转换为字符串,并保存为另一个数组,例如newDataArray。最后比较这两个数组中的每个元素是否相等,如果不相等,则说明该记录有变更过,如果相等,则说明该记录没有变更过。然后将有变更过的记录筛选出来,并发送给后台springboot框架进行保存。

这种方法的原理是利用了JSON.stringify方法的特性,它可以将一个对象转换为一个标准的JSON字符串,这个字符串包含了对象的所有属性和值,并且按照一定的顺序排列。因此,如果两个对象的内容完全相同,那么它们转换后的字符串也一定相同;反之,如果两个对象的内容有任何不同,那么它们转换后的字符串也一定不同。

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

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

相关文章

【JavaEE】wait/notify方法 和 单例模型

目录 前言 1、 wait和notify 1.1、wait()方法 1.2、notify&#xff08;&#xff09;方法 1.3、wait和sleep 的对比 2、单例模式 2.1、饿汉模式 2.2、懒汉模式 2.3、上述懒汉模式和饿汉模式在多线程情况下是否安全 2.3.1、解决懒汉模式多线程不安去问题 前言 这里补充…

网络安全面试题合集

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

瑞吉外卖 - 启用与禁用员工账号功能(8)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书

随着水资源开发利用量不断增大&#xff0c;全国废污水排放量与日俱增&#xff0c;部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理&#xff0c;超标排污、未经同意私设排污口等问题逐步显现&#xff0c;已威胁到供水安全、水环境安全和水生态安全&#x…

Packet Tracer – 配置 VLAN

Packet Tracer – 配置 VLAN 地址分配表 设备 接口 IP 地址 子网掩码 VLAN PC1 NIC 172.17.10.21 255.255.255.0 10 PC2 NIC 172.17.20.22 255.255.255.0 20 PC3 NIC 172.17.30.23 255.255.255.0 30 PC4 NIC 172.17.10.24 255.255.255.0 10 PC5 NI…

open3d 表面重建

目录 1. create_from_point_cloud_ball_pivoting 2. create_from_point_cloud_alpha_shape 3. create_from_point_cloud_poisson 从以下效果来看&#xff0c;第三个方法最好。 1. create_from_point_cloud_ball_pivoting 关键代码&#xff1a; rec_mesh o3d.geometry.T…

面试被问麻了....

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

2022年美国大学生数学建模竞赛F题人人为我,我为人人解题全过程文档及程序

2022年美国大学生数学建模竞赛 F题 人人为我&#xff0c;我为人人 原题再现&#xff1a; 背景:   世界上大多数国家签署了1967年联合国《外层空间条约》&#xff0c;条约内容包括同意探索和利用外层空间&#xff0c;包括月球和其他天体&#xff0c;不论各国经济或科学发展程…

低成本挖出电商API接口-程序员要注意那些事项-技术分享

在开发电商应用的过程中&#xff0c;获取天猫API接口是非常必要的一步。天猫API提供了丰富的商品数据获取、订单管理、支付管理等功能&#xff0c;但是天猫API一般需要进行开发者认证&#xff0c;而认证需要企业资质和若干费用支出&#xff0c;这对个人开发者和小型业务开发者来…

Postgresql数组与Oracle嵌套表的使用区别

oracle中的多维数组 Oracle中常说的数组就是嵌套表&#xff0c;下面给出两个多维使用实例&#xff0c;引出和PG的差异&#xff1a; 一维赋值&#xff08;第一行给1列&#xff09; set serveroutput on; declaretype arr_num is table of number;type arr_arr_num is table o…

任务队列的Java实现

一、需求背景 当前项目中遇到这样一个需求: 将需要审核的文本提交给人工智能模型接口审核&#xff0c;等待模型接口审核完毕以后拿到审核结果返回给前端展示给用户&#xff08;另&#xff1a;模型处理数据所消耗的时间会随着用户提交数据的复杂度有所变化&#xff09;。 以上需…

毫米波雷达系列 | 传统CFAR检测(自适应类)

毫米波雷达系列 | 传统CFAR检测&#xff08;自适应类&#xff09; VI-CFAR [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dV34CKJt-1684215839850)(毫米波雷达系列 传统CFAR检测&#xff08;自适应类&#xff09;.assets/image-20230516131206695…

Recognizing Micro-Expression in Video Clip with Adaptive Key-Frame Mining阅读笔记

本文主要贡献 据我们所知&#xff0c;这是第一项旨在将视频剪辑中的信息时间子集的端到端学习与单个网络中的微表情识别相结合的工作。 此外&#xff0c;所提出网络中所有模块的设计都与输入视频剪辑的长度无关。 换句话说&#xff0c;网络容忍各种长度的微表情剪辑。 本文的贡…

水利工程电子(数字)沙盘

水利工程电子&#xff08;数字&#xff09;沙盘利用三维地理信息系统、遥感技术、海量数据管理技术、虚拟现实技术、网络通讯技术和高性能计算机技术等现代高新信息技术&#xff0c;采用高精度DEM地形数据、遥感影像、航拍影像和基础地理矢量数据&#xff0c;建立三维空间场景&…

SAAS 与 IAAS 云渲染农场比较

渲染时&#xff0c;最重要的是需要的时间和硬件可用的。此渲染过程需要大量计算能力才能快速创建图像或视频。GPU&#xff08;图形处理单元&#xff09;是图形的计算能力&#xff0c;越来越多地用于渲染CAD模型。GPU中有特殊的处理器&#xff0c;可以执行用于快速编辑和显示图像…

TCP的拥塞控制

为了避免发送方无节制地发送数据&#xff0c;从而造成网络拥堵&#xff0c;所以 TCP 有一个拥塞控制。 流量控制&#xff1a;作用于接收方&#xff0c;控制发送者发送速度&#xff0c;从而使接收者来得及接收&#xff0c;防止分组丢失。 拥塞控制&#xff1a;作用于网络&#…

【星戈瑞】Sulfo-Cyanine5 mal红色荧光Cy5-maleimide

Sulfo-Cyanine5 mal是一种具有强荧光信号的染料&#xff0c;主要应用于生物荧光成像领域。它的化学式为C38H43KN4O9S2&#xff0c;分子量为803.00。这种染料具有良好的水溶性&#xff0c;可在水溶液中稳定存在。它的光学特性包括吸收峰位于646 nm和发射峰位于662 nm&#xff0c…

公司新来了个00后软件测试工程师,一副毛头小子的样儿,哪想到是新一代的卷王...

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是…

计算机组成简答题整理

作者&#xff1a;爱塔居 多模块交叉存储器是如何加速CPU与存储器之间有效传输&#xff1f; 解&#xff1a;CPU同时访问多个模块&#xff0c;由存储器控制部件控制它们分别使用数据总线进行信息传递。对每一个存储模块来说&#xff0c;从CPU给出访存命令直到读出信息仍然使用了…

同惠 LCR数字电桥测试仪 TH2830

TH283X系列是新一代低成本,高性能紧凑型LCR数字电桥,采用最新工艺和高密度电路设计,浓缩大型LCR测试仪的精华,紧凑,小巧.取消传统机械电源开关,采用软件控制电源开关.0.05%的基本精度和良好的测试稳定性可与高端机型媲美.配备4.3寸LCD显示屏和全新升级的界面系统.美观大方,操作…