SpringMCV(9)响应:返回静态页面 & 修改响应数据

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页面

解释(原因):

其中涉及到这些么东西:

  1. index.html 和 /index.html
  2. @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 格式的数据,而不是视图名称。

特点:

  1. 只能用于类,不能用于方法。
  2. 该类中的方法默认返回的是 JSON 或 XML 格式的数据,而不是视图(页面)

简单一句话总结:给类加这个注解,Springboot 会优先扫描这个类,进行加载(实际是因为 @Controller)。

@Controller :是一个用于标记类为 Spring MVC 控制器的注解。与 @RestController 不同, @Controller 通常用于返回视图名称,而不是直接返回 JSON 或 XML 数据。

特点:

  1. 只能用于类,不能用于方法。
  2. 通常用于返回视图(页面),而不是直接返回 JSON 或 XML 数据

@ResponseBody: 是一个注解,用于指示方法的返回值应该直接作为 HTTP 响应的内容,而不是解析为视图

特点:

  1. 能用于类,也能用于方法。

    作为类注解:类中的所有方法,全都返回数据

    作为方法注解:该方法,返回数据

  2. 不能够单独使用,需配合 @Controller

  3. 该类中的方法的返回值应该直接作为 HTTP 响应的内容,而不是解析为视图

@RestController & @Controller & @ResponseBody用法总结:

  1. 一个类中,既需要返回页面,也需要返回数据

    在类当中,使用 @Controller

    类的方法上面,加 @ResponseBody

  2. 如果一个类全部都返回数据

    可以在类上,使用 @RestController 或者 @Controller + @ResponseBody

  3. 如果一个类全都返回视图(页面)

    类上面,使用 @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抓取的网络数据包。

安装和使用,你可以看我的这两篇博客:

  1. 抓包工具:Fiddler 的安装
  2. Fiddler 的简单使用,使用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用法总结:

  1. 一个类中,既需要返回页面,也需要返回数据

    在类当中,使用 @Controller

    类的方法上面,加 @ResponseBody

  2. 如果一个类全部都返回数据

    可以在类上,使用 @RestController 或者 @Controller + @ResponseBody

  3. 如果一个类全都返回视图(页面)

    类上面,使用 @Controller

响应数据,我们可以自行通过代码来修改。

例如:响应数据的数据格式(Content-Type),响应数据的状态码等等。

最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!

下一篇博客:SpringMVC(10)综合案例练习:计算器,登录

相关推荐
爱敲代码的小鱼8 小时前
springboot(2)从基础到项目创建:
java·spring boot·spring
卓怡学长11 小时前
m315基于java的水果网上商城的开发与设计
java·数据库·spring·tomcat·maven·intellij-idea
zdl68612 小时前
springboot+全局异常处理
java·spring boot·spring
立莹Sir13 小时前
Spring Bean生命周期设计思想与源码深度剖析:从表象到本质的全面升级
java·spring·rpc
sxhcwgcy14 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
Java成神之路-15 小时前
MyBatis 开发模式演进:原生、Spring 与 Spring Boot 整合实战(MyBatis系列2)
spring boot·spring·mybatis
稻草猫.16 小时前
Spring事务操作全解析
java·数据库·后端·spring
砍材农夫16 小时前
spring-ai 第三结构化输出
java·人工智能·spring
希望永不加班16 小时前
SpringBoot 整合 MongoDB
java·spring boot·后端·mongodb·spring
卓怡学长18 小时前
m307自习室预订座位管理分析与实现
java·spring boot·spring