zoukankan      html  css  js  c++  java
  • @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

  • 相关阅读:
    IIS日志-网站运维的好帮手
    精选7款绚丽的HTML5和jQuery图片动画特效
    不错的东西
    【今日推荐】10大流行的 Metro UI 风格的 Bootstrap 主题和模板
    跨域使用jsonp 获取天气预报
    《JavaScript权威指南》读书笔记(三)
    css背景定位
    网页加载速度的优化
    CSS书写顺序
    《JavaScript权威指南》读书笔记(二)
  • 原文地址:https://www.cnblogs.com/ggjun/p/11311876.html
Copyright © 2011-2022 走看看