> 文章列表 > 【 Spring MVC 核心功能(三) - 输出数据】

【 Spring MVC 核心功能(三) - 输出数据】

【 Spring MVC 核心功能(三) - 输出数据】

文章目录

  • 引言
  • 一、返回静态页面
  • 二、返回非静态页面的数据
  • 三、返回 JSON 对象
  • 四、请求转发(forward)和请求重定向(redirect)
  • 五、拓展:IDEA 热部署(热加载)
    • 3.1 添加 SpringBoot DevTools 框架
    • 3.2 开起 IDEA 的自动编译
    • 3.3 开起运行中的热部署
    • 3.4 使用 debug 启动项目

引言

通过上⾯的学习我们知道,默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的是视图
(xxx.html),⽽现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使⽤ @ResponseBody 注解了

一、返回静态页面

创建前端⻚⾯ index.html

【 Spring MVC 核心功能(三) - 输出数据】

写入以下代码:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initialscale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>hello,spring mvc</title>
<script src="index.js"></script>
</head>
<body>
<h1>Hello,Spring MVC.</h1>
</body>
</html>

创建 PersonController 类

@Controller
@RequestMapping("/p")
public class PersonController {@RequestMapping("/index")public Object index() {
// 执⾏业务...
// 返回view -> index.htmlreturn "/index.html";}
}

【 Spring MVC 核心功能(三) - 输出数据】

运行结果得:

【 Spring MVC 核心功能(三) - 输出数据】

二、返回非静态页面的数据

代码实现:

@Controller
@RequestMapping("/p")
public class PersonController {@RequestMapping("/meth")public String method() {return "<h1>Hello,HTML~</h1>";}
}

运行结果:

【 Spring MVC 核心功能(三) - 输出数据】

我们前面提到了,MVC 默认是返回的 html 视图,不能够返回数据,那如何解决该问题呢?

只需加上注解 @ResponseBody 即可返回后端数据,它表示返回非静态页面的数据 如下:

@Controller
@ResponseBody
@RequestMapping("/p")
public class PersonController {@RequestMapping("/meth")public String method() {return "Hello,HTML~";}
}

运行效果如下:

【 Spring MVC 核心功能(三) - 输出数据】

在前面章节也谈到过 @ResponseBody ,我们可以使用@RestController 注解来代替
@ResponseBody 和 @Controller 两个注解

注意:

  1. @ResponseBody 可以修饰类:表示当前类中所有方法都会返回一个非静态页面的数据
  2. @ResponseBody 可以修饰方法:表示当前方法返回的是一个非静态页面的数据
  3. @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
    application/json 返回给前端

三、返回 JSON 对象

代码实现:

@RestController
@RequestMapping("/p")
public class PersonController {@RequestMapping("/jsonmap")public HashMap<String, String> jsonMap() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;}
}

访问页面:

【 Spring MVC 核心功能(三) - 输出数据】

通过抓包观察:

【 Spring MVC 核心功能(三) - 输出数据】

当前返回的是 HashMap 对象,所以会以 json 的格式返回给前端


四、请求转发(forward)和请求重定向(redirect)

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种即请求转发和请求重定向

请求转发和重定向的使⽤对⽐:

【 Spring MVC 核心功能(三) - 输出数据】

我们分别运行,并访问其页面后观察

  1. 请求转发时
    通过 http://127.0.0.1:8080/p/forward 访问页面,结果如下:
    【 Spring MVC 核心功能(三) - 输出数据】

  2. 请求重定向时
    通过 http://127.0.0.1:8080/p/redirect 访问页面,结果如下:
    【 Spring MVC 核心功能(三) - 输出数据】

这时两种情况所得到的的结果是一模一样的,包括跳转页面的 URL。那他们到底有什么本质的区别呢?我们可以通过抓包来寻找答案

  1. 请求转发时
    【 Spring MVC 核心功能(三) - 输出数据】

此时我们会发现并没有我们发送的 http://127.0.0.1:8080/p/forward 的请求记录,而只有一个 index.html 页面,正是我们跳转的页面

  1. 请求重定向时
    【 Spring MVC 核心功能(三) - 输出数据】

此时我们发现,当使用 http://127.0.0.1:8080/p/redirect 发送请求时,是先得到了该请求的响应,其中返回了一个重要信息 Location,就是我们要跳转的页面。接着就出现了访问 index.html 的记录,在响应中直接返回了该页面

以上就是他两的本质区别,通俗的讲,如果是请求转发,你向服务器发送了一个页面跳转的请求,而该服务器直接将你要跳转的页面返回给你。如果是请求重定向,你向服务器发送了一个页面跳转的请求,该服务器没有直接发送该页面,而是将这个页面的地址返回给你,让你自己主动对跳转页面发起请求

举个例子:

你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你⾃⼰去买,那么就是请求 redirect 重定向

上述只谈到了请求转发和请求重定向的本质区别,通过大佬笔记学习其他区别 !!


注意: 请求转发如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问,此时就应该换成请求重定向,如下:

【 Spring MVC 核心功能(三) - 输出数据】


五、拓展:IDEA 热部署(热加载)

什么是热部署?当你启动程序后,如果修改当前程序代码就需要重新手动启动该程序才会生效,而热部署就是自动帮开发者重启项目程序,当你已经启动程序后再次修改代码,你就可以实时的看到所修改产生的效果了

3.1 添加 SpringBoot DevTools 框架

这一步基本在创建 Boot 项目时就已经完成了,如下:

【 Spring MVC 核心功能(三) - 输出数据】

3.2 开起 IDEA 的自动编译

此步骤需要设置两个地方,一个当前项目的 Settings 和 新项目的 Settings 如下:
【 Spring MVC 核心功能(三) - 输出数据】

点击 Settings 后

【 Spring MVC 核心功能(三) - 输出数据】

新项目中的 Settings 也同样如此

3.3 开起运行中的热部署

【 Spring MVC 核心功能(三) - 输出数据】

注意: 一定不要点击Restore Defaults !! 讲三遍

【 Spring MVC 核心功能(三) - 输出数据】

3.4 使用 debug 启动项目

【 Spring MVC 核心功能(三) - 输出数据】