Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
清新范er
JavaGuide
提交
d0a85ba5
J
JavaGuide
项目概览
清新范er
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
4
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d0a85ba5
编写于
8月 20, 2019
作者:
K
Kou Shuang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Delete RestControllerVS Controller.md
上级
e5fd8dfe
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
0 addition
and
145 deletion
+0
-145
docs/system-design/framework/spring/RestControllerVS Controller.md
...em-design/framework/spring/RestControllerVS Controller.md
+0
-145
未找到文件。
docs/system-design/framework/spring/RestControllerVS Controller.md
已删除
100644 → 0
浏览文件 @
e5fd8dfe
周末的时候分享了一个技术session,讲到了@RestController 和 @Controller,当时没有太讲清楚,因为 team 里很多同事之前不是做 Java的,所以对这两个东西不太熟悉,于是写了篇文章整理了一下。
## @RestController vs @Controller
### Controller 返回一个页面
单独使用
`@Controller`
不加
`@ResponseBody`
的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。
![
SpringMVC 传统工作流程
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png
)
### @RestController 返回JSON 或 XML 形式数据
但
`@RestController`
只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。
![
SpringMVC+RestController
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png
)
### @Controller +@ResponseBody 返回JSON 或 XML 形式数据
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用
`@Controller`
并结合
`@ResponseBody`
注解,也就是说
`@Controller`
+
`@ResponseBody`
=
`@RestController`
(Spring 4 之后新加的注解)。
> `@ResponseBody` 注解的作用是将 `Controller` 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。
![
Spring3.xMVC RESTfulWeb服务工作流程
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Spring3.xMVCRESTfulWeb服务工作流程.png
)
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:
```
groovy
compile
'org.springframework.boot:spring-boot-starter-thymeleaf'
```
Maven:
```
xml
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-thymeleaf
</artifactId>
</dependency>
```
`src/main/java/com/example/demo/controller/HelloController.java`
```
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
<!DOCTYPE HTML>
<html
xmlns:th=
"http://www.thymeleaf.org"
>
<head>
<title>
Getting Started: Serving Web Content
</title>
<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`
```
java
return
"hello/hello"
;
```
### 示例2: @Controller+@ResponseBody 返回 JSON 格式数据
**SpringBoot 默认集成了 jackson ,对于此需求你不需要添加任何相关依赖。**
`src/main/java/com/example/demo/controller/Person.java`
```
java
public
class
Person
{
private
String
name
;
private
Integer
age
;
......
省略getter
/
setter
,
有参和无参的construtor方法
}
```
`src/main/java/com/example/demo/controller/HelloController.java`
```
java
@Controller
public
class
HelloController
{
@PostMapping
(
"/hello"
)
@ResponseBody
public
Person
greeting
(
@RequestBody
Person
person
)
{
return
person
;
}
}
```
使用 post 请求访问 http://localhost:8080/hello ,body 中附带以下参数,后端会以json 格式将 person 对象返回。
```
json
{
"name"
:
"teamc"
,
"age"
:
1
}
```
### 示例3: @RestController 返回 JSON 格式数据
只需要将
`HelloController`
改为如下形式:
```
java
@RestController
public
class
HelloController
{
@PostMapping
(
"/hello"
)
public
Person
greeting
(
@RequestBody
Person
person
)
{
return
person
;
}
}
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录