浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别

首先,大家在使用SSM框架进行web开发的时候,经常会在Ctrl层遇到@RequestMapping、@ResponseBody以及@RequestBody这三个参数,博主就以自己在项目开发中总结的一些知识点浅谈一下三者之间微妙的关系。

[email protected]

国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没用,但是用在方法上必须有。

例如:

 1 @Controller
 2 //设置想要跳转的父路径
 3 @RequestMapping(value = "/Controllers")
 4 public class StatisticUserCtrl {
 5     //如需注入,则写入需要注入的类
 6     //@Autowired
 7
 8             // 设置方法下的子路经
 9             @RequestMapping(value = "/method")
10             public String helloworld() {
11
12                 return "helloWorld";
13
14             }
15 }

其原理也非常好了解,其对应的 action 就是“ (父路径) controller/(父路径下方法路经)method ”。因此,在本地服务器上访问方法 http://localhost:8080/controller/method 就会返回(跳转)到“ helloWorld.jsp ”页面。

说到这了,顺便说一下 @PathVariable 注解,其用来获取请求路径(url )中的动态参数。

页面发出请求:

1 function login() {
2     var url = "${pageContext.request.contextPath}/person/login/";
3     var query = $(‘#id‘).val() + ‘/‘ + $(‘#name‘).val() + ‘/‘ + $(‘#status‘).val();
4     url += query;
5     $.get(url, function(data) {
6         alert("id: " + data.id + "name: " + data.name + "status: "
7                 + data.status);
8     });
9 }

例如:

 1 /**
 2 * @RequestMapping(value = "user/login/{id}/{name}/{status}") 中的 {id}/{name}/{status}
 3 * 与 @PathVariable int id、@PathVariable String name、@PathVariable boolean status
 4 * 一一对应,按名匹配。
 5 */
 6
 7 @RequestMapping(value = "user/login/{id}/{name}/{status}")
 8 @ResponseBody
 9 //@PathVariable注解下的数据类型均可用
10 public User login(@PathVariable int id, @PathVariable String name, @PathVariable boolean status) {
11 //返回一个User对象响应ajax的请求
12     return new User(id, name, status);
13 }

@ResponseBody

@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。 
作用: 
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。 
使用时机: 
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

当页面发出异步请求:

 1 function login() {
 2     var datas = ‘{"username":"‘ + $(‘#username‘).val() + ‘","userid":"‘ + $(‘#userid‘).val() + ‘","status":"‘ + $(‘#status‘).val() + ‘"}‘;
 3     $.ajax({
 4         type : ‘POST‘,
 5         contentType : ‘application/json‘,
 6         url : "${pageContext.request.contextPath}/user/login",
 7         processData : false,
 8         dataType : ‘json‘,
 9         data : datas,
10         success : function(data) {
11             alert("userid: " + data.userid + "username: " + data.username + "status: "+ data.status);
12         },
13         error : function(XMLHttpRequest, textStatus, errorThrown) {
14             alert("出现异常,异常信息:"+textStatus,"error");
15         }
16     });
17 };

例如:

 1 @RequestMapping(value = "user/login")
 2 @ResponseBody
 3 // 将ajax(datas)发出的请求写入 User 对象中,返回json对象响应回去
 4 public User login(User user) {
 5     User user = new User();
 6     user .setUserid(1);
 7     user .setUsername("MrF");
 8     user .setStatus("1");
 9     return user ;
10 }

异步获取 json 数据,加上 @Responsebody 注解后,就会直接返回 json 数据。

@RequestBody

@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

作用:

1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 必须;multipart/form-data, 不能处理;其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

例如:

@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中
public User login(@RequestBody User user) {
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
    return user;
}
最后感谢walkerjong的spring源码支持,如有问题请大家多多评论,你的建议是我成长道路中必不可少的养分,还是那句话,我们不止会New!

原文地址:https://www.cnblogs.com/Jones-dd/p/9349672.html

时间: 2024-10-02 11:11:23

浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别的相关文章

@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别

[email protected] 国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径:用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没用,但是用在方法上必须有. @RequestMapping("/verifyCode") public void verifyCod

[转]浅谈new/delete和malloc/free的用法与区别

目录 一.new和delete用法 二.malloc和free的用法 三.new和malloc的区别 正文 每个程序在执行时都会占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为自由存储区或堆. 回到顶部 一.new和delete用法 如下几行代码: int *pi=new int; int *pi=new int(); int *pi=new int(1024); 第一行这个new表达式在自由存储区中分配创建了一个整形对象,并返回一个指向该对象的地址来初始化指针pi.第二行同一行,

五 浅谈CPU 并行编程和 GPU 并行编程的区别

前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺垫. 区别一:缓存管理方式的不同 GPU:缓存对程序员不透明,程序员可根据实际情况操纵大部分缓存 (也有一部分缓存是由硬件自行管理). CPU:缓存对程序员透明.应用程序员无法通过编程手段操纵缓存. 区别二:指令模型的不同 GPU:采用 SIMT - 单指令多线程模型,一条指令配备一组硬件,对应32

浅谈MVC、MVP、MVVM架构模式的区别和联系

浅谈MVC.MVP.MVVM架构模式的区别和联系 学习了:http://www.cnblogs.com/guwei4037/p/5591183.html http://blog.csdn.net/ttf1993/article/details/49405329 MVC: Model->View->Controller->Model MVP: View <--> Presenter <--> Model MVVM: View (ViewController)<

@RequestBody注解的用法

以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象.然而在ajax请求往往传的都是Json对象,后来发现用 JSON.stringify(data)的方式就能将对象变成字符串.同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样

浅谈分析表格布局与Div+CSS布局的区别

(1)表格布局 表格布局容易掌握,布局方便.但表格布局需要通过表格的间距或者使用透明的gif图片来填充布局板块间的间距,这样布局的网页中表格会生成大量难以阅读和维护的代码:而且表格布局的网页要等整个表格下载完毕后才能显示所有内容,所有表格布局浏览速度较慢[2]. (2)CSS+DIV布局 通常要实现比较精确和自适应的层布局需要设置层的样式,即用CSS控制层的位置.CSS+DIV布局采用Div来定位,通过Div的border(边框).padding(填充).margin(边界)和Float(浮动)

浅谈C/C++引用和指针的联系和区别

为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来了. "Everything uses pointers. C++ just exposes them rather than hiding them," It's easier to give someone an address to your home than to give a

浅谈haskell中functor typeclass和普通typeclasses的区别

其实这个区别就好像普通函数和高阶函数的区别一样.这样是不是很好理解了呢,额,如果你说你还不知道啥是高阶函数,那么还是不要看这个文章了.下面来看看我是如何把他们类比起来的. 我们看看haskell中的Eq是如何定义的,这个我把它叫"普通typeclasses"(为了区分functor typeclasses,我就这么叫它了:P),这里定义了一个typeclasses并且在这个typeclasses里面定义了一个行为,普遍的说法就是你可以把这个typeclasses想象成java的inte

浅谈echo、print、var_dump()、print_r()的区别

1.echo 和 print 的区别 共同点:首先echo 和 print 都不是严格意义上的函数,他们都是语言结构;他们都只能输出 字符串,整型跟int型浮点型数据.不能打印复合型和资源型数据: 而区别是:echo 可以连续输出多个变量,而print只能一次输出一个变量.print打印的值能直接复制给一个变量,如 $a = print "abc123"; 而echo 不可以,它没有像函数的行为,所以不能用于函数的上下文.在使用时,echo() 函数比 print()速度稍快. 2.v