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

一、问题描述:

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

二、原因分析:

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

解决表单提交的数据丢失问题相关推荐

  1. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  2. layui表单提交使用form.on(‘submit(sub)‘,function (){}) 使用ajax请求时回调不执行的原因及解决方法

    layui表单提交使用form.on('submit(sub)',function (){}) 使用ajax请求时回调不执行的原因及解决方法 参考文章: (1)layui表单提交使用form.on(' ...

  3. action无法传参数给html页面,HTML 解决form表单提交时,action url中参数无效问题

    这篇文章主要为大家详细介绍了HTML 解决form表单提交时,action url中参数无效问题,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

  4. java后台用 requset对象 存储值 前台获取不到_springmvc form表单提交后台对象获取不到值(解决)...

    使用springmvc进行表单提交时,在controller action层实体对象获取不到值. 在struts中使用user.username方式传递参数,在spring中不需要对象点直接使用对象属 ...

  5. jmeter测试接口--form表单提交请求(解决请求传参为空的问题)

    jmeter测试接口--form表单提交请求(解决请求传参为空的问题) 参考文章: (1)jmeter测试接口--form表单提交请求(解决请求传参为空的问题) (2)https://www.cnbl ...

  6. jsp表单提交中文乱码的解决

    jsp表单提交中文乱码的解决 <%@ page language="java" contentType="text/html; charset=utf-8 &quo ...

  7. laravel表单提交419解决办法

    最近用laravel post表单提交数据报419错误,如下图(原因是表单提交必须带上_token值,防止csrf攻击) 最后的解决办法如下 第一种          找到app/Http/Middl ...

  8. 报错解决:form表单提交存入数据库出现中文乱码

    遇到问题:在JavaWeb学习阶段,通过表单提交对数据库数据进行修改,发现原本为中文字段的数据,表单提交之后都变成了乱码. 解决措施:针对form表单的请求方式修改编码格式 get和post请求的区别 ...

  9. 【解决回车键出现乱码的问题】禁用Enter键触发form表单提交的问题 ,同时启用保留textarea换行操作

    问题描述 Enter键触发form表单提交的问题 ,同时启用保留textarea换行操作 ##解决回车键出现乱码的问题 代码如下(示例): <script type="text/jav ...

最新文章

  1. 清华刘知远组:​让预训练语言模型持续高效吸收新领域知识 | ACL 2022
  2. SQLSERVER 和 ORACLE 查询数据库文件大小
  3. 长度短点的uuid_UUID不失精度,长度改进
  4. 金山实习周记(2)——沟通
  5. Linux 网易云 deb 包下载 安装
  6. matlab在mac中好用吗,Matlab Mac版上手
  7. java实现微信公众号的模板消息推送
  8. 体脂率编程c语言,C语言程序
  9. 微信小程序开发实战第六讲之手机号验证码登录
  10. Mybatis-Plus报错:Invalid bound statement (not found)
  11. 考研复试常见问题(数据库系统概论篇)
  12. 为什么DMA方式的优先级高于程序中断方式
  13. 越狱苹果手机导出网易云音乐歌曲(以及缓存文件转换)
  14. 抑郁症,莫要讳疾忌医。
  15. KLayout教程(一)画不同的形状
  16. 微博奥运营销策略复盘,探索双十一微博品牌营销新手法
  17. 2009-09-神秘东北大哥
  18. 肖博高中数学高考数学二轮复习方法三角函数的图象与性质策略,附例题解析!
  19. 大连英语培训百家外语商务英语初级阶段如何学习中级商务英语口语
  20. 瓦.替代_20190505

热门文章

  1. python2编码问题解决了吗_Python2编码问题
  2. c语言程序设计顺序结构题目,C语言编程 顺序结构编程练习题目
  3. java ognl表达式_java -------ognl表达式入门
  4. 即将放弃python的app_python放弃之 模块和包
  5. kafka 启动_Kafka管理工具Kafka Manager
  6. nsoutlineview 搜索_阿里巴巴搜索推荐广告三位一体的在线服务体系
  7. php处理base64数据,php基于base64解码数据与图片的转换
  8. python导出项目所依赖的所有的库文件以及安装
  9. 七、Web服务器——Junit单元测试 反射 注解学习笔记
  10. LeetCode 2150. 找出数组中的所有孤独数字(哈希)