@Controller、@RestController、@RequestMapping、@ResponseBody、@RequestBody、@RequestParam用法详解

简要概述

首先,@Controller、@RestController注解都是用来标注控制器类,处理由DispatcherServlet 分发的请求。

只不过@RestControllerSpring4之后加入的注解。

然后使用@RequestMapping 、@RequestParam、@ResponseBody、@RequestBody 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

下面再来介绍一下这些注解的使用关系和场景

  • @Controller:它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model返回给对应的View进行展示,即该注解返回的是一个页面。
  • @RestControlle:返回的是json数据。

  用过thymeleaf 或freemarker的朋友可能会遇到一个诉求,我一个Controller类中既想有方法去返回html页面,又想有其它的方法去返回json数据能不能做到呢?

当然是可以的!!!

@Controller+@ResponseBody

即假如你标注的@Controller的控制类,有某个方法想返回json数据了,就直接给该方法加上@ResponseBody注解。

下面来介绍一下@RequestMapping,这个也是最常见的注解之一,接口控制类中应该已经见怪不怪了,

该注解用于映射请求,也就是通过它来指定控制器可以处理哪些URL请求, 可以在方法和类的声明中使用。

@RequestMapping 中的 value 和 path 属性(这两个属性作用相同,可以互换)

@RequestMapping 中的 method 主要用来定义接收浏览器发来的何种请求。在Spring中,使用枚举类

下面再重点介绍一下@RequestBody@RequestParam的区别

1、首先两者的应用场景不一样,使用@RequestParam:主要处理contentType为application/x-www-form-urlencoded的数据,

 

这种格式的特点就是,name/value 成为一组,每组之间用 & 联接,而 name与value 则是使用 = 连接。如: wwwh.baidu.com/q?key=fdsa&lang=zh 这是get , 而 post 请求则是使用请求体,参数不在 url 中,在请求体中的参数表现形式也是: key=fdsa&lang=zh的形式。
 
这种方式的好处就是浏览器都支持,在请求发送过程中会对数据进行序列化处理,以键值对形式。
 
但是application/x-www-form-urlencoded 是没有办法将复杂的 JSON 组织成键值对形式,你可以发送请求,但是服务端收到数据为空, 因为 ajax不知道怎样处理这个数据。
 

使用@ResponseBody:主要处理contentType不为application/x-www-form-urlencoded的数据,比如application/json

 

所以我们一般调用ajax请求用@ResponseBody一定要注意在ajax中要指明contentType:"application/json;charset=UTF-8" data:JSON.stringify(json数组);

(这里简单科普一下,原生的表单提交或ajax提交的请求如果不指定contentType属性(表单中为enctype)则都是默认为application/x-www-form-urlencoded)

 

看到这里那么有的小伙伴要就要问了,公司产品里很多页面是调用ajax请求,接口用的是@RequestBody注解接收参数,也没看到指定contentType为application/json;charset=UTF-8呀,如下图所示

而且貌似参数都不是json格式的字符串而是一个JSON对象,这是因为 。。。

这个是工具类调用的ajax,也就是说这个ajax是被公司封装过的,里面的内容如下

 

现在是不是一切都说得通了!!!

 有些小伙伴一直搞不明白JSON对象和json字符串的区别,这里也简单科普一下

JSON的全称是JavaScript Object Notation,即JSON是JavaScript原生格式,即一个JavaScript对象

JSON中的五种写法:  ------    这里就不一一介绍了,有兴趣的可以自己去百度。

而json字符串顾名思义,即JSON转字符串,一般使用JSON.stringify()

 再继续补充点干货!!!

使用@RequestParam:要指明前端传过来的参数名并与其对应

同一个方法中可以使用多个@RequestParam注解,比如form表单,往往不会提交指定某个字符串作为参数,而是提交整个表单,就可以用下面这种方式去接收表单的参数

那么@RequestBody注解可以使用多次吗

答案是  不可以!!!

但是它可以定义一个对象去接收所有的参数,比如 

那么该实体变量匹配到的所有参数就都可以被接收了,如果匹配不到怎么办,没关系,如果是继承了框架BaseEntity的实体,那么该实体则继承了Map的特性

即使匹配不到也可以存到其的Map父类的 key-value中。

 

请使用手机"扫一扫"x

posted @ 2019-08-06 22:44  晨钟又暮鼓  阅读(2180)  评论(1编辑  收藏  举报