小喵最近在学习用java做前后端数据双向交互。
用到最多的就是ajax和vue组件的axios来传数据到后端。
首先,小喵在学习的过程中发现如果在数据传输过程中各种报错的话,可能是在哪些方面的。
报错原因
情况1,有可能是js都没有获取到数据(表单数据,或者是其他数据)。这个时候需要通过html的开发者工具里,小喵一般是用console.log()来输出结果看是否会是js没有获取到表单数据
情况2,有可能是js获取到数据,但是并没有成功发送数据出去。遇到这种情况,小喵会打开html的开发者工具的Network里,看对应的数据包的错误代码是否是错误,如果是就可能是js获取到数据但没有发送成功,如果是正确就是发送成功。
(Network里,看发送数据包的代码)
下拉后可以看到对应的具体数据
如果是错误,前台发送错误的原因有哪些呢?
检查ajax的type是post还是get,然后去看后台是否对应写错了。
检查ajax的url地址是否写对,再去看后台接受的url地址。
检查ajax的dataType是什么类型?一般是json。一般有6种,xml,html,script,json,jsonp,text
contentType:application/json;charset=UTF-8这句最好加上
发送json数据时,有几种写法。
法1
写成类的方式
varjob={};job.jobid=jobid;job.jobname=jobname;
data:JSON.stringify(job)//这一句是在ajax里面的
JSON.stringify()的作用是将json字符串转json对象
法2
把类直接写成json字符串,然后用JSON.stringify()
data:JSON.stringify({jobid:jobid,jobname:jobname})
情况3,前端发送成功,后台接受数据失败。
小喵就遇到过这种问题。
如下图
小喵的后台调试时,已经进入了函数,但是返回ID为空。后来经过小喵的仔细排查发现,错误的原因竟然是实体类的成员变量写成了private!要注意用实体类来接受时一定要写成public。除此之外,大家一定要注意实体类成员变量的参数类型,最好都设成String!ajax不能传后台没有的参数,或者实体中没有的成员变量。
还有就是,这句是小喵在别人的博客上看到的一段:
RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。在ajax请求往往传的都是Json对象,用JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType:“json”,contentType:”application/json”这样就可以轻易的将一个对象或者List传到Java端,使用RequestBody即可绑定对象或者List.以上这些都是可能遇见的报错原因。
除了以上之外,要小心要留意,取的实体类名别设job_id,jobId这种,可能会报因为驼峰命名法而产生的错误。
实例
小喵创建的表单,表单就是一般的表单啦,没啥需要注意的。
后台java代码
实体类
这里的SysJobentity几乎跟上面的FormEntity一样,唯一不同的就是id是设的int类型,变量是私有变量。
对了,传实体类是不用加上注解
param的!只有传变量时才需要加上。如以下两个图,也是在别人的博客上逛到的
以上做完,就实现了我们的ajax传数据到后台了。
axios是这样的形式了
其实ajax弄懂基本就没啥问题了
但一开始axios还总是写错了好多了的。
小喵还专门去CSDN上搜了搜axios和ajax的区别。
区别
axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。简单来说:ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装。axios是ajaxajax不止axios。
其实ajax作为异步加载,小喵是非常喜欢用的,比其他方法好用多了,这里有一个很生动形象的例子。
js是单线程的,由于执行ajax请求会消耗一定的时间,甚至出现了网络故障而迟迟得不到返回结果;这时,如果同步执行的话,就必须等到ajax返回结果以后才能执行接下来的代码,如果ajax请求需要1分钟,程序就得等1分钟。如果是异步执行的话,就是告诉ajax代码“老兄,既然你迟迟不返回结果,我先不等你了,我还有一大堆代码要执行,等你执行完了给我说一下”。
小喵的第二次发文,希望大家能轻松写代码,没有bug没有bug!