1.@ResponseBody的作用
不加@ResponseBody,是将方法返回的值作为视图名称,并自动匹配视图去显示, 而加上@ResponseBody就仅仅是将方法返回值当作内容直接返回到客户端,并且会自适应响应头的content-type,返回的字符串符合json,那么content-type就是application/json,如果是普通字符串,就是text/plain,但是加上注解属性produces=application/json,那么不管内容是什么格式,响应头的content-type就一直是application/json,不再去做自适应,至于内容是不是json都不重要了
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。
注意:在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
后台 Controller类中对应的方法:
@RequestMapping("/login.do")
@ResponseBody
public Object login(String name, String password, HttpSession session) {
user = userService.checkLogin(name, password);
session.setAttribute("user", user);
return new JsonResult(user);
}
2.@RequestBody作用
作用在形参列表上,用于将前台发送过来固定格式的数据【xml格式 或者 json等】封装为对应的 JavaBean 对象, 封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
@RequestMapping("/login.do")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
user = userService.checkLogin(loginUser);
session.setAttribute("user", user);
return new JsonResult(user);
}
@RequestBody
@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
作用:
1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定
到要返回的对象上;
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
3.Centent-Type的四种方式
1:浏览器原生表单提交:application/x-www-form-urlencoded
1)浏览器的原生form表单 2) 提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和val都进行了URL转码
2:提交文件表单提交:multipart/form-data
常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctype 等于这个值。
3:json类型:application/json
消息主体是序列化后的 JSON 字符串,这个类型越来越多地被大家所使用 这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好
4:xml类型:application/xml
是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范
3.1下面主要讨论:@requestParam 和@requestBoby如何搭配以下两种使用:
1.application/x-www-form-urlencoded
2.application/json
另外两种比较清晰
3.1.1@requestParam 和@requestBoby的使用时机
两种注解获取参数的功能与请求方法无关,不管是GET还是POST或者其他
3.1.1.1@requestParam
1.只要是GET请求的参数,都可以用这种注解获取 --(因为浏览器当前的实现是不允许 get 发送 body, 但后端应用通常可以发送. 比如 nodejs 或 postman ) 2.无论是GET还是POST,参数只要是放在URL后面的,都可以使用此种注解获取到参数值 3.POST提交方式,content-type :application/x-www-form-urlencoded 的 可以获取到参数 4.POST提交方式,content-type :application/json 的 无法用此注解获取到参数 @requestParam注解用于获取请求参数,也就是放在URL后面的参数,获取不到请求boby中的参数(当然-GET没有请求体)
@requestBoby (Boby中的参数)
@requestBoby注解用于获取请求boby中参数,将其封装成javaBean对象 (当然-GET没有请求体) 1.使用@requestBoby这个注解时候,一般是将参数传到后端,封装成javaBean对象,所以只能用在POST请求 并且Content-Type:applciation/json
总结:
@requestParam 1.用来获取URL后面追加的参数 2.POST请求,content-type:application/json 的body中的参数 @requestBoby 1.接收POST ,content-type:application/json的body参数 (后端一般封装成javaBean对象处理)