专业做淘宝开店的网站/网络推广培训
1. 响应
1.1 返回静态页面
创建前端页面,如下图所示:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Index页面</title>
</head>
<body>Hello,Spring MVC,我是Index⻚⾯
</body>
</html>
后端代码如下:
@RestController
@RequestMapping("/user")
public class ResponseController {@RequestMapping("/index")public String index() {return "/index.html";}
访问结果如下结果:
我们发现,直接返回了一个字符串,那么就说明Spring MVC没有识别我们返回的是一个前端页面,那么怎么让它识别出来是 /index.html 文件,而不是字符串呢?就需要把注解@RestController改为@Controller,正确代码如下:
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/index")public String index() {return "/index.html";}
}
访问127.0.0.1:8080/user/index,我们可以得到我们想要的页面,如下所示:
1.1.1 @RestController 和 @Controller
下面来讲解一下@RestController 和 @Controller之间的关联和区别
之前所说的MVC模式中后端会返回视图,这是早期的概念,但随着互联网的发展,项目流行 “前后端分离” 模式,Java主要用来做后端项目,所以也就不再处理前端相关的内容了。
如上图,MVC也随之发生改变,View不再返回视图,而是返回显示视图所需要的数据,所以前面使用的@RestController返回的就是数据。
@RestController = @Controller + @ResponseBody
@Controller:定义了一个控制器,Spring框架启动时加载,把这个对象交给Spring管理。
@ResponseBody:定义返回数据格式为非视图,返回一个text / html信息。
源码如下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController {@AliasFor(annotation = Controller.class)String value() default ""; }
故此可知: @RestController 或 (@Controller + @ResponseBody)注解返回的是前端所需要的数据,@Controller 返回的是视图。
1.2 返回数据 @ResponseBody
@ResponseBody 表示返回数据,代码如下:
@Controller
@RequestMapping("/user")
public class UserController {@ResponseBody@RequestMapping("/index1")public String index1() {return "/index.html";}}
因为加上了@ResponseBody注解,所以index方法就会把 “/index.html” 当做一个数据返回给前端,浏览器页面如下:
@ResponseBody作用在类和方法的情况说明:
@ResponseBody作用在类上,表示该类上的所有方法,返回的都是数据。
@ResponseBody作用在方法上,表面该方法返回的是数据。
1、也就是说明在类上添加注解@ResponseBody,相当于该类上所有的方法都添加了注解@ResponseBody。
2、因为@RestController = @Controller + @ResponseBody,所以如果类上添加了注解@RestController,相当于该类的所有方法都添加了注解@RestController。
3、如果一个类里面,既要返回数据,又要返回视图,那么就使用注解@Controller添加在该类上,然后需要返回数据的方法添加注解@ResponseBody,返回视图的方法就不同管它。
一个方法是返回视图,一个方法是返回数据,代码如下:
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/index")public String index() {return "/index.html";}@ResponseBody@RequestMapping("returnData")public String returnData() {return "该方法返回数据";}}
浏览器分别访问http:127.0.0.1:8080/user/index 和http:127.0.0.1:8080/user/returnData,页面分别如下:
如果returnData方法删去注解@ResponseBody,代码如下:
@RequestMapping("returnData")public String returnData() {return "该方法返回数据";}
访问结果如下:
404错误码,因为该类是注解@Controller修饰的,访问该类的方法默认返回的是视图,程序就会认为需要返回视图(returnData方法没加@ResponseBody注解),然后根据内容进行查找文件,但查询不到,也就是路径不存在,所以报错404。
1.3 返回HTML代码片段
后端返回数据时,如果数据有HTML代码,也会被浏览器解析,代码如下:
@ResponseBody@RequestMapping("/reml")public String returnHtml() {return "<h1> Hello, HTML</h1>";}
访问结果如下:
通过fiddler观察Content-Type,如图:
响应中的Content-Type常见的取值:
1、text / html:body数据格式是 HTML。2、text / css:body数据格式是 CSS。
3、application / Javascript:body数据格式是 JavaScript。
4、application / json:body数据格式是 JSON。
如果请求的是js文件,Spring MVC会自动设置Content-Type为 application / Javascript。
如果请求是css文件,Spring MVC会自动设置Content-Type为 text / css。
1.4 返回JSON
Spring MVC也可以返回JSON,后端方法返回结果为对象(下面使用Hash对象),代码如下:
@ResponseBody@RequestMapping("/returnJson")public HashMap<String, String> returnJson() {HashMap<String, String> map = new HashMap<>();map.put("key1", "value1");map.put("key2", "value2");map.put("key3", "value3");return map;}
浏览器访问之后,页面如下所示:
使用fidller抓包如下所示:
由此可见返回的数据格式是json类型;
1.5 设置状态码
Spring MVC会根据我们方法的返回结果自动设置响应状态码,我们也可以手动指定状态码,通过Spring MVC的内置对象HttpServletResponse提供的方法来进行设置。
代码如下:
@ResponseBody@RequestMapping("/setStatus")public String setStatus(HttpServletResponse response) {response.setStatus(418);return "设置状态码成功";}
访问浏览器页面显示如下:
可以看到,虽然我们设置的状态码是418,但是我们的页面依旧显示了出来,所以由此可得状态码并不影响页面的展示。
通过fiddler抓包看看,如图:
由此可知,我们的状态码设置成功了;
1.6 设置Header
Http响应报头也会向客户端传递一些附加信息,比如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type、Local等。
这些信息通过@RequestMapping注解的属性来实现,如下是@RequestMapping的源码:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective({ControllerMappingReflectiveProcessor.class})
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值,才让该方法处理请求
1.6.1 设置Content-Type
通过设置produces属性的值,可以设置响应的报头Content-Type,代码如下:
@ResponseBody@RequestMapping(value = "/setContentType", produces = "application/json")public String returnJson2() {return "{\"ok\":101}";}
只返回数据提交类型为json格式的数据才能够返回;
可以看到Postman识别出来了响应的报头Content-Type是JSON,通过fiddler抓包观察:
数据格式就是json格式,如果不进行设置produces,方法返回结果为String时,Spring MVC默认返回的text/html。
设置返回类型时,也可以同步设置响应编码,代码如下:
@ResponseBody@RequestMapping(value = "/setContentType", produces = "application/json;charset=utf-8")public String returnJson2() {return "{\"ok\":101}";}
fidller抓包如下所示:
1.6.2 设置其他Header
设置其他Header的话,需要使用 Spring MVC的内置对象HttpServletResponse提供的方法来进行设置。代码如下:
@ResponseBody@RequestMapping("/setHeader")public String setHeader(HttpServletResponse response) {response.setHeader("MyHeader", "MyHeaderValue");return "设置成功";}
访问浏览器如下所示:
void setHeader(String name, String value) 设置一个带有给定的名称和值的header。如果name已经存在,则覆盖旧的值。
fidller抓包如下所示:
ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!
本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0&vd_source=866da5be2ef0ddd213b053523da53138
————————————————
电子签名:上嘉路
相关文章:

Spring Web MVC入门(下)
1. 响应 1.1 返回静态页面 创建前端页面,如下图所示: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Index页面</title> </head> <body>Hello,Spring MVC…...

uniapp app中使用柱状图 折线图 圆环图和饼图
实现思路 借助echarts.min.js 搭配l-echart进行配置 废话不多说上代码后自己百度了解配置项的意思就好 下面代码是折线图的 ,柱状图和它一摸一样,只需要把line换成bar就好 <template><l-echart ref"chart"></l-echart> …...

jmreport测试数据库出现 权限不足,此功能需要分配角色 解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 关于jmreport的补充可看官网:jmreport上线安全配置 1. 问题所示 jmreport测试数据库出现,出现如下所示的问题:权限不足,此功能需要分配角色! 截图如下所示: 2. 原理分析 对于原理分析的Bug,代表当前用户没有足够的…...

这是啥设计模式-适配模式
有一个广告召回系统,输入用户id就可以给用户推荐相应的广告,一开始我们只有布尔检索和向量检索两种方式。 1. 面向接口编程,而非实现 第一点就是定义接口,客户端关注的是接口,对客户端来说,他只关心检索引…...

大语言模型(LLMs)Tokenizers详解
Tokenizers是大语言模型(Large Language Models,LLMs)中用于将文本分割成基本单元(tokens)的工具。这些工具不仅影响模型的输入表示,还直接影响模型的性能和效率。以下是对Tokenizers的详细解释:…...

分支-快排/归并---1
目录 1.排序数组 2.数组中的第K个最大元素 3.最小k个数 4.排序数组(归并) 5.数组中的逆序对 6.计算右侧小于当前元素的个数 7. 翻转对 1.排序数组 快排的写法有很多,这里我采取了相对快的三路划分加随机基准值。 三路划分,是…...

代码随想录训练营 Day32打卡 动态规划 part01 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
代码随想录训练营 Day32打卡 动态规划 part01 一、 理论基础 动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。 例如:有N件物品和一个最多能背重量为W 的背包…...

【智能流体力学】剖析ANSYS Fluent材料属性设定与边界条件
目录 一、材料属性设定**1. 材料属性的概述****功能****2. 材料属性的类型****标准材料库****多相流****燃烧模型****传热模型****辐射模型****3. 属性设置与函数****4. 自定义材料数据库****5. Granta数据库支持**二、边界条件**1. 通用边界条件****Pressure Inlet (压力-入口…...

微信小程序反编译工具
目录 介绍 工程结构还原 微信开发者工具运行 如何查看当前运行版本? 开启小程序F12 重新打包运行 效果示例 安装 用法 参数说明 获取微信小程序AppID 文件夹名即为AppID 下载地址 介绍 纯Golang实现,一个用于自动化反编译微信小程序的工具,小程序安全利器, 自…...

线程基本概念
一、进程的结束 wait(阻塞) 一般不做额外的事情 wait(非阻塞) 逻辑不受影响(必须套在循环中) wait作用:1.获取子进程退出状态 2.回收资源 传参为指针:被调修改主调 获取退出状态值: WIFEXITED 判断是否…...

在SpringBoot中执行后台任务
在 Spring Boot 中执行后台任务通常涉及到使用线程池和定时任务。Spring Boot 提供了多种方式来实现后台任务,包括使用 Scheduled 注解、ThreadPoolTaskExecutor 和 ExecutorService。 下面我将详细介绍如何使用这些方法来实现后台任务。 使用 Scheduled 注解 Sp…...

【网络】UDP回显服务器和客户端的构造,以及连接流程
回显服务器(Echo Server) 最简单的客户端服务器程序,不涉及到业务流程,只是对与 API 的用法做演示 客户端发送什么样的请求,服务器就返回什么样的响应,没有任何业务逻辑,没有进行任何计算或者…...

【智能流体力学】ANSYS Fluent工作流程设置、求解和后处理详解
目录 一、设置阶段1. **模型****功能** :**详细说明及原理** :2. **材料****功能** :**详细说明及原理** :3. **单元区域条件****功能** :**详细说明及原理** :4. **边界条件****功能** :**详细说明及原理** :5. **网格交界面****功能** :**详细说明及原理** :6. **动…...

最新UI六零导航系统源码 | 多模版全开源
六零导航页 (LyLme Spage) 致力于简洁高效无广告的上网导航和搜索入口,支持后台添加链接、自定义搜索引擎,沉淀最具价值链接,全站无商业推广,简约而不简单。 使用PHPMySql,增加后台管理 多模板选择,支持在…...

K8S中使用英伟达GPU —— 筑梦之路
前提条件 根据不同的操作系统,安装好显卡驱动,并能正常识别出来显卡,比如如下截图: GPU容器创建流程 containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvid…...

2024-2025年最值得选的Java计算机毕业设计选题大全:800个热门选题
一、前言 博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ…...

libnl教程(2):发送请求
文章目录 前言示例示例代码构造请求创建套接字发送请求 简化示例 前言 前置阅读要求:libnl教程(1):订阅内核的netlink广播通知 本文介绍,libnl如何向内核发送请求。这包含三个部分:构建请求;创建套接字;发送请求。 …...

【软件测试】功能测试理论基础
目录 项目的测试流程🏴 需求评审 评审形式 测试人员在需求评审中职责 测试计划与方案 测试计划 问题 测试方案🏴 测试计划与方案的对比 功能测试设计🏴 测试设计的步骤 项目的测试流程🏴 作用: 有序有效开展…...

玩机进阶教程-----回读 备份 导出分区来制作线刷包 回读分区的写入与否 修改xml脚本
很多工作室需要将修改好的系统导出来制作线刷包。前面分享过很多制作线刷包类的教程。那么一个机型中有很多分区。那些分区回读后要写入。那些分区不需要写入。强写有可能会导致不开机 不进系统的故障。首先要明白。就算机型全分区导出后在写回去 都不一定可以开机进系统。那么…...

MongoDB 插入文档
MongoDB 插入文档 MongoDB 是一个流行的 NoSQL 数据库,它使用文档存储数据。在 MongoDB 中,数据以 BSON(Binary JSON)格式存储,这是一种二进制表示的 JSON 格式。MongoDB 提供了灵活的数据模型,使得插入和查询文档变得非常简单。本文将详细介绍如何在 MongoDB 中插入文档…...

【内网】服务器升级nginx1.17.0
今天用rpm包升级内网nginx版本,上来就给我报错 警告:nginx-1.27.0-2.el7.ngx.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 7bd9bf62: NOKEY 错误:依赖检测失败: libcrypto.so.10()(64bit) 被 nginx-1:1.27.0-2.el7.ngx.x…...

歌曲爬虫下载
本次编写一个程序要爬取歌曲音乐榜https://www.onenzb.com/ 里面歌曲。有帮到铁子的可以收藏和关注起来!!!废话不多说直接上代码。 1 必要的包 import requests from lxml import html,etree from bs4 import BeautifulSoup import re impo…...

transformer-explainer
安装和启动 找到这个项目,然后装好了。 这个项目的目的如名字。 https://github.com/poloclub/transformer-explainerTransformer Explained: Learn How LLM Transformer Models Work with Interactive Visualization - poloclub/transformer-explainerhttps:/…...

C#中的S7协议
S7协议-S7COMM S7COMM 进行写 CTOP->PDU type已知枚举值 0X0E连接请求0x0d连接确认0x08断开请求0x0c断开确认0x05拒绝访问0x01加急数据0x02加急数据确认0x04用户数据0x07TPDU错误0x0f数据传输 S7Header->ROSCTR已知枚举值 0X01JOB REQUEST。主站发送请求0x02Ack。从站…...

2024-08-16升级记录:使用Android RecyclerView控件显示列表型信息
在页面上使用RecyclerView实现一个列表型信息展示: 步骤如下: 一、在页面布局中添加RecyclerView控件 <TextViewandroid:id"id/txt_gnss_info"android:layout_width"match_parent"android:layout_height"wrap_content"…...

通义千问 ( 一 ) 基础实例
1.相关概念 1.1.模型与平台 1.1.1.通义千问 通义千问 : 是阿里云研发的大语言模型;用于理解和分析用户输入的自然语言,在不同领域和任务为用户提供服务和帮助。 具体应用场景如下: 文字创作:撰写故事、公文、邮件、剧本和诗歌…...

docker 修改数据目录
1.停止 Docker 服务 sudo systemctl stop docker sudo systemctl stop docker.socket2.复制数据目录 sudo cp -rp /var/lib/docker /data/ 或 # sudo rsync -aP /var/lib/docker/ /data/docker/3.修改 Docker 配置 编辑 Docker 的配置文件,设置新的数据目录&#…...

r4s软路由写入iStoreOS镜像
需要用到的工具: 1、r4s软路由 2、32G及以上的TF卡 3、TF卡读卡器 4、镜像写入软件(推荐Etcher,下载地址:https://github.com/balena-io/etcher/releases/download/v1.19.21/balenaEtcher-1.19.21.Setup.exe) 5、…...

[C++][opencv]基于opencv实现photoshop算法灰度化图像
测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 BlackWhite.hpp #ifndef OPENCV2_PS_BLACKWHITE_HPP_ #define OPENCV2_PS_BLACKWHITE_HPP_#include "opencv2/core.hpp"namespace cv {class BlackWhite { public:float red; //红色的灰度系…...

Emacs23.x版本之重要特性及用法实例(一百五十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…...