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

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

一、问题描述:

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

 

二、原因分析:

       提交表单的时候,因为在表单中没有那些不允许修改的信息相对应的数据,所以在执行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,并在电子…

C++学习—— mutable和 extern

文章目录1. mutable2.extern用法?1. mutable 1) 如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制; 常成员函数,不允许修改成员变量的值&#xff0c…

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

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

20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK

demo代码如下: private void btnPrint_Click(object sender, EventArgs e){if (this.btnPrint.Text "停止打印"){SetBtnPrintUIEnable();return;}//禁用界面上的相关按钮SetBtnPrintUIDisable();var dt new DataTable(); new Task(() >{///开始的打印//1. 获取…

C++学习——string

文章目录1.int转字符串字符串转int?2.strcat,strcpy,strncpy,memset,memcpy的内部实现&#xff1f;1.int转字符串字符串转int? 例:"123"123#include<iostream> #include<string> using namespace std;string string_head_end(string str) {string s&q…

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

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

仅模糊背景图像而不是前面的文本

正如标题所说。 如何模糊容器的背景图像而不模糊前面的文本&#xff1f; <div class"card"> <div class"head"> <div class"title"> <span>Card Title</span> </div> </div> <div class"body…

C++学习——模板

文章目录1.C模板2.C模板是什么&#xff0c;底层怎么实现的&#xff1f;1.C模板 模板是泛型编程的基础&#xff0c;泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。 库容器&#xff0c;比如迭代器和算法&#xff0c;都是泛型编程的例…

【数据结构基础】-串-顺序结构的基本操作实现

2019.10.12 数据结构中串的基本操作实现&#xff0c;包括串的定义&#xff0c;串的初始化&#xff0c;赋值&#xff0c;获取串的长度&#xff0c;串的比较&#xff0c;连接串&#xff0c;求子串&#xff0c;清空串。 语言&#xff1a;c语言 运行环境&#xff1a;dev #include &…

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

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

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

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

C++学习——c语言和C++语言中的struct

C语言struct和Cstruct区别 C语言中&#xff1a;struct是用户自定义数据类型&#xff08;UDT&#xff09;&#xff1b; C中struct是抽象数据类型&#xff08;ADT&#xff09;&#xff0c;支持成员函数的定义&#xff0c;&#xff08;C中的struct能继承&#xff0c;能实现多态&am…

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

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

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

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

makefile编译erlang

https://www.cnblogs.com/witton/p/6868963.html转载于:https://www.cnblogs.com/hshy/p/11096625.html

C++学习——内联函数

文章目录1.内联函数1.1 什么是内联函数1.2 内联函数的声明1.3 内联函数的条件2.成员函数与内联函数2.1 内联成员函数2.2 判断成员函数时候为内联函数3. 虚函数可以声明为inline吗1.内联函数 1.1 什么是内联函数 C提供一种提高函数效率的方法&#xff0c;即在编译时将被调函数…

实现调用API接口

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

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

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

js实现右键单击打开自定义的菜单

今天分享一个&#xff0c;单击鼠标右键弹出自定义菜单&#xff0c;选中不同菜单选项&#xff0c;实现其对应功能 首先先自已定义一个菜单 <div id"menu"><ul><li>添加</li><li>删除</li><li>修改</li></ul>&l…

个人觉得好的文章链接推荐【转载,侵权立删】

声明&#xff1a;本篇博客为博主学习后端中觉得好的文章&#xff0c;不定期更新。上方是链接&#xff0c;下方是作者简介以及内容简介。均为转载&#xff0c;来源不限&#xff0c;若有侵权&#xff0c;请联系博主&#xff0c;或者是在评论区留言&#xff0c;侵权立删&#xff0…