Spring MVC如何设置响应

2025-01-22 04:50
文章标签 spring mvc 响应 设置 java

本文主要是介绍Spring MVC如何设置响应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header...

本篇文章介绍响应相关的知识, 通过 Spring 来设置响应中的值, 向客户端返回设置好的响应.

1. 返回静态页面

我们首先使用 html 写一个前端页面, 再通过 Spring 方法, 将这个 html 页面作为响应的内容, 展示给用户.

Spring MVC如何设置响应

显然, 方法返回的只是一个字符串, 并非 html 展示的页面.

如何将 html 页面返回给客户端呢?? 这需要修改 类注解.

若方法返回的是一个页面, 则需要将原来的类注解 @RestController 修改为 @Controller.

接下来, 对涉及到的几个注解逐个进行解释.

1.1 Spring 默认扫描路径

我们知道, 每一个路径, 都对应了一个方法. 当服务器收到客户端的请求时, Spring 就会根据请求中的资源路径, 寻找该路径对应的方法, 进而计算响应结果, 最后返回响应.

而 Spring 中有大量的方法存在, 包括使用 Maven 引入的第三方库, 都存在于 Spring 中. 若android Spring 要扫描所有的方法, 一个一个的去进行比对, 确定哪个是资源路径所对应的方法的话, 那工作量是巨大的.

因此, Spring 有一个默认扫描路径: 只扫描启动类所在的目录, 及其子目录.

若请求中资源路径对应的方法, 属于启动类所在目录或子目录时, 会被 Spring 扫描到:

Spring MVC如何设置响应

而当请求中资源路径所对应的方法, 不属于启动类所在目录或子目录时, 则 Spring 不会扫描, 客户端就会显示错误:

Spring MVC如何设置响应

因此, Spring 也当然不会扫描 Maven 中第三方库中的方法.

有了默认的扫描路径, 大大降低了 Spring 的工作量, 提升了开发效率.

1.2 @RestController

虽然 Spring 有默认的扫描路径, 但是当项目很大时, 这个路径下也是会有很多的方法存在的.

于是, 可以使用 @RestController 对类进行标记, Spring 只需扫描被 @RestController 标记的类.

因此, Spring 的扫描对象为: 默认扫描路径中的类 && 使用 @RestController 进行标记的类

当默认路径下的类没有使用 @RestController 进行标记时, 那么 Spring 也不会进行扫描, 进一步减少了 Spring 的工作量.

@RestController 的特性如下:

  • 类注解. 只能对类进行使用
  • 存活于运行阶段. (整个项目运行时, 都存在)
  • 包含 @Controller 和 @ResponseBody

Spring MVC如何设置响应

其中, @Controller 表示返回的是页面. @ResponseBody 表示返回的是数据.

@RestController 也表示返回的是数据.

由于 @RestController = @Controller + @ResponseBody, 因此, 左右两侧的注解效果相同:

Spring MVC如何设置响应

1.2.1 @Controller => 返回页面

@Controller 是一个类注解(只能给类使用), 并且使用此注解标记类时, 表示该类中的所有方法(@ResponseBody 标记的方法除外, 见下文), 返回的均是页面.

Spring MVC如何设置响应

因此, 我们将类的注释修改为 @Controller, 就可以返回静态页面了:

Spring MVC如何设置响应

Spring 会以 resources.static 为该 html 文件的基准路径, 扫描指定路径下的 html 文件, 并返回该 html 构造的页面. 并且, html 文件的路径前要加上 /

Spring MVC如何设置响应

不过, 现在后端已经基本不会返回页面了.

@RequestMapping("/resp")
@Controller // 表示类中的方法只能返回页面
public class RespController {
    @ResponseBody // 该方法可以返回数据
    @RequestMapping("/r1")
    public String returnPage() {
        // 返回页面时, 一定要加上 /
        return "/index.html";
    }
}

1.2.2 @ResponseBody

@ResponseBody 既是一个类注解, 也是一个方法注解, 表示返回的是数据.

Spring MVC如何设置响应

当类注解为 @Controller 时, 类中的方法只能返回页面, 若此时我们想返回数据, 可以对方法使用 @ResponseBody 进行标记, 被标记的方法可以返回数据.

Spring MVC如何设置响应

综上, @RestController, @Controller, @ResponseBody 的使用场景如下:

  • 一个类中, 既有返回页面的方法, 也有返回数据的方法 ==> 使用 @Controller 对类标记, 对返回数据的方法使用 @ResponseBody 标记.
  • 如果一个类中所有的方法, 返回的都是数据 ==> 使用 @RestController 或者 @Controller + @ResponsjseBody 对类标记
  • 如果一个类中所有的方法, 返回的都是页面 ==> 使用 @Controller 对类标记
  • 类必须有 @Controller 注解才能被 Spring 扫描到(@RestController 包含了 @Controller)

2. 返回 HTML

默认情况下, 响应中的 Content-Type 都是 test/html, 因此, 浏览器收到数据后, 都会按照 html 的格式来解析, 最终展示在页面上.

因此, 如果我们想要给客户端返回一个 HTML 片段, 那我们无需任何操作, 直接返回 HTML 代码即可.

Spring MVC如何设置响应

// 返回 HTML 片段
    @ResponseBody
    @RequestMapping("/r3")
    public String returnHTML() {
        return "<h1>这是一个一级标题</h1>";
    }

2.1 @RequestMapping

@RequestMapping 是一个类注解, 也是一个方法注解, 既可以对类设置路径, 也可以对方法设置路径.

Spring MVC如何设置响应

此外, @RequestMapping 还有一些属性.

2.1.1 produces(修改响应的 Content-Type)

但是, 如果我们想要把这个 HTML 代码, 当做一个普通的字符串去返回, 该怎么办呢?

显然, 我们将响应的 Content-Type 类型修改为纯文本格式即可, 即: test/plain

我们可以通过修改 @RequestMapping 中的 produces 属性, 来修改 Content-Type:

Spring MVC如何设置响应

这样, 浏览器接收响应后, 就会将 Body 中的内容, 以纯文本的格式来解析, 而不是当做 HTML .

    // 返回纯文本
    @ResponseBody
    @RequestMapping(value = "/r4", produces = "text/plain") // 修改 Cjsontent-Type 为纯文本格式
    public String returnText() {
        // 当成普通字符串返回
        return "<h1>这是一个一级标题</h1>";
    }

2.1.2 其他属性

@RequestMapping 中不仅有 produces 这一属性, 还有其他属性. 通过设置这些属性值, 可以对请求或者响应中的内容做出要求:

  • method: 要求请求的方法必须是什么(如:GET, POST, ....), 否则不处理
  • params: 要求请求中必须包含哪些参数, 否则不处理
  • headers: 要求请求的 header 中必须包含哪些 header 信息, 否则不处理
  • consumes: 要求请求的 Content-Type 必须是什么, 否则不处理
  • produces: 设置响应的 Content-Type 

Spring MVC如何设置响应

3. 返回 JSON

Spring 会根据返回数据的类型, 自动对 Content-Type 进行类型的转换.

上文提到, 当返回的数据是字符串时, 默认的 Content编程-Type 是 text/html; 若想改成其他类型, 还需要手动进行转换.

但是当我们返回的数据是一个对象时, Spring 会自动将这个对象序列化为 JSON 格式, 并自动将 Content-Type 转换为 application/json:

Spring MVC如何设置响应

    // 返回 JSON
    @ResponseBody
    @RequestMapping("/r5")
    public UserInfo returnJson() {
        // 若返回的数据是一个对象
        // Spring 会自动将响应中的 Content-Type 转换为 JSON 格式
        return new UserInfo("dings", "aaa", 1);
    }

4. 设置状态码

4.1 HttpServletResponse

在后端的 Spring 项目中, 我们既可以通过 HttpServletRequest python来获取请求中的信息, 同样也可以通过 HttpServletResponse 来设置响应中的信息.

因此, 我们可以拿到 HttpServletResponse 对象, 进而通过 setStatus 方法修改响应中的状态码:

Spring MVC如何设置响应

    // 设置状态码
    @ResponseBody
    @RequestMapping("/r6")
    public String setStatus(HttpServletResponse response) {
        // 手动将响应中的状态码设置为 404
        response.setStatus(404);
        return "设置状态码成功!!";
    }

注意: 状态码不影响页面的展示!!

不管状态码是什么, 都可以返回我们自定义的内容. 至于为什么有些网站的 404 页面是一些提示内容, 因为那个界面也是维护那个网站的程序员自己代码写的.

程序员当然也可以将 404 页面打扮的很漂亮!! 比如 bilibili:

Spring MVC如何设置响应

5. 设置 Header

后端可以设置响应中的 header, 通过 header 来向客户端传递一些信息.

仍然是通过 HttpServletResponse 设置响应中的 header: 

(header 是以键值对的形式存储数据的)

Spring MVC如何设置响应

    // 设置 header
    @ResponseBody
    @RequestMapping("/r7")
    public String setHeader(HttpServletResponse response) {
        response.setHeader("myHeader", "hahaha");
        return "设置 header 成功!!";
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Spring MVC如何设置响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153175

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后