您的位置 首页 java

前后端交互传值

一.简析前后端交互

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函数处理才行。

当从后台取数据时,最后一个参数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

文章来源:智云一二三科技

文章标题:前后端交互传值

文章地址:https://www.zhihuclub.com/177659.shtml

关于作者: 智云科技

热门文章

网站地图