前后端交互传值

一.简析前后端交互

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值