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 IOC的三种实现方式详解

《SpringIOC的三种实现方式详解》:本文主要介绍SpringIOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入... 目录1. 构造器注入(Cons编程tructor Injection)2. Setter注入(Setter

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时