SpringMCV(9)响应:返回静态页面 & 修改响应数据
文章目录
- [SpringMCV(9)响应:返回静态页面 & 修改响应数据](#SpringMCV(9)响应:返回静态页面 & 修改响应数据)
- [1. 返回静态页面](#1. 返回静态页面)
- [2. @RestController & @Controller & @ResponseBody](#2. @RestController & @Controller & @ResponseBody)
-
- [Spring 默认扫描路径:](#Spring 默认扫描路径:)
- [@RestController & @Controller & @ResponseBody介绍](#@RestController & @Controller & @ResponseBody介绍)
- [@RestController & @Controller & @ResponseBody用法总结:](#@RestController & @Controller & @ResponseBody用法总结:)
- [3. 返回 html片段 & 修改响应数据的 Content-Type](#3. 返回 html片段 & 修改响应数据的 Content-Type)
-
- [返回 html片段](#返回 html片段)
- [修改响应数据的 Content-Type](#修改响应数据的 Content-Type)
- [返回对象(响应的 Content-Type 默认是 JSON类型)](#返回对象(响应的 Content-Type 默认是 JSON类型))
- [设置响应数据的 状态码](#设置响应数据的 状态码)
-
- [状态码 ,不影响 页面的展示](#状态码 ,不影响 页面的展示)
- [设置 Header数据(报头)](#设置 Header数据(报头))
- 4.总结:
-
- [@RestController & @Controller & @ResponseBody用法总结:](#@RestController & @Controller & @ResponseBody用法总结:)
1. 返回静态页面
这是一个自定义的 html 文件:

文件名为 index.html
后端代码:
java
@RequestMapping("/page")
@RestController
public class PageController {
// 返回一个静态的 html 页面
@RequestMapping("/p1")
public String p1(){
return "index.html";
}
}
页面结果:

返回的是一个文本数据。
修改返回的数据
这样改,会有什么效果。
代码:
java
@RequestMapping("/page")
@RestController
public class PageController {
// 返回一个静态的 html 页面
@RequestMapping("/p1")
public String p1(){
return "/index.html";
}
}
结果:

返回的还是一个文本数据
修改注解
把 @RestController 改成 @Controller
java
@RequestMapping("/page")
//@RestController
@Controller
public class PageController {
// 返回一个静态的 html 页面
@RequestMapping("/p1")
public String p1(){
return "index.html";
}
}
结果:

返回的 "index.html" 改成 "/index.html"
代码:
java
@RequestMapping("/page")
//@RestController
@Controller
public class PageController {
// 返回一个静态的 html 页面
@RequestMapping("/p1")
public String p1(){
return "/index.html";
}
}
结果:

html页面
解释(原因):
其中涉及到这些么东西:
- index.html 和 /index.html
- @RestController & @Controller
首先,第一点:要不要加 '/',我的建议是:后端和前端,都加 '/'。
其实,返回静态页面,只有这里用的到,其他时候,都用不到。
前后端分离开发,后端不处理任何关于前端的事情。
第二点:@RestController & @Controller
@RestController & @Controller的区别,内容多,单独一个标题讲。
2. @RestController & @Controller & @ResponseBody
Spring 默认扫描路径:
代码中的资源路径,Springboot需要扫描之后,才能确定。
Springboot,有默认的扫描路径:是 启动类 所在目录及其子目录。

这是当前项目的目录及其子目录。
@RestController = @Controller + @ResponseBody

@RestController & @Controller & @ResponseBody介绍
@RestController:是一个组合注解,用于标记一个类为 RESTful 控制器。
它结合了 @Controller 和 @ResponseBody 注解的功能,使得该类中的方法默认返回的是 JSON 或 XML 格式的数据,而不是视图名称。
特点:
- 只能用于类,不能用于方法。
- 该类中的方法默认返回的是 JSON 或 XML 格式的数据,而不是视图(页面)
简单一句话总结:给类加这个注解,Springboot 会优先扫描这个类,进行加载(实际是因为 @Controller)。
@Controller :是一个用于标记类为 Spring MVC 控制器的注解。与 @RestController 不同, @Controller 通常用于返回视图名称,而不是直接返回 JSON 或 XML 数据。
特点:
- 只能用于类,不能用于方法。
- 通常用于返回视图(页面),而不是直接返回 JSON 或 XML 数据
@ResponseBody: 是一个注解,用于指示方法的返回值应该直接作为 HTTP 响应的内容,而不是解析为视图
特点:
-
能用于类,也能用于方法。
作为类注解:类中的所有方法,全都返回数据
作为方法注解:该方法,返回数据
-
不能够单独使用,需配合 @Controller
-
该类中的方法的返回值应该直接作为 HTTP 响应的内容,而不是解析为视图
@RestController & @Controller & @ResponseBody用法总结:
-
一个类中,既需要返回页面,也需要返回数据
在类当中,使用 @Controller
类的方法上面,加 @ResponseBody
-
如果一个类全部都返回数据
可以在类上,使用 @RestController 或者 @Controller + @ResponseBody
-
如果一个类全都返回视图(页面)
类上面,使用 @Controller
第三种,返回视图,我们现在很少用 了。基本上,都使用 @RestController 就行了。
特别注意: @ResponseBody不能够单独使用!!!
3. 返回 html片段 & 修改响应数据的 Content-Type
返回 html片段
我们可以通过代码,返回 html 片段:
java
@ResponseBody
@RequestMapping("/p2")
public String p2(){
return "<h1>我是一级标题</h1>";
}
页面:

这是一个 html 页面
我们的浏览器,默认的响应的 Content-Type 是 text/html
浏览器会按照这个Content-Type,去解析服务器返回的响应。
修改响应数据的 Content-Type
我们可以通过代码,手动改变浏览器,默认的响应的 Content-Type。
代码:
java
@ResponseBody
@RequestMapping(value = "/p3",produces = "text/plain")
public String p3(){
return "<h1>我是一级标题</h1>";
}
页面:

显示文本。

返回对象(响应的 Content-Type 默认是 JSON类型)
在 Springboot中,我们的响应,返回的是一个对象的时候,响应的 Content-Type 默认是 JSON类型。
代码:
java
@ResponseBody
@RequestMapping("/p4")
public User p4(){
User user = new User("张三",18,"男生");
return user;
}
页面:

这是一段 JSON数据
抓包:

为什么 返回的是一个对象的时候,响应的 Content-Type 默认是 JSON类型?
原因:方便前端人员,对返回的响应数据,进行操作。
提醒:
这里是使用 Fiddler抓取的网络数据包。
安装和使用,你可以看我的这两篇博客:
设置响应数据的 状态码
代码:
java
@ResponseBody
@RequestMapping("/p5")
public User setStatus(HttpServletResponse response){
response.setStatus(404);
return new User("张三",18,"男生");
}
抓包:

我们之前见到的 404(找不到文件资源):

这个 404 页面,是 Springboot 的页面。
这里我们需要解释一件事情:
状态码 ,不影响 页面的展示。
状态码 ,不影响 页面的展示
404 状态码,网页,这两个东西没有直接的联系。
但是,网页可以根据响应数据的状态码,进行设计。
例如:B站,状态码是 404 的页面,表示找不到资源,但是 B站 的程序员,却设计了这个页面:

设置 Header数据(报头)
以响应报头为例:
java
@ResponseBody
@RequestMapping("/p6")
public String setHeader(HttpServletResponse response){
response.setHeader("username","hhs");
return "设置 Header 成功";
}
抓包:

后续,我们开发的时候,也是可以向 Header 中添加一些属性的。
4.总结:
@RestController & @Controller & @ResponseBody用法总结:
-
一个类中,既需要返回页面,也需要返回数据
在类当中,使用 @Controller
类的方法上面,加 @ResponseBody
-
如果一个类全部都返回数据
可以在类上,使用 @RestController 或者 @Controller + @ResponseBody
-
如果一个类全都返回视图(页面)
类上面,使用 @Controller
响应数据,我们可以自行通过代码来修改。
例如:响应数据的数据格式(Content-Type),响应数据的状态码等等。
最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!