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

【Spring】Spring MVC请求响应

文章目录

  • 1. 请求
    • 1.1 传递单个参数
    • 1.2 传递多个参数
    • 1.3 传递对象
    • 1.4 后端参数重命名
    • 1.5 传递数组
    • 1.6 传递集合
    • 1.7 传递JSON对象
    • 1.8 获取URL中参数
    • 1.9 上传⽂件
    • 1.10 获得Cookie
    • 1.11 获得Session
    • 1.12 获得Header
  • 2. 响应
    • 2.1 返回静态界面
    • 2.2 返回数据
    • 2.3 返回HTML代码片段
    • 2.4 返回JSON
    • 2.5 设置状态码

1. 请求

访问不同的路径, 就是发送不同的请求。在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收。
传递参数,我们通过postman测试。

1.1 传递单个参数

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m1")public String m1(String name){return "name: " + name;}
}    

正常传递:
单个参数
可以看到, 后端程序正确拿到了name参数的值。
Spring MVC 会根据⽅法的参数名, 找到对应的参数, 赋值给⽅法。
所以这里要注意,传递的参数要和后端代码中的参数一致。
那不一致会出现什么现象呢?我们直接测试,如图:
no
可以发现是获不得参数的,name依旧为空。
这里还需要注意,参数的类型如果不是包装类(boolean),参数必须传,不然会报500错误,类型也要一致,不然会报400错误。
对于参数可能为空的数据,建议使⽤包装类型。

把参数类型修改为int:

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m1")public String m1(int n){return "n = " + n;}
}    

500
500
400
400

1.2 传递多个参数

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m2")public String m2(String name, Integer age){return "name: " + name + ", age: " + age;}
}    

正常传递:
多参
参数要一致,但是它们顺序可以调换。 要求和单个参数一样的。
多换
但是可以发现这种还是有弊端,就是当增加新的参数,修改代码会非常麻烦,这个时候就可以把这些参数封装成对象,当增加新的参数,只需要多封装个属性。

1.3 传递对象

创建Person类:

package com.example.demo;public class Person {private String name;private int age;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", password='" + password + '\'' +'}';}
}

这个时候,传递对象代码:

public class ParamController {@RequestMapping("/m4")public String m4(Person person){return person.toString();}
}

正常传参:
对象
当传参后,后端代码拿到对应的参数,Spring 会根据参数名称⾃动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则
赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0)。
如果增加新的参数,只需要修改Person中代码,变得更加简单。

1.4 后端参数重命名

有时,前端参数的名字,我们想做出修改,让它更加的方便区分,这个时候就用到@RequestParam ,这个注解可以后端参数映射为其他名。
修改m2方法。

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m2")public String m2(@RequestParam("name") String myName, @RequestParam("age") Integer myAge){return "name: " + myName + ", age: " + myAge;}
}    

相同请求不受影响:
参数改
映射后要注意,映射的参数会变成必传参数。
参数不传:
不传

但也可以改变,查看@RequestParam源码:
@RequestParam源码
发现required默认值为true,含义就是它修饰的参数为必传,那么只要修改它的返回值即可
如下面代码,这时就不是比传参数。

public String m2(@RequestParam(value = "name",required = false) String myName, @RequestParam(value = "age", required = false) Integer myAge){return "name: " + myName + ", age: " + myAge;}

1.5 传递数组

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m5")public String m5(String[] array){return Arrays.toString(array);}
}

传参:
数组
我们可以使用, 直接分割。

1.6 传递集合

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m6")public String m6(@RequestParam List<String> list){return list + "";}
}

当用postman传参:
集合
可以正常请求,但是当使用浏览器时,有时要进行转义编码。
例如:, 转义为%2c。
且需要使⽤ @RequestParam 绑定参数关系。
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤@RequestParam绑定参数关系。

1.7 传递JSON对象

    @RequestMapping("/m7")public String m7(@RequestBody Person person){return person.toString();}

接收JSON对象, 需要使⽤ @RequestBody 注解。
RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中。
不使用注解将无法赋值。
传递参数:
在这里插入图片描述
这时,请求类型就是JOSN。
JOSN

1.8 获取URL中参数

    @RequestMapping("/m8/{age}/{name}")public String m8(@PathVariable Integer age, @PathVariable("name") String useName){return "解析参数: " + age + ", name: " + useName;}

传参:
路径
@PathVariable:这个注解主要作⽤在请求URL路径上的数据绑定。
如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋值, 如上述例⼦中的id变量。
如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值,如上述例⼦中的userName变量。

1.9 上传⽂件

    @RequestMapping("/m9")public String m9(@RequestPart("file") MultipartFile file) throws IOException {//获得文件名称String s = file.getOriginalFilename();//上传到指定路径file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));return s;}

传参:
文件
上传文件:
在这里插入图片描述
D:\temp中:
在这里插入图片描述
上传文件要使用@RequestPart注解,注解中参数要和传的参数名一致。

1.10 获得Cookie

    @RequestMapping("/m10")public String m10(HttpServletRequest request){//获得所有CooikeCookie[] cookies = request.getCookies();//打印StringBuilder stringBuilder = new StringBuilder();if(cookies != null){for (Cookie cookie: cookies) {stringBuilder.append(cookie.getName() + " : " + cookie.getValue());}}return "Cookie: " + stringBuilder;}

上面是Servlet获得Cookie的方式,因为Spring MVC是基于Servlet API实现的Web框架,所以HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可。
Servlet Cookie
响应结果并没有Cookie,这是因为网站中并没有Cookie,直接在postman中添加Cookie即可。
添加Cookie

通过这个也可以看出,Cookie是可以伪造的,后端收到Cookie要进行校验。

上面方式也可以通过注解@CookieValue 简化,简化后的代码如下。

    @RequestMapping("/getCookie")public String getCookie(@CookieValue String xiaochen){return "name: " + xiaochen;}
}

1.11 获得Session

    @RequestMapping("/setSession")public String setSession(HttpServletRequest request){HttpSession session = request.getSession();if(session != null){session.setAttribute("name","java");}return "存储成功";}

Session在服务端,所以无法直接添加,可以通过上述方式。
HttpSession getSession(boolean create) : 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null 。默认为true。
void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话。
session
通过Fiddler观察Http请求和响应情况:
Fiddler
获得Session方法和获得Cookie一样有很多种,通常使用下面简单的两种。

HttpSession session = request.getSession();
Session 不存在的话, 会⾃动进⾏创建。

    @RequestMapping("/getSession1")public String getSession(@SessionAttribute(required = false) String name){return "name: " + name;}@RequestMapping("/getSession2")public String getSession2(HttpSession session){String name = (String) session.getAttribute("name");return "name: " + name;}

1.12 获得Header

    @RequestMapping("/getHeader")public String getHeader(@RequestHeader("User-Agent") String useragent){return useragent;}

使用@RequestHeader 注解即可获得。
header

2. 响应

在我们前⾯的代码例⼦中,都已经设置了响应数据, Http响应结果可以是数据, 也可以是静态⻚⾯,也可以针对响应设置状态码, Header信息等。

2.1 返回静态界面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Index页面</title>
</head>
<body>Hello,Spring MVC.
</body>
</html>

前端代码,注意文件位置。
位置

后端返回代码如何写呢?先按照响应的模式写,代码如下。

@RequestMapping("/return")
@RestController
public class ReturnController {@RequestMapping("/index")public String returnIndex(){return "/index.html";}
}

直接返回,运行查看:
indexno
这很不明显不对,这是返回了一个字符串。
这时,就需要另一个注解了,我们需要把最前面的@RestController 改为 @Controller。
更换
再次请求,便可以得到我们想要的结果:
在这里插入图片描述

2.2 返回数据

@RequestMapping("/return")
//@RestController
@Controller
@ResponseBody
public class ReturnController {@RequestMapping("returnData")public String returnData(){return "返回数据";}
}

返回数据,前面其实一直在用,如果返回静态界面,需要写@Controller 注解,如果要直接返回数据,还需要加上个@ResponseBody注解。注意:@ResponseBody 即可作用在类上,表示类中所以方法返回都是数据,也可以作用在方法上,只表示该方法返回数据,这两个注解也可以和二为一,就是前面经常写的@RestController,但它也只能修饰类了。
Controller

2.3 返回HTML代码片段

    @RequestMapping("/returnHtml")@ResponseBodypublic String html(){return "<h1>hello,html</h1>";}

当返回数据有HTML代码,浏览器会自动解析:
HTML
如果用Fiffler抓包,可以看到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⽂件, 那么SpringMVC会⾃动设置Content-Type为 text/css。

2.4 返回JSON

    @RequestMapping("/returnJosn")@ResponseBodypublic HashMap<String,String> josn(){HashMap<String,String> map = new HashMap<>();map.put("Java","Java V");map.put("Mysql","Mysql V");return map;}

响应:
Josn
JOSN内也是键值对,可以使用map。

2.5 设置状态码

    @RequestMapping("/setStatus")@ResponseBodypublic String setStatus(HttpServletResponse response){response.setStatus(401);return "设置状态码成功";}

直接设置即可:
抓包:
401

相关文章:

【Spring】Spring MVC请求响应

文章目录 1. 请求1.1 传递单个参数1.2 传递多个参数1.3 传递对象1.4 后端参数重命名1.5 传递数组1.6 传递集合1.7 传递JSON对象1.8 获取URL中参数1.9 上传⽂件1.10 获得Cookie1.11 获得Session1.12 获得Header 2. 响应2.1 返回静态界面2.2 返回数据2.3 返回HTML代码片段2.4 返回…...

程序设计与算法(二)算法基础(北京大学MOOC)

一、枚举 1、完美立方 /* 完美立方a^3b^3c^3d^3// a大于b c d// b<c<d*/ #include <iostream> int main() {int a,b,c,d; int N 24;//scanf("%d", &N );for(a2; a<N; a ) //a的范围 [2,N]{for(b2; b<a; b){ //b的范围[2…...

【MedusaSTears】正则表达式搜索心得

文章目录 心得体会1.懒惰匹配最少字符 .?2.前瞻: 字符串后边 包括/不包括 某个单词/字母2-1.包含某单词: start(?.?hello)2-2.不包含某单词: start(?!.?hello) 心得体会 前情回顾: 【MedusaSTears】正则?不要太简单!—正则表达式个人学习心得总结: 正则说白了是对字符串…...

带你从0开始学习自动化框架Airtest

现在市面上做UI自动化的框架很多&#xff0c;包括我们常用的Web自动化框架Selenium&#xff0c;移动端自动化框架Appium。 虽然Selenium和Appium分属同源&#xff0c;而且API都有很多相同的地方&#xff0c;可以无损耗切换&#xff0c;但是还是需要引入不同的库&#xff0c;而…...

MySQL扩展语句和约束方式

一、扩展语句 复制&#xff0c;通过like这个语法直接复制bbb的表结构。只是复制表结构&#xff0c;不能复制表里面的数据 把bbb表里面的数据&#xff0c;复制到test&#xff0c;两个表数据结构要一致 创建一张表&#xff0c;test1,数据从bbb来&#xff0c;表结构也是bbb delete…...

用起来顺手的在线表结构设计软件工具Itbuilder,与你共享

在线表结构设计软件工具需功能简洁&#xff0c;去除晦涩难懂的设置&#xff0c;化繁为简&#xff0c;实用为上&#xff0c;上手非常容易&#xff0c;这些itbuilder统统可以做到。 itbuilder是一款基于浏览器开发的在线表结构设计软件工具&#xff0c;借助人工智能提高效率&…...

Android开发知识学习——HTTPS

文章目录 定义HTTPS连接HTTPS 连接建立的过程课后题 定义 HTTP Secure / HTTP over SSL / HTTP over TLS SSL&#xff1a;Secure Socket Layer -> TLS Transport Layer Security 定义&#xff1a;在HTTP之下增加的一个安全层&#xff0c;用于保障HTTP的加密传输 本质&…...

STM32H750之FreeRTOS学习--------(一)初识RTOS

FreeRTOS 一、初识RTOS 裸机&#xff1a;裸机又称为前后台系统&#xff0c;前台系统指的中断服务函数&#xff0c;后台系统指的大循环&#xff0c;即应用程序 实时性差,程序轮流执行delayCPU空等待&#xff0c;效率低程序混乱&#xff0c;臃肿&#xff0c;功能都放在while循环…...

关于pycharm中句号变成点的问题

现象 在pycharm的使用中&#xff0c;经常遇到一个问题&#xff1a;注释写着写着&#xff0c;突然句号“。”变成了“.” 原因 今天突然发现&#xff0c;造成该现象的原因是&#xff1a;某个瞬间按下了ctrl .&#xff0c;那么之后按下句号只能显示为点。 pycharm中&#xf…...

FedGNN: Federated Graph Neural Network for Privacy-Preserving Recommendation

FedGNN&#xff1a;用于隐私保护推荐的联邦图神经网络 参考笔记 ICML-21-workshop 本文的主要创新工作 在具有局部差分隐私的模型训练中保护模型梯度&#xff0c;并提出一种伪交互项目采样技术来保护用户与之交互的项目。提出了一种保护隐私的用户-项目图扩展方法&#xff0…...

k8s---pod进阶

//资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了 li…...

scrapy框架爬取数据(创建一个scrapy项目+xpath解析数据+通过pipelines管道实现数据保存+中间件)

目录 一、创建一个scrapy项目 二、xpath解析数据 三、通过pipelines管道实现数据保存 四、中间件 一、创建一个scrapy项目 1.创建一个文件夹&#xff1a;C06 在终端输入以下命令&#xff1a; 2.安装scrapy:pip install scrapy 3.来到文件夹下&#xff1a;cd C06 4.创建…...

你被骗了吗?别拿低价诱骗机器视觉小白,4000元机器视觉系统怎么来的?机器视觉工程师自己组装一个2000元不到,还带深度学习

淘宝闲鱼&#xff0c;大家搜搜铺价格&#xff0c;特别是机器视觉小白。 机架&#xff1a;&#xff08;新的&#xff09;200元以下。(看需求&#xff0c;自己简单打光&#xff0c;买个50元的。如果复杂&#xff0c;就拿给供应商免费打光) 相机&#xff0c;镜头&#xff1a;&am…...

计算机毕业设计选题推荐-大学生校园兼职微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

如何使用 Docker 搭建 Jenkins 环境?从安装到精通

不少兄弟搭 jenkins 环境有问题&#xff0c;有的同学用 window, 有的同学用 mac&#xff0c; 有的同学用 linux。 还有的同学公司用 window, 家里用 mac&#xff0c;搭个环境头发掉了一地。。。 这回我们用 docker 去搭建 jenkins 环境&#xff0c;不管你是用的是什么系统&…...

YOLOv5配置文件之 - yaml

在YOLOv5的目录中&#xff0c;models文件夹里存储了YOLO的模型配置。 ./models/yolov5.yaml 定义了YOLOv5s网络结构的定义文件 yaml的主要内容 参数配置 nc: 80 类别数量 depth_multiple: 0.33 模型深度缩放因子 width_multiple: 0.50 控制卷积特征图的通道个数 anchors配…...

HBuilderX实现安卓真机调试

1. 简介 HBuilderX 简称 HX&#xff0c;HBuilder&#xff0c;H 是 HTML 的缩写&#xff0c;Builder 是建设者。是为前端开发者服务的通用 IDE&#xff0c;或者称为编辑器。与 vscode、sublime、webstorm 类似。 它可以开发普通 web 项目&#xff0c;也可以开发 DCloud 出品的 u…...

如何使用IP归属地查询API加强网络安全

引言 在当今数字化时代&#xff0c;网络安全对于个人和组织来说至关重要。恶意网络活动的威胁不断增加&#xff0c;因此采取有效的措施来加强网络安全至关重要。其中之一是利用IP归属地查询API。这个工具可以为您的网络安全策略提供宝贵的信息&#xff0c;帮助您更好地保护自己…...

Nginx 实战指南:暴露出请求的真实 IP

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…...

golang工程— grpc-gateway健康检查和跨域配置

grpc健康检查网关跨域配置 grpc健康检查 grpc健康检查使用 服务端配置 import ("google.golang.org/grpc/health""google.golang.org/grpc/health/grpc_health_v1" )//添加健康检查服务,多路复用 grpc_health_v1.RegisterHealthServer(s, health.NewSe…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…...