Spring MVC 如何返回响应

news2025/1/11 17:02:34

上期我们讲请求的时候,每个方法返回的数据就是响应,我们也可以返回一个静态页面,设置响应的状态码,Header信息等。

1. 返回静态页面

我们先在项目的static文件夹下创建一个HTML文件作为我们返回的页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>response1</h1>
</body>
</html>

写一个方法返回该html:

@RequestMapping("/Response")
@RestController
public class ResponseController {
    @RequestMapping("/response1")
    public String response1() {
        return "/response1.html";
    }
}

我们用浏览器访问这个接口:

和我们的预期不同,并没有返回页面,而是把 /response1.html 当作数据返回了。

这里我们需要说到@RestController 这个注解:

我选中@RestController 按下 ctrl+B跳转到注解的源码位置:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented

这三个注解称为元注解,用来注解其他注解的注解:

  1. @Target 注解用于指定被修饰的注解可以应用的范围,它包含一个 ElementType 类型的数组参数。常见的 ElementType 包括 TYPE(类、接口、枚举)、FIELD(字段)、METHOD(方法)等。通过在自定义注解上使用 @Target 注解,可以限定该注解可以修饰的程序元素类型。例如这里表示只能用来注解类
  2. @Retention 注解用于指定被修饰的注解的生命周期,它包含一个 RetentionPolicy 类型的参数,常见的值包括 SOURCE(源码级别保留,编译时丢弃)、CLASS(编译时保留,运行时丢弃)、RUNTIME(运行时保留)。通过在自定义注解上使用 @Retention 注解,可以控制该注解的保留策略。
  3. @Documented 注解标记另一个注解,表示该注解应该包含在 Javadoc 中。如果一个自定义注解使用了 @Documented 注解修饰,那么当使用该注解修饰其他程序元素时,这些元素会在生成的文档中包含该注解的信息。

@Controller

  • @Controller 表示被 @RestController 注解修饰的类是一个控制器。前面我们讲Spring MVC 入门的时候提到过:

 @ResponseBody

  • @ResponseBody 表示该控制器的方法返回的结果将直接作为响应体发送给客户端,而不进行页面跳转或模板渲染,这里相当于被 @RestController 注解修饰的类的所有方法都被加上了@ResponseBody注解,也就解释了为什么没有返回页面。 

综上所述:@RestController注解就相当于 @Controller @ResponseBody这两个注解

所以我们可以把@RestController注解 改为 @Controller 注解,就能返回一个静态页面了:

@RequestMapping("/Response")
@Controller
public class ResponseController {
    @RequestMapping("/response1")
    public String response1() {
        return "/response1.html";
    }
}

注意 返回页面时以static为当前页面,斜杠(/)不可省略

由于现在流行前后端分离模式,后端项目是没有视图的,也就不负责返回视图,后端只返回数据即可,所以才有了@RestController

如果在@Controller 注解修饰下的类要返回数据需要给对应方法加上@ResponseBody

在@RestController注解中,"REST" 的含义是 Representational State Transfer,即"表述性状态转移"。REST 是一种软件架构风格,它是一种设计和开发网络应用程序的方式,旨在促进系统之间的互操作性和可伸缩性。

2. 返回HTML代码片段

返回HTML代码片段,我们直接按照返回数据的方式返回HTML代码即可

@RequestMapping("/Response")
@Controller
public class ResponseController {
    @ResponseBody
    @RequestMapping("/response2")
    public String response2() {
        return "<h1>这是一个HTML代码片段<h1>";
    }
}

Spring会根据返回的结果自动设置Content-Type

3. 返回JSON

返回一个对象时默认情况下 Spring MVC 会将这个对象转换为 JSON 格式,并设置响应头的 Content-Type 为 application/json。

    @ResponseBody
    @RequestMapping("/response3")
    public Map<String, String> response3() {
        Map<String, String> map = new HashMap<>();
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        map.put("k4", "v4");
        return map;
    }

4. 设置状态码

Spring 会根据我们的方法的返回结果自动设置响应状态码,我们也可以手动指定状态码:

    @ResponseBody
    @RequestMapping("/response4")
    public String response4(HttpServletResponse response) {
        response.setStatus(418);
        return "设置状态码成功";
    }

HttpServletResponse 和HttpServletRequest对应,代表响应,包含响应中的全部内容。

可以看到状态码被设置成了418

5. 设置Header

Http的响应报头也可以传递一些信息,如Content-Type,Local等,这些信息通过@RequestMapping 注解的属性来实现,我们先看看@requestMapping 的源码:

  • @Target({ElementType.TYPE, ElementType.METHOD}):指定了该注解可以应用在类和方法上。
  • @Retention(RetentionPolicy.RUNTIME):指定了该注解会在运行时保留,因此可以通过反射机制来访问注解信息。
  • @Documented:表示该注解应该被包含在 Java 文档中。
  • @Mapping:这是一个元注解,表示该注解是一个映射注解,用于将请求映射到处理器方法。
  • @Reflective({ControllerMappingReflectiveProcessor.class}):指定了该注解在处理时会使用 ControllerMappingReflectiveProcessor 进行反射处理。
  • String name() default "":用于指定映射的名称。
  • @AliasFor("path") String[] value() default {}:用于指定映射的路径,同时通过 @AliasFor 注解将 value() 方法和 path() 方法关联起来,表示它们具有相同的含义。
  • RequestMethod[] method() default {}:用于指定请求的 HTTP 方法类型,如:GET/POST
  • String[] params() default {}:用于指定请求需要满足的参数条件。
  • String[] headers() default {}:用于指定请求需要满足的请求头条件。
  • String[] consumes() default {}:用于指定处理请求的请求体(Content-Type)类型。
  • String[] produces() default {}:用于指定处理请求的响应体(Accept)类型。

示例:指定请求方法的类型

    @ResponseBody
    @RequestMapping(value = "/response5" , method = RequestMethod.GET)
    public String setMethod() {
        return "接收请求成功";
    }

指定只能接收GET请求:

 

设置响应返回的类型 :

    @ResponseBody
    @RequestMapping("/response6")
    public String setContentType() {
        return "\"Key\", 200";
    }

不进行设置时 Content-Type时text/plain

    @ResponseBody
    @RequestMapping(value = "/response6", produces = "application/json")
    public String setContentType() {
        return "\"Key\", 200";
    }

设置为JSON:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OLAP与数据仓库和数据湖

OLAP与数据仓库和数据湖 本文阐述了OLAP、数据仓库和数据湖方面的基础知识以及相关论文。同时记录了我如何通过ChatGPT以及类似产品&#xff08;通义千问、文心一言&#xff09;来学习知识的。通过这个过程让我对于用AI科技提升学习和工作效率有了实践经验和切身感受。 预热 …

粤嵌6818嵌入式开发入门教程

学习目标 1.了解嵌入式开发 2.开发环境的搭建 3.Linux操作系统的基本操作 一、了解嵌入式开发 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 1.嵌入式可以干…

再见 Pandas,又一数据处理神器

cuDF介绍 cuDF是一个基于Apache Arrow列内存格式的Python GPU DataFrame库&#xff0c;用于加载、连接、聚合、过滤和其他数据操作。cuDF还提供了类似于pandas的API。 GitHub&#xff1a; https://github.com/rapidsai/cudf Documentation&#xff1a; https://docs.rapids.a…

基于springboot+vue的大学生就业需求分析系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2.亿级积分数据分库分表:增量数据同步之代码双写,为什么没用Canal?

1.亿级积分数据分库分表&#xff1a;总体方案设计 上一篇博客中写了一下积分数据分库分表的总体方案设计&#xff0c;里面说了采用应用程序代码双写的方式实现的增量数据同步&#xff0c;本篇就对这一块进行一些细化的介绍&#xff0c;包括&#xff1a; 为什么不用Canal监听数…

WebServer -- 八股(终章)

&#x1f442; Honey Honey - 孙燕姿 - 单曲 - 网易云音乐 目录 &#x1f33c;触类旁通 &#x1f6a9;线程 && 进程 线程与进程的区别 多线程锁是什么 进程 / 线程 / 协程 的区别 线程切换时&#xff0c;需要切换的状态 &#x1f382;并发 && 并行 并…

一起玩儿3D打印机——03 Marlin固件的获取和安装环境的配置

摘要&#xff1a;本文介绍Marlin固件的获取和安装环境的配置 Marlin是一款开源软件&#xff0c;其主页为&#xff1a;https://marlinfw.org/&#xff0c;首页正中就是下载连接&#xff0c;如下图所示&#xff1a; 单击下面的“Download Marlin 2.1.2.2”按钮就会进入下载页面&a…

Transformer学习笔记(一)

一、预训练 1、图像领域的预训练 通过 ImageNet 数据集我们训练出一个模型 A由于 CNN 的浅层学到的特征通用性特别强&#xff0c;我们可以对模型 A 做出一部分改进得到模型 B&#xff08;两种方法&#xff09;&#xff1a; 冻结&#xff1a;浅层参数使用模型 A 的参数&#x…

postgres中的hook机制

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14,13,12,11 文档用途 1.了解使用postgres中的hook机制&#xff0c;在不更改内核代码的前提下完成一些定制化需求&#xff1b; 2.从底层理解插…

Visual Studio 2022 出现:E1696无法打开 源 文件 “stdafx.h“;E0020未定义标识符 “_TCHAR“错误解决办法

今天在用自己电脑上的visual studio2022写并行计算实验报告时出现了这种错误&#xff0c;但我在机房电脑vs2010版本运行时没有任何问题&#xff0c;于是我在网上找了解决办法&#xff0c;现总结如下。 1.报错E1696无法打开 源 文件 "stdafx.h"&#xff0c;解决办法&a…

移动通信网络AT指令

AT 命令是用来控制 TE(如 PC 等用户终端)和 MT(如移动台等移动终端)之间交互 的规则 AT 命令的返回值包括两部分,响应信息和结果码。 PLMN 移动通信网络PLMN = MCC + MNC,PLMN由MCC移动国家码和MNC移动网络码组成,例如:中国移动GSM的PLMN为:46000(MCC:460, M…

Internet Download Manager(IDM下载) v6.42.3 绿色版介绍

互联网下载管理器是一个广泛使用的软件&#xff0c;它可以帮助用户更好地管理和加速他们的下载。最新版本v6.42.3已经发布&#xff0c;它带来了一系列新功能和改进&#xff0c;让用户更加方便和快速地下载他们需要的文件。 新版本的互联网下载管理器增加了对最新浏览器的支持&…

通过键盘对机械臂进行操作

1 #include<myhead.h>2 #include<linux/input.h>3 #define SER_PORT 88884 #define SER_IP "192.168.116.225"5 #define CLI_PORT 99996 #define CLI_IP "192.168.65.129"7 int main(int argc, const char *argv[])8 {9 //1、创建用于连接…

题目:特殊的三角形(蓝桥OJ 3008)

问题描述&#xff1a; 解题思路&#xff1a; 可以先求出1~1e6每个位置是否有解&#xff0c;后计算前缀和再求出不同区间的和。&#xff08;时间复杂度小&#xff09; 进行dfs操作&#xff1a;依次组合1~1e6所有元素。并计算每一个组合的乘积&#xff0c;在该乘积位置的cnt加一。…

2024.3.15

1.单向循环链表 代码&#xff1a; #include"loop.h" //创建单向循环链表 loop_p create_loop_list() {loop_p H (loop_p)malloc(sizeof(loop));if(HNULL){printf("空间申请失败\n");return NULL;}H->len0;H->nextH;return H; } //创建节点 loop_p…

AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信&#xff0c;它可以使用JSON、XML、HTML和text文本等格式发送和接收数据&#xff0c;AJAX最吸引人的就是它的异步特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#xff0c;…

2024全国水科技大会-协办单位:海南立昇净水科技实业有限公司

海南立昇净水科技实业有限公司 集膜技术研发、生产和销售服务于一体的集团型高科技企业。30年来一直专注于“膜”技术研发&#xff0c;始终坚持走自主科技创新之路。在国内构建起由26家直属分公司和超过500家经销代理商组成的营销服务网络&#xff0c;立昇净水设备被广泛应用于…

前端学习之css伪元素选择器

伪元素选择器 &#xff08;注释是对各个内容的解释与理解&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>伪元素选择器</title><!-- 双冒号开头一般都称为伪元素&#xff0c;…

STL容器之list类

文章目录 STL容器之list类1、list的介绍2、list的使用2.1、list的常见构造2.2、list的iterator的使用2.3、list空间增长问题2.4、list的增删查改2.5、list迭代器失效问题 3、list的模拟实现&#xff08;含反向迭代器&#xff09; STL容器之list类 1、list的介绍 list是序列容器…

C++初阶:1_C++入门

C入门 零.本节知识点安排目的 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff1a; 补充C语言语法的不足&#xff0…