【JavaEE进阶】 关于Spring mvc 响应

文章目录

  • 🎍序言
  • 🌳 返回静态⻚⾯
  • 🌲@RestController 与 @Controller 的关联和区别
  • 🌴返回数据 @ResponseBody
  • 🎋返回HTML代码⽚段
  • 🍃返回JSON
  • 🍀设置状态码
  • 🎄设置Header
    • 🚩设置Content-Type
    • 🚩设置其他Header
  • ⭕总结

🎍序言

在博主前面写的博客 【JavaEE进阶】 Spring请求如何传递参数详解 中我们已经设置了响应数据,Http响应结果可以是数据,也可以是静态⻚⾯,也可以针对响应设置状态码, Header信息等

🌳 返回静态⻚⾯

首先我们像创建一个静态界面,创建位置如下:
在这里插入图片描述

前端代码如下:

<html>
<body>
<h1>hello word!!!</h1>
<p>this is a html page</p>
</body>
</html>

不过这里的后端的代码和以前的代码就不一样了,想要返回一个静态界面。我们这里需要将 @RestController 改为 @Controller

后端代码如下:

@RequestMapping("ct4")
@Controller
public class test_1_4 {@RequestMapping("/test1")public Object test1() {return "/index.html";}
}

访问结果如下

在这里插入图片描述

在博主前面的博文中写返回数据的时候用的是 @RestController 注解,而现在返回静态界面却用的 @Controller 。它们之间有什么区别和联系呢?

🌲@RestController 与 @Controller 的关联和区别

博主在 【JavaEE进阶】 初识Spring Web MVC 中讲了MVC模式, 后端会返回视图,这是早期时的概念

在这里插入图片描述

随着互联⽹的发展, ⽬前项⽬开发流⾏"前后端分离"模式, Java主要是⽤来做后端项⽬的开发,所以也就不再处理前端相关的内容了

MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.

所以前⾯使⽤的 @RestController 其实是返回的数据

@RestController = @Controller + @ResponseBody

  • @Controller : 定义⼀个控制器,Spring 框架启动时加载, 把这个对象交给Spring管理.
  • @ResponseBody :定义返回的数据格式为⾮视图,返回⼀个test /html信息

如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller

🌴返回数据 @ResponseBody

@ResponseBody 既是类注解,⼜是⽅法注解

如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据.

也就是说:在类上添加 @ResponseBody 就相当于在所有的⽅法上添加了 @ResponseBody 注解.

同样,如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注解,也就是当前类下所有的⽅法返回值做为响应数据

如果⼀个类的⽅法⾥,既有返回数据的,⼜有返回⻚⾯的,就把@ResponseBody 注解添加到对应的⽅法上即可

@RequestMapping("ct4")
@Controller
public class test_1_4 {@RequestMapping("/test1")public Object test1() {return "/index.html";}@RequestMapping("/test2")@ResponseBodypublic String test2() {return "返回的是数据";}
}

结果对比如下:

在这里插入图片描述

如果去掉 @ResponseBody 注解, 程序会报404错误.
在这里插入图片描述

程序会认为需要返回的是视图,根据内容去查找⽂件,但是查询不到,路径不存在,报404

🎋返回HTML代码⽚段

后端代码如下

    @ResponseBody@RequestMapping("/test3")public String test3() {return "<h1>遇事问春风乄<h1>";}

结果展示:
在这里插入图片描述
通过Fiddler观察响应结果, Content-Type 为 text/html
在这里插入图片描述

响应中的 Content-Type 常⻅取值有以下⼏种:

  • text/html : body 数据格式是HTML

  • text/css : body 数据格式是 CSS

  • application/javascript : body 数据格式是 JavaScript

  • application/json : body 数据格式是 JSON

注意:

  • 如果请求的是js⽂件, Spring MVC会⾃动设置Content-Type为application/javascript
  • 如果请求的是css⽂件, Spring MVC会⾃动设置Content-Type为 text/css

🍃返回JSON

Spring MVC 也可以返回JSON

后端⽅法返回结果为对象

    @RequestMapping("/test4")@ResponseBodypublic HashMap<String, String> test4() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;}

在这里插入图片描述

这里我们使用Fiddler观察响应结果,Content-Type 为 application/json

在这里插入图片描述

🍀设置状态码

Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码

通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置

    @RequestMapping("/test5")@ResponseBodypublic String test5(HttpServletResponse response) {response.setStatus(520);return "修改参数成功";}

在这里插入图片描述

我们可以使用Fiddler抓包进行观察状态码

在这里插入图片描述

🎄设置Header

Http响应报头也会向客⼾端传递⼀些附加信息,⽐如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type, Local等.

这些信息通过 @RequestMapping 注解的属性来实现

所以我们先来看 @RequestMapping 的源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};
}
  1. value: 指定映射的URL

  2. method: 指定请求的method类型,如GET,POST等

  3. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html;

  4. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

  5. Params: 指定request中必须包含某些参数值时,才让该⽅法处理

  6. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求

更多说明参考 Mapping Requests

🚩设置Content-Type

我们通过设置 produces属性的值, 设置响应的报头Content-Typ

    @RequestMapping(value = "/test6",produces = "application/json")@ResponseBodypublic String test6() {return "数据格式为:application/json";}

在这里插入图片描述
通过抓包观察是否设置成功
在这里插入图片描述

🚩设置其他Header

设置其他Header的话, 需要使⽤Spring MVC的内置对象

HttpServletResponse 提供的⽅法来进⾏设置

    @RequestMapping("test7")@ResponseBodypublic String test7(HttpServletResponse response) {response.setHeader("MyHeader","MyHeaderValue");return "设置Header成功";}

void setHeader(String name,String value)设置⼀个带有给定的名称和值的 header. 如果name 已经存在, 则覆盖旧的值

在这里插入图片描述

抓包观察是否成功

在这里插入图片描述

⭕总结

关于《【JavaEE进阶】 关于Spring mvc 响应》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

Python循环语句

for 循环 for循环主要用来实现固定次数的循环&#xff0c;用于将一段代码重复的执行固定次数。 比如&#xff1a;循环打印数字&#xff0c;打印1-100之间的每个整数 for i in range(100):print(i1)while 循环 while循环用于实现不知道要执行多少次的循环&#xff0c;一般需…

【hyperledger-fabric】部署和安装

简介 对hyperledger-fabric进行安装&#xff0c;话不多说&#xff0c;直接开干。但是需要申明一点&#xff0c;也就是本文章全程是开着加速器进行的资源操作&#xff0c;所以对于没有开加速器的情况可能会由于网络原因导致下载资源失败。 资料提供 1.官方部署文档在此&#…

PyTorch|transforms

在将图片输入到神经网络进行训练时&#xff0c;一般都需要对输入的图像进行预处理。对图片进行操作有很多种方法&#xff0c;这里我们使用torchvision库的transforms模块。 tansforms有很多种方法(一些可以用在张量和PIL图像&#xff0c;一些仅能用于张量&#xff0c;而另一些…

解密!电梯机房温差之谜

小伍&#xff1a;大家好&#xff0c;本次小伍带大家来到【电梯机房】&#xff0c;我们来先测一下温度 电梯机房【外屋】&#xff1a;23.2 度 小伍&#xff1a;好&#xff0c;我们再看里面的设备温度 电梯机房【外里】&#xff1a;74 度 523能源&#xff1a;哇塞&#xff0c;…

写了个在线 SQL 转换工具,支持 Oracle、Mysql、SQLServer 语句互转。

原本用户公司要迁移 oracle 到 mysql 上&#xff0c;数据库方言上有一定的区别&#xff0c;老的 SQL 又臭又长转起来也不太方便&#xff0c;尤其是日期类的完全无法适用&#xff0c;所以才写了这个工具&#xff1a;不同类型sql互转在线工具-开发者工具 可以用于不同数据库之间的…

XML解析神器:Apache Commons Digester

第1章&#xff1a;引言 大家好&#xff0c;我是小黑。今天咱们聊聊一个在现代编程中经常遇到的话题&#xff1a;XML解析。你可能知道&#xff0c;XML&#xff08;可扩展标记语言&#xff09;因其灵活性和可读性&#xff0c;在配置文件、数据交换等方面广泛使用。但是&#xff…

第一节 初始化项目

系列文章目录 第一节 初始化项目 文章目录 操作步骤 总结 操作步骤 打开cmd 输入 vue ui 在打开的网页中点击“创建”&#xff0c;复制文件夹路径并粘贴点击“在此创建新项目” 输入项目名称 点击下一步选择手动配置 选择babel、router、vuex、css pre-processors、 linter建…

(Linux)虚拟机配置固定IP

Linux操作系统的IP地址是通过DHCP服务获取的&#xff0c;也就是动态获取IP地址&#xff0c;每次重启设备后都会获取一次&#xff0c;会导致IP地址频繁变更&#xff0c;为了不频繁更新映射关系&#xff0c;我们需要IP地址固定下来。 1.在VM中配置IP地址网关和网段 打开虚拟网络…

学生成绩管理系统半成品

C语言的老师在给我们讲指针的时候&#xff0c;讲的并不深入&#xff0c;她用了一个学生成绩管理系统来引入指针这个东西并给我们讲解&#xff0c;但我觉得她的管理系统功能有一些不足&#xff0c;并且不是很美观&#xff0c;所以说心血来潮&#xff0c;自己也动手写了一个学生成…

toRefs的用法

文章目录 toRefs是什么toRefs的作用以及为什么要用它&#xff1f; toRefs是什么 toRefs 是 Vue 3 Composition API 中的一个函数&#xff0c;它用于将响应式对象转换为普通对象&#xff0c;其中对象的每个属性都是 ref 对象。这是因为在 Vue 3 中&#xff0c;reactive 创建的对…

【程序】USART串口通信接收数据(标准库带printf)

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本程序使用stm32f429作为主控&#xff0c;使用串口1&#xff0c;使用的是标准库程序版本。&#xff08;其它主控/串口x&#xff0c;实现过程类似&#xff09;。本程序亲测无误。 目录…

HubSpot集成怎么样?有哪些优势和特点?

HubSpot在集成方面表现出色&#xff0c;并为用户提供了强大的集成能力。以下是HubSpot集成的一些特点和优势&#xff1a; 1.丰富的集成生态系统&#xff1a; HubSpot拥有丰富的应用市场&#xff0c;用户可以轻松访问并集成多种第三方应用。这包括与营销、销售、客户服务等领域…

python bad case边界不准确问题

目录 问题描述 问题解决&#xff1a; 问题描述 针对bad case中&#xff0c;错误的主要原因是边界定位不准确问题&#xff0c;sub,obj抽取过短。 因此想要通过jieba分词&#xff0c;然后调用GPT4的api判断当前的新span是否符合条件。 问题解决&#xff1a; import json from…

Qt3D QGeometryRenderer几何体渲染类使用说明

Qt3D中的QGeometryRenderer派生出来的几何体类包括: Qt3DExtras::QConeMesh, Qt3DExtras::QCuboidMesh, Qt3DExtras::QCylinderMesh, Qt3DExtras::QExtrudedTextMesh, Qt3DExtras::QPlaneMesh, Qt3DExtras::QSphereMesh, Qt3DExtras::QTorusMesh, and Qt3DRender::QMesh 有球…

解决Oracle执行SQL报错SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配的问题

在Oracle数据库中,我有一条SQL需要执行,如下: SELECTCASEWHEN "i"."CODE" LIKE 1% THEN to_char(1)WHEN "i"."CODE" LIKE 2% THEN to_char(2)WHEN "i"."CODE" LIKE 3% THEN to_char(3)WHEN "i".&qu…

Vue 单文件组件的基础入门指南

本文是我2年前做的一个学习小demo&#xff0c;在这里分享一下 希望对想要学习Vue的小伙伴能有一丢丢的小帮助~_~ 1 Vue CLI Vue CLI (opens new window)是一个基于Vue.js进行快速开发的完整系统。 这里我使用 Vue CLI 生成了一个Vue项目&#xff0c;命令为&#xff1a;vue cr…

Vue3中组件常用通信方式

文章目录 一、Props二、v-model三、Provide/Inject&#xff1a;四、事件四、Ref 在 Vue 3 中&#xff0c;父子组件之间进行通信有多种方式&#xff0c;下面简单介绍下常见的方式及其用法和使用场景&#xff1a; 一、Props 用于父组件向子组件传递数据。 这是最基本也是最常用的…

算法导论复习——CHP16 贪心算法

定义 每一步都做出当前看来最优的操作。 问题引入——活动选择问题 问题描述 活动选择问题就是对给定的包含n个活动的集合S&#xff0c;在已知每个活动开始时间和结束时间的条件下&#xff0c;从中选出最多可兼容活动的子集合&#xff0c;称为最大兼容活动集合。 不失一般性&a…

Could not recognize scene type gaussian-splatting 常见报错

目录 render报错 GroupParams object has no attribute source_path Could not recognize scene type 报错代码: 默认路径代码:

微信小程序-监听屏幕滚动

实现&#xff1a; 运用页面Page()函数中的onPageScroll方法&#xff0c;来监听屏幕滚动的距离。 1&#xff09;.js中&#xff1a; data:{scrollTop:0, },//监听屏幕滚动 判断上下滚动onPageScroll: function (ev) {this.setData({scrollTop: ev.scrollTop})}, 2&#xff09…