简要概述
首先,@Controller、@RestController注解都是用来标注控制器类,处理由DispatcherServlet 分发的请求。
只不过@RestController是
Spring4之后加入的注解。
然后使用@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的数据,
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