当前位置: 首页 > article >正文

【JavaEE进阶】SpringMVC 响应

目录

🎍前言

🌳 返回静态页面

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

🌴返回数据 @ResponseBody

🎋返回HTML代码片段

🍃返回JSON

🍀设置状态码

🎄设置Header

🚩设置Content-Type

🚩设置其他Header


🎍前言

在我们前⾯的代码例⼦中,我们返回的是数据,并不是页面

Http响应结果可以是数据,也可以是静态页面,也可以针对响应设置状态码,Header信息等.

🌳 返回静态页面

首先先创建一个静态页面,前端代码位置如下:

注意:创建好前端代码之后,右侧有对应的浏览器访问,不要通过此处访问

编写前端代码:

假如此时点击右侧的Chrome浏览器访问:观察浏览器的中http请求,这个请求表示去找到了本地的63342端口号,这个端口号是idea进程,也就是说它是把这个请求交给了idea,通过idea去访问

正确访问方式:运行代码,通过这样的方式来访问,这是把请求交给了Tomcat

这个访问路径是从根目录往下开始访问,static就是根目录,若是一下这种路径就是 /aa/index.html

上述一系列过程也是在访问前端页面,并不是通过后端返回页面,接下来就开始讲述后端返回页面

返回上述的index.html页面

代码:通过接口来返回页面

发送请求:我们希望返回的是页面,当前确实一个字符串,显然不符合预期

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

代码:

index.html路径:

发送请求:此时就返回成功了

若在返回页面前不加上斜杠(/),会报404:

发送请求:

改变index.html的路径:

发送请求:还是上述未加斜杠(/)的代码,此时发现返回成功了

区别:

若返回页面中加上 / ,可理解为是一个绝对路径,不加 / 可理解为是一个相对路径,相对与当前response所在的路径,建议加上 / .

上述还把@RestController 改为 @Controller,那不改行不行?

代码:发现还是不行

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

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

在前面的文章说,当时把@RestController简单的理解为是打个标签,其实这里的@Controller也可简单的理解为也是打了个标签,只是打的不同的标签。

在前面讲述了MVC模式,后端会返回视图,这是早期时的概念

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

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

所以前⾯使⽤的@RestController表示返回数据,当前的@Controller表示返回视图

查看@RestController的源码:发现在里面使用了@Controller

@RestController = @Controller + @ResponseBody

@ResponseBody表示响应正文,也就是返回数据,那么@RestController能够返回数据就是@ResponseBody起到的作用。

所以之前的代码中的@RestController完全的可以替换为@Controller + @ResponseBody,那么相当于是@Controller这个注解才是打了个标签(当前对象交给了Spring进行管理)。

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

🌴返回数据 @ResponseBody

@ResponseBody 既是类注解,又是方法注解

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

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

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

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

代码:

发送请求对比结果:

由于现在后端不会管前端,所以一般还是返回数据

🎋返回HTML代码片段

由于返回的是前端代码,只能当做数据来返回

代码:

发送请求:

通过Fiddler抓包查看响应信息:观察发现Content-Type类型 为 text/html,返回的是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,返回JSON,首先它也是返回数据

后端⽅法返回结果为对象

代码:

发送请求:

Fiddler抓包:Content-Type 为 application/json,即后端返回的是对象,Spring会自动转为Json(返回稍微有点结构的,比如对象,Map等)

🍀设置状态码

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

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

代码:

发送请求:

Fiddler抓包查看响应:

注意状态码不影响页面的显示,并不是说设置了404页面就会报404。

🎄设置Header

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

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

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

  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值,才能让该⽅法处理请求

🚩设置Content-Type

未设置Content-Type,返回一个Json,

代码:

发送请求:

Fiddler抓包查看响应:Content-Type类型为text/html,即返回的是字符串,并非JSON,对于前端而言是不一样的,一个是字符串,一个是对象

设置Content-Type:

代码:

发送请求:设置之后浏览器显示结果就是JSON

Fiddler抓包查看响应:

还可以设置它的编码:直接Content-Type的值后面,可理解为它也是Content-Type的值

代码:

Fiddler抓包查看响应:

🚩设置其他Header

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

HttpServletResponse 提供的⽅法来进⾏设置,这里也可以设置Content-Type,和上述是一样的

代码:

发送请求:

Fiddler抓包查看响应:

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


http://www.kler.cn/a/504891.html

相关文章:

  • 【数模学习笔记】插值算法和拟合算法
  • 深入了解生成对抗网络(GAN):原理、实现及应用
  • (STM32笔记)十二、DMA的基础知识与用法 第二部分
  • vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动
  • 每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能
  • 【Linux 之一 】Linux常用命令汇总
  • 代码随想录算法训练营第三十四天-动态规划-63. 不同路径II
  • vue运用uniapp框架开发企业微信小程序中常用的一些基础方法
  • C#,入门教程(27)——应用程序(Application)的基础知识
  • JavaScript:模版字符串
  • scons通用构建_生成方法Command
  • 向量数据库如何助力Text2SQL处理高基数类别数据
  • 更新用户密码功能
  • 解决nginx: [emerg] unknown directive “stream“ in /etc/nginx/nginx.conf问题 --九五小庞
  • LeetCode | 解锁数组与字符串的秘密:经典题型详解与高效解法
  • 20250113面试鸭特训营第21天
  • STLG_01_12_程序设计C语言 - 联合体和枚举类型
  • 【AIGC-ChatGPT进阶提示词指令】智慧母婴:打造基于成长树的儿童发展引导系统
  • 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操解析
  • PPPLib源码阅读
  • 「蓝桥杯题解」数字接龙
  • 石化煤矿智能化转型“硬通货”,遨游防爆手机如何面面俱到?
  • Vue2+OpenLayers实现车辆开始、暂停、重置行驶轨迹动画(提供Gitee源码)
  • UART 串口的全双工模式与 SPI 的全双工模式的区别
  • 达梦数据库数据迁移(mysql迁移到达梦)
  • 4种革新性AI Agent工作流设计模式全解析