解决表单提交的数据丢失问题

解决表单提交的数据丢失问题:

一、问题描述:

  当我们在给前台页面设置修改功能的时候,因为有些信息是不允许进行修改的,所以在修改表单中没有相应的修改输入框,但是在修改表单的数据提交的时候,那些不允许修改的信息在数据库中却不见了。

 

二、原因分析:

       提交表单的时候,因为在表单中没有那些不允许修改的信息相对应的数据,所以在执行SQL修改语句的时候,这些信息就被默认的null值替换了,相当于这些信息被修改为了null值(我的Dao层实现类是通过SpringDataJpa自动生成的)。

 

三、解决方案:

       方案一:在修改表单中添加那些不允许修改信息的隐藏输入框。

       优点:容易理解。

       缺点:如果不允许修改的信息太多,代码量会比较大,另外这种方案的安全性确实是有一些低!

       适用场景:字段较少的时候可取

 

       方案二:在domain实体类的不许修改的字段上加上@Column(updatable = false)这个标签。

       优点:比较简单。

       缺点:当真正需要对这些信息进行修改的时候就无法修改。

       适用场景:永久不需要对该字段进行修改

      

      方案三:使用SpringMVC专门为我们提供的数据丢失解决方案(使@ModelAttribute注解)【推荐使用】

       优点:当不能修改的信息较多时,减少代码量,更为安全

       缺点:较难理解。

      操作:1、先在前台添加一个请求参数:obj.method="updateEmployee";

  //添加或者修改用户saveEmployee:function (){//serializeObject:序列化表单中的数据,使之能完整提交var obj = $("#updateFrom").serializeObject();//id的那个隐藏输入框有值,就表示修改var url = "/employee/addEmployee";if (obj.id && obj.id > 0) {url = "/employee/updateEmployee";//添加一个请求参数obj.method="updateEmployee";}//如果表单验证失败,就阻止表单提交【当表单内所有输入控件都验证通过的时候,这个方法返回true;validate:确认,使生效】var valid = $("#updateFrom").form("validate");if (!valid) return;$.post(url, obj, function (data) {//提示一下$.messager.alert('消息', data.msg + "\r\n" + (data.exception ? data.exception : ""), "info");if (data.status == 200) {//调用搜索页面数据的方法
                window.method.search();//关闭window窗口$("#win").window("close");}}, "json");}

 

        2、在Controller控制层添加如下一个方法(方法上加上注解@ModelAttribute("updateEmployee")    )。

/*** 修改员工之前,通过id查询员工【解决数据丢失问题】* @ModelAttribute("updateEmployee")*  SpringMVC框架专门提供来解决数据丢失问题*  加了@ModelAttribute注解的方法会在当前类的所有处理请求的方法之前都会先执行此方法* */@ModelAttribute("updateEmployee")public Employee findEmployeeToEdit(Long id, String method){//只有修改员工的方法执行之前先去查询员工(因为每个方法执行前都会执行这个方法)if(id != null && "updateEmployee".equals(method)){Employee employee = employeeService.findOneById(id);//员工对象和它关联的部门对象,断开关系,部门就变成临时对象(注意:如果查询的表有相关联的对象,必须要先解除关联,不然会报 n to n错误)employee.setDepartment(null);//持久对象的主键值不能被修改,所以必须要断开联系return employee;}return null;}

 

        3、在修改方法的参数列表上添加@ModelAttribute("updateEmployee")注解。

 /*** 修改员工* @ModelAttribute("updateEmployee")写在参数列表前*  先执行findEmployeeToEdit方法得到一个持久状态的对象(懒加载的特点)*  再从表单请求中获取employee对象*  合并非空属性值,最后以数据库查询出来的持久状态的对象为准,再传入当前方法的参数列表中*  下面形参列表的employee其实就是前台传过来的数据和上面方法传过来的数据的合并(主体是上面方法查到的数据,*  如果前台传来有数据,就把其中对应的数据覆盖,前台对应数据为空就继续用查询到的数据)**  加了@ResponseBody注解,表示处理异步请求,SpringMVC内部默认使用jackson工具转化为JSON进行返回,不跳转页面*/@ResponseBody@RequestMapping("/updateEmployee")public ResultJson updateEmployee(@ModelAttribute("updateEmployee")Employee employee){try {employeeService.save(employee);} catch (Exception e) {e.printStackTrace();return new ResultJson(500,"员工修改失败!",e.getClass().getName() + ": " + e.getMessage());}return new ResultJson(200,"员工修改成功!",null);}

 

SpringMVC的@ModelAttribute("updateEmployee") 注解执行原理分析:

  1、添加有该注解的(findEmployeeToEdit)方法会在当前类的所有处理请求的方法之前执行,因此必须写先在前台页面添加一个请求参数:obj.method="updateEmployee"; 然后在 if(id != null && "updateEmployee".equals(method)) 语句中通过请求参数确保该方法只对修改方法(updateEmployee)起作用;

  2、findEmployeeToEdit执行完毕后,会或得一个持久状态的employee对象(懒加载特性),然后注解@ModelAttribute通过名字updateEmployee找到修改方法的参数列表的同名注解updateEmployee(@ModelAttribute("updateEmployee")Employee employee);

  3、然后以findEmployeeToEdit方法查询到的employee对象作为主体,用前台传过来的employee对象中有值的数据替换主体对象中相对应的数据,这样新得到的employee对象就既有了前台的修改数据,又保存了不可被修改的信息的数据。

 

  

    注意:如果出现如图的 n to n 错误,就是因为持久对象的主键值不能被修改,所以必须要断开联系;例如:employee.setDepartment(null);

 

转载于:https://www.cnblogs.com/wanghj-15/p/11090840.html

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

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

相关文章

科学家即将揭示人类大脑神经网络结构的奥秘

来源:今日头条人类即将迎来了解大脑神经网络结构神秘世界的曙光!哈佛大学神经科学家和谷歌工程师,发布了第一张人类大脑部分的神经网络连接图,大约针头大小的人类大脑组织用重金属染色,切成 5,000,并在电子…

温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

来源:AI科技评论作者:Mr Bear编辑:青暮2021 年 10 月 13 日,来自麻省理工学院、加州大学伯克利分校、伊利诺伊大学香槟分校、华盛顿大学、帝国理工学院的六名顶级人工智能科学家、计算机视觉科学家在 ICCV 2021 大会期间进行了题为…

卷积神经网络(CNN)数学原理解析

来源:图灵人工智能作者:Piotr Skalski编辑:python数据科学原标题:Gentle Dive into Math Behind Convolutional Neural Networks翻 译: 通夜(中山大学)、had_in(电子科技大学&#…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源:DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解,人脑包含大约 860 亿个神经元,可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像,甚至会产生数 PB 范围内的数据,这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前,我们需要了解数据类…

【数据结构基础】-线性表的顺序实现(数组实现)基本操作

2019.10.10 【数据结构-线性表的顺序结构】 基本操作:初始化,判断是否空表,清空表,获取表中的第i个元素,查找元素,插入元素,删除元素,获取表的元素个数。 抽象数据类型&#xff1a…

机器学习驱动技术是生物学进步的下一个突破

来源:ScienceAI作者:Immunai 联合创始人兼 CEO,Luis Voloch编译:绿萝数字生物学与 90 年代的互联网处于同一发展阶段(早期、激动人心和变革性)。当时,IP 地址的概念还很新,「精通技术…

实现调用API接口

API是一组封装好的函数,通过API,你可以为应用快速扩展功能,而无需理解它们是如何实现的,从而提升开发效率。通常,API服务商会提供API文档,那么如何根据文档来使用API呢? PS:该文章内容来自于阿里…

量子力学与机器学习相结合,预测高温下的化学反应

来源:ScienceAI编辑:凯霞在高温下从氧化物中提取金属不仅对于钢铁等金属的生产至关重要,而且对回收利用也必不可少。但当前的提取过程是碳密集型的,会排放大量温室气体。研究人员一直在探索开发「更绿色」的工艺方法。第一性原理理…

DeepMind提出强化学习新方法,可实现人机合作

来源:AI前线作者:Ben Dickson译者:盖策划:凌敏本文来自 BDTechTalks 网站的“AI 研究论文评论”专栏。该专栏提供人工智能最新发现的系列解读文章。尽管人工智能研究人员正力图建立能在围棋、星际争霸到 Dota 等复杂游戏中击败人类…

军事大脑的构建对未来战争的影响

前言:本文是我与军事科学院的赵蔚婷,王婉两位老师在2020年4月发表的一篇论文,首发在《中国科技论文在线》,是将互联网大脑模型与军事领域结合,形成军事大脑和军事超级智能的概念体系,重点提出军事神经元和军事云反射弧…

斯坦福抢开“元宇宙”第一课,上起来还真不便宜

过去半个世纪,斯坦福教给学生的技术,促成了硅谷的诞生;而为了将来的 Web3 时代,斯坦福也已经做好了准备。来源: 硅星人文:杜晨 编辑:VickyXiao今年10月底,硅谷顶级科技公司 Facebo…

加拿大工程院院士于非:互联—— 从质量、能源、信息到智能

来源:AI科技评论整理:莓酊编辑:青暮2021年12月9日,第六届全球人工智能与机器人大会(GAIR 2021)在深圳正式启幕。140余位产学领袖、30位Fellow聚首,从AI技术、产品、行业、人文、组织等维度切入&…

2021年诺贝尔经济学奖评述:解决重大社会问题的自然实验因果框架

来源:集智俱乐部作者:诺奖委员会译者:邓宇昊 编辑:邓一雪 导语许多重大社会问题都涉及到因果分析。比如,接受更长时间的教育是否会让你未来的收入增加?提高最低工资对一个地方的就业会产生怎样的影响&…

溯因推理:人工智能的盲点

来源:AI前线作者:Ben Dickson译者:Sambodhi策划:凌敏本文给当今人工智能界推崇深度学习的现象泼了冷水,指出了人工智能的盲点:溯因推理,并提醒人们不要忽视深度学习的种种问题,否则将…

终于,LoRaWAN成全球物联网标准!LoRa将拿下LPWAN领域50%市场?

来源:LoRa联盟官网等整理发布:物联网智库 不久之前,支持物联网低功耗广域网(LPWAN)LoRaWAN开放标准的LoRa联盟宣布,致力于“物联网和智慧城市及社区标准化”的国际电联电信标准化部门(ITU-T&…

算法(二叉树-矩阵-堆排序)

最小和 位运算知识点 12>>1 //6 a/2 等价为 a>>1 中间数 (LR)/2 会出现溢出(溢出的意思就是超过了二进制) L(R-L)/2 最终改成 l((r-l)>>1) const smallSum arr > {if (arr null || arr.length < 2) {return 0;}return mergeSort(arr, 0, arr.length …

Nature:盐粒大小的相机,可以拍出清晰彩色照片,未来或可应用到手机

来源&#xff1a;大数据文摘你能想象上图只有盐粒大小的物体是一款相机吗&#xff1f;事实上&#xff0c;这款微型相机甚至可以拍出清晰的全彩图像&#xff0c;而相比之下&#xff0c;普通相机的尺寸要大50万倍。我们可以来看看它的成片。这款微型相机是普林斯顿大学和华盛顿大…

spring学习笔记01-BeanFactory和ApplicationContext的区别

spring学习笔记01-BeanFactory和ApplicationContext的区别 BeanFactory 和 ApplicationContext 的区别 BeanFactory 才是 Spring 容器中的顶层接口。 ApplicationContext 是它的子接口。           BeanFactory 和 ApplicationContext 的区别&#xff1a; 创建对象的…

java微博爬虫

微博爬取要做到每日百万级的数据量&#xff0c;需要解决很多问题。 1.springboot自带Scheduled注解是一个轻量级的quartz&#xff0c;可以完成定时任务。只需要在运行方法上加一个Scheduled注解即可。 该注解有许多属性值 initiaDelay 从程序开始延长一定时间后首次执行。 fixe…