controller接收json数据_@RestController vs @Controller

周末的时候分享了一个技术session,讲到了@RestController 和 @Controller,当时没有太讲清楚,因为 team 里很多同事之前不是做 Java的,所以对这两个东西不太熟悉,于是写了篇文章整理了一下,顺便分享一下。这是一个比较基础的问题,可以拿来回顾一下 Spring 基础。

@RestController vs @Controller

Controller 返回一个页面

单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。

47177a3377e6d172bc2f9ecbfe28cc78.png
SpringMVC 传统工作流程

@RestController 返回JSON 或 XML 形式数据

@RestController只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。

c76c0c484d54abcc2c51689c35c00215.png
SpringMVC+RestController

@Controller +@ResponseBody 返回JSON 或 XML 形式数据

如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用@Controller 并结合@ResponseBody注解,也就是说@Controller +@ResponseBody@RestController(Spring 4 之后新加的注解)。

@ResponseBody 注解的作用是将 Controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。

d19b766db2b0b60c739180a2ae3ccb3a.png

Spring3.xMVC RESTfulWeb服务工作流程

Reference:

  • https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源)

  • https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1

示例1: @Controller 返回一个页面

当我们需要直接在后端返回一个页面的时候,Spring 推荐使用 Thymeleaf 模板引擎。Spring MVC中@Controller中的方法可以直接返回模板名称,接下来 Thymeleaf 模板引擎会自动进行渲染,模板中的表达式支持Spring表达式语言(Spring EL)。如果需要用到 Thymeleaf 模板引擎,注意添加依赖!不然会报错。

Gradle:

 compile 'org.springframework.boot:spring-boot-starter-thymeleaf'

Maven:

<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-thymeleafartifactId>
dependency>

src/main/java/com/example/demo/controller/HelloController.java

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name);
        return "hello";
    }
}

src/main/resources/templates/hello.html

Spring 默认会去 resources 目录下 templates 目录下找,所以建议把页面放在 resources/templates 目录下

HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Contenttitle>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
head>
<body>
<p th:text="'Hello, ' + ${name} + '!'"/>
body>
html>

访问:http://localhost:8999/hello?name=team-c ,你将看到下面的内容

Hello, team-c!

如果要对页面在templates目录下的hello文件夹中的话,返回页面的时候像下面这样写就可以了。

src/main/resources/templates/hello/hello.html

   return "hello/hello";

示例2: @Controller+@ResponseBody 返回 JSON 格式数据

SpringBoot 默认集成了 jackson ,对于此需求你不需要添加任何相关依赖。

src/main/java/com/example/demo/controller/Person.java

public class Person {
    private String name;
    private Integer age;
    ......
    省略getter/setter ,有参和无参的construtor方法
}

src/main/java/com/example/demo/controller/HelloController.java

@Controller
public class HelloController {
    @PostMapping("/hello")
    @ResponseBody
    public Person greeting(@RequestBody Person person) {
        return person;
    }

}

使用 post 请求访问 http://localhost:8080/hello ,body 中附带以下参数,后端会以json 格式将 person 对象返回。

{
    "name": "teamc",
    "age": 1
}

示例3: @RestController 返回 JSON 格式数据

只需要将HelloController改为如下形式:

@RestController
public class HelloController {
    @PostMapping("/hello")
    public Person greeting(@RequestBody Person person) {
        return person;
    }

}

推荐阅读

入职一个月的职场小白,谈谈自己这段时间的感受

Code Review最佳实践

后端开发必备的 RestFul API 知识

技术面试复习大纲

如何给老婆解释什么是RPC

干货收藏 | Java程序员必备的一些流程图

【面试】如果把线程当作一个人来对待,所有问题都瞬间明白了

MySQL知识点总结[修订版]

十分钟搞懂Java效率工具Lombok使用与原理

看完这篇文章,别说自己不会用Lambda表达式了!

一些有助于你拿Offer的文章

15个经典的Spring面试常见问题

面试官:“谈谈Spring中都用到了那些设计模式?”。

盘点阿里巴巴 15 款开发者工具

372fcd1f3530baa82ea8a7bbbcce010a.png

欢迎关注1b909cf998760270571e2566a47027a4.png点个再看40efc4cedd2d3054ebc62a043143d205.png

欢迎置顶本公众号,第一时间获取最新更新25ac45e144a5667bad8bfd2efa07c792.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值