文章目录
- 引言
- 一、返回静态页面
- 二、返回非静态页面的数据
- 三、返回 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
写入以下代码:
<!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.html
return "/index.html";
}
}
运行结果得:
二、返回非静态页面的数据
代码实现:
@Controller
@RequestMapping("/p")
public class PersonController {
@RequestMapping("/meth")
public String method() {
return "<h1>Hello,HTML~</h1>";
}
}
运行结果:
我们前面提到了,MVC 默认是返回的 html 视图,不能够返回数据,那如何解决该问题呢?
只需加上注解 @ResponseBody 即可返回后端数据,它表示返回非静态页面的数据 如下:
@Controller
@ResponseBody
@RequestMapping("/p")
public class PersonController {
@RequestMapping("/meth")
public String method() {
return "Hello,HTML~";
}
}
运行效果如下:
在前面章节也谈到过 @ResponseBody ,我们可以使用@RestController 注解来代替
@ResponseBody 和 @Controller 两个注解
注意:
- @ResponseBody 可以修饰类:表示当前类中所有方法都会返回一个非静态页面的数据
- @ResponseBody 可以修饰方法:表示当前方法返回的是一个非静态页面的数据
- @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;
}
}
访问页面:
通过抓包观察:
当前返回的是 HashMap 对象,所以会以 json 的格式返回给前端
四、请求转发(forward)和请求重定向(redirect)
return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种即请求转发和请求重定向
请求转发和重定向的使⽤对⽐:
我们分别运行,并访问其页面后观察
-
请求转发时
通过 http://127.0.0.1:8080/p/forward 访问页面,结果如下:
-
请求重定向时
通过 http://127.0.0.1:8080/p/redirect 访问页面,结果如下:
这时两种情况所得到的的结果是一模一样的,包括跳转页面的 URL。那他们到底有什么本质的区别呢?我们可以通过抓包来寻找答案
- 请求转发时
此时我们会发现并没有我们发送的 http://127.0.0.1:8080/p/forward 的请求记录,而只有一个 index.html 页面,正是我们跳转的页面
- 请求重定向时
此时我们发现,当使用 http://127.0.0.1:8080/p/redirect 发送请求时,是先得到了该请求的响应,其中返回了一个重要信息 Location,就是我们要跳转的页面。接着就出现了访问 index.html 的记录,在响应中直接返回了该页面
以上就是他两的本质区别,通俗的讲,如果是请求转发,你向服务器发送了一个页面跳转的请求,而该服务器直接将你要跳转的页面返回给你。如果是请求重定向,你向服务器发送了一个页面跳转的请求,该服务器没有直接发送该页面,而是将这个页面的地址返回给你,让你自己主动对跳转页面发起请求
举个例子:
你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你⾃⼰去买,那么就是请求 redirect 重定向
上述只谈到了请求转发和请求重定向的本质区别,通过大佬笔记学习其他区别 !!
注意: 请求转发如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问,此时就应该换成请求重定向,如下:
五、拓展:IDEA 热部署(热加载)
什么是热部署?当你启动程序后,如果修改当前程序代码就需要重新手动启动该程序才会生效,而热部署就是自动帮开发者重启项目程序,当你已经启动程序后再次修改代码,你就可以实时的看到所修改产生的效果了
3.1 添加 SpringBoot DevTools 框架
这一步基本在创建 Boot 项目时就已经完成了,如下:
3.2 开起 IDEA 的自动编译
此步骤需要设置两个地方,一个当前项目的 Settings 和 新项目的 Settings 如下:
点击 Settings 后
新项目中的 Settings 也同样如此
3.3 开起运行中的热部署
注意: 一定不要点击Restore Defaults !! 讲三遍