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)综合案例练习:计算器,登录

相关推荐
Remember_9932 小时前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
roman_日积跬步-终至千里2 小时前
【Java并发】用 JMM 与 Happens-Before 解决多线程可见性与有序性问题
java·开发语言·spring
独断万古他化3 小时前
【Spring 核心:AOP】基础到深入:思想、实现方式、切点表达式与自定义注解全梳理
java·spring·spring aop·aop·切面编程
好好研究3 小时前
SpringBoot整合SpringMVC
xml·java·spring boot·后端·mvc
树码小子3 小时前
SpringMVC(10)综合案例练习:计算器,登录
spring·mvc
roman_日积跬步-终至千里4 小时前
【Java并发】Tomcat 与 Spring:后端项目中的线程与资源管理
java·spring·tomcat
Remember_9934 小时前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
启山智软17 小时前
【中大企业选择源码部署商城系统】
java·spring·商城开发
m0_7400437321 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务