前端传输数据到后端(前后端交互传值)
一.简析前后端交互
java语言是一种强类型的语言,必须定义类型,然后生成实例,而js却不是,虽然它也是面向对象的,但是它并没有先定义类这一种概念(但是js也有类型),它是基于原型的一种模式,和java完全不同。很显然,二者的原理,机制,语法并不能兼容。二者产生的对象并不能被对方解读。再来看网络传输,通常就是http/tcp协议喽,使用的其实是请求-响应,再说白了即使字符串,不论后台传来的是什么类型的数据,也不论前台传回的什么类型的数据,网络层统统当作字符串处理。
因此,前后端进行数据交互之前,它们各自都要完成一个转换过程,把要发送的转换成字符串,把要收到的字符串解析成自己的对象。因为传输的字符串会涉及前后台双方的解析和处理,所以双方都必须认识或者知道字符串该怎么转,也就是说,最好能有一种通用的规则来编辑,转换字符串,这个标准或者协议就是JSON,JSON就是用来交换数据的,是一种string,一种独立于平台的数据格式。
1,在js中,可以使用JSON.stringify()函数,把一个js中的对象转成json的string,也可以使用JSON.parse()函数,把一个json的string转成一个js里的对象。
2,在java中,有JSONObject和JSONArray两个对象,转string就用它们的toString()函数,转对象,就用toBean()和toArray()函数。需要注意的是JSONObject必须是string的键。
最后来看一下异步函数,常用的就是$.post()。往后台传参数的时候,用的是一个键值对,也就是该函数的第二个参数,里面的值按照之前的说法,先转为string,那么我这里js定义了一个对象obj,要把它传到后台,先用stringify函数处理才行。
$.post(url,{"param1":JSON.stringify(array)},function(data){
var a = JSON.parse(data);
$.each(a, function(index, val){
alert(val);
});
},"json");
当从后台取数据时,最后一个参数type很重要,我们知道最开始的时候,js接到的参数一定是一个string(通过网络传来的),$.post的最后一个参数就是决定js接下来怎么处理收到的参数,是当作一个string还是一个对象,取决于type的值,如果是对象,那么就设置为“json”,它会按照json格式来转换对象,不填的话默认是string,把它当作字符串来处理。设置text也当做字符串处理。
二.@responseBody注解的使用
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML
数据,需要注意的呢,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
User字段:userName pwd
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
@ResponseBody注解最终将返回值转为json对象的字符串的形式。
三.@RequestParam注解
在此之前,写项目一直用的是@RequestParam(value="aa" required=false)这个注解。
1、可以对传入参数指定参数名
@RequestParam String inputStr // 下面的对传入参数指定为aa,如果前端不传aa参数名,会报错
@RequestParam(value="aa") String inputStr
2、可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传
// required=false表示不传的话,会给参数赋值为null,required=true就是必须要有
@RequestMapping("testRequestParam")
public String filesUpload(@RequestParam(value="aa", required=true) String inputStr, HttpServletRequest request)
3、如果@requestParam注解的参数是int类型,并且required=false,此时如果不传参数的话,会报错。原因是,required=false时,不传参数的话,会给参数赋值null,这样就会把null赋值给了int,因此会报错。
// required=false表示不传的话,会给参数赋值为null,required=true就是必须要有
@RequestMapping("testRequestParam")
public String filesUpload(@RequestParam(value="aa", required=false) int inputStr, HttpServletRequest request)
若是前端页面不传参的话,此处就会报错。当然可以用Integer代替int
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com