【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

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

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

相关文章

Vue3 + Tsx 集成 ace-editor编辑器

Ace Editor介绍 Ace Editor&#xff08;全名&#xff1a;Ajax.org Cloud9 Editor&#xff09;是一个开源的代码编辑器&#xff0c;旨在提供强大的代码编辑功能&#xff0c;通常用于构建基于Web的代码编辑应用程序。它最初由Cloud9 IDE开发&#xff0c;现在由开源社区维护。 主…

SAM:Segment Anything 代码复现和测试 基本使用

相关地址 代码&#xff1a; https://github.com/facebookresearch/segment-anything 在线网站&#xff1a; https://segment-anything.com/demo 环境配置 建议可以clone下来学习相关代码&#xff0c;安装可以不依赖与这个库 git clone https://github.com/facebookresearch…

前端HTML

文章目录 一、什么是前端前端后端 前端三剑客1.什么是HTML2.编写前端的步骤1.编写服务端2.浏览器充当客户端访问服务端​ 3.浏览器无法正常展示服务端内容(因为服务端的数据没有遵循标准)4.HTTP协议>>>:最主要的内容就是规定了浏览器与服务端之间数据交互的格式 3. 前…

Angular-03:组件模板

各种学习后的知识点整理归纳&#xff0c;非原创&#xff01; 组件模板 ① 数据绑定② 属性绑定③ 类名绑定④ 样式绑定⑤ 事件绑定⑥ 获取原生DOM对象6.1 在组件模板中获取6.2 在组件类中获取 ⑦ 双向数据绑定⑧ 内容投影8.1 select选择器8.2 单槽投影8.3 多槽投影 ⑨ 安全操作…

【Overload游戏引擎细节分析】PBR材质Shader---完结篇

PBR基于物理的渲染可以实现更加真实的效果&#xff0c;其Shader值得分析一下。但PBR需要较多的基础知识&#xff0c;不适合不会OpenGL的朋友。 一、PBR理论 PBR指基于物理的渲染&#xff0c;其理论较多&#xff0c;需要的基础知识也较多&#xff0c;我在这就不再写一遍了&…

leetcode:374. 猜数字大小(二分查找)

一、题目 函数原型&#xff1a;int guessNumber(int n) 二、思路 本题其实就是从 1 - n 中找出所要的答案。利用guess函数来判断数字是否符合答案。 答案小于当前数字&#xff0c;guess函数返回-1 答案等于当前数字&#xff0c;guess函数返回0 答案大于当前数字&#xff0c;gue…

nginx 转发数据流文件

1.问题描述 后端服务&#xff0c;从数据库中查询日志&#xff0c;并生成表格文件返回静态文件。当数据量几兆时&#xff0c;返回正常&#xff0c;但是超过几十兆&#xff0c;几百兆&#xff0c;就会超过网关的连接超时时间30秒。 时序图 这里面主要花费时间的地方在&#xff…

启动Vue项目报错Error: error:0308010C:digital envelope routines::unsupported

问题描述 启动Vue项目报错Error: error:0308010C:digital envelope routines::unsupported 出现这个一般就是node版本的问题&#xff0c;通过命令查看node -v查看node版本&#xff1b; 百度查了好多&#xff0c;都让我降低node版本&#xff0c;属实太麻烦了 在不改node版本的…

【C# Programming】委托和lambda表达式、事件

目录 一、委托和lambda表达式 1.1 委托概述 1.2 委托类型的声明 1.3 委托的实例化 1.4 委托的内部机制 1.5 Lambda 表达式 1.6 语句lambda 1.7 表达式lambda 1.8 Lambda表达式 1.9 通用的委托 1.10 委托没有结构相等性 1.11 Lambda表达式和匿名方法的内部机制 1.1…

博弈论学习笔记(2)——完全信息静态博弈

前言 这部分我们学习的是完全信息静态博弈&#xff0c;主要内容包括博弈论的基本概念、战略式博弈、Nash均衡、Nash均衡解的特性、以及Nash均衡的应用。 零、绪论 1、什么是博弈论 1&#xff09;博弈的定义 博弈论&#xff1a;研究决策主体的行为发生直接相互作用时候的决策…

Java架构师软件架构的演化和维护

目录 1 导学2 软件架构演化和定义3 面向对象软件架构演化4 软件架构演化方式的分类5 软件架构演化原则6 软件架构演化评估方法7 大型网站架构演化8 软件架构维护想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 软件架构演化和定义 软件架构的演化和维护就是对…

Kafka - 异步/同步发送API

文章目录 异步发送普通异步发送异步发送流程Code 带回调函数的异步发送带回调函数的异步发送流程Code 同步发送API 异步发送 普通异步发送 需求&#xff1a;创建Kafka生产者&#xff0c;采用异步的方式发送到Kafka broker 异步发送流程 Code <!-- https://mvnrepository…

飞鼠异地组网工具全网互通实战指南

飞鼠异地组网工具全网互通实战指南 一、飞鼠异地组网工具介绍1.1 飞鼠工具简介1.2 飞鼠工具官网 二、本次实践介绍2.1 本次实践前提2.2 本次实践简介2.3 本次实践环境规划 三、异地组网配置3.1 进入中心控制器节点管理后台3.2 网卡设置3.3 进入子网节点管理后台3.4 网卡设置 四…

项目综合实训,vrrp+bfd,以及策略路由的应用

目录 一&#xff0e; 项目需求 二&#xff0e; Visio设备画图 三&#xff0e; 设备选型 三&#xff0e;vlan规划 四&#xff0e;Ip地址规划 五&#xff0e;实验拓扑图 六&#xff0e;配置过程及结果 项目需求 1.S1作为VLAN10的主网关和根桥&#xff0c;S2作为v…

Pytorch L1,L2正则化

L1正则化和L2正则化是常用的正则化技术&#xff0c;用于在机器学习模型中控制过拟合。它们的主要区别在于正则化项的形式和对模型参数的影响。 L1正则化&#xff08;Lasso正则化&#xff09;&#xff1a; 正则化项形式&#xff1a;L1正则化使用模型参数的绝对值之和作为正则化…

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试

背景&#xff1a;Web 端需要使用已有的 C 库&#xff08;使用 CMake 编译&#xff09;&#xff0c;需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 上篇文章《Mac 上安装 Emscripten》 已讲解如何安装配置 Emscripten 环境。 本篇文章主要讲解如何将基于 CMakeLists 配…

Gitee 发行版

Gitee 发行版 1、Gitee 发行版管理2、项目仓库中创建发行版本3、项目中导入3.1 gradle配置3.2 dependencies执行正常&#xff0c;包没有下载 1、Gitee 发行版管理 Gitee 发行版&#xff08;Release&#xff09;管理 2、项目仓库中创建发行版本 按照Gitee官网操作就行 3、项目…

PCIe 访问 EP 配置空间,空间映射详解,BDF 计算偏移

访问 EP 的配置空间方法 内存映射IO 访问 内存访问配置空间 前置知识 PCIe 设备的寻址是按照 BDF 即 Bus-Device-Function 来组织的。访问某个设备则需要根据BDF计算偏移地址。 两种不同的内存访问配置空间方法 类 xilinx&#xff0c;基地址 偏移地址访问 // linux-5.10\…

http1,https,http2,http3总结

1.HTTP 当我们浏览网页时&#xff0c;地址栏中使用最多的多是https://开头的url&#xff0c;它与我们所学的http协议有什么区别&#xff1f; http协议又叫超文本传输协议&#xff0c;它是应用层中使用最多的协议&#xff0c; http与我们常说的socket有什么区别吗&#xff1f; …

【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】

文章目录 排序算法小结排序算法C实现排序方法的稳定性 排序算法小结 C语言中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。下面我们来一一介绍&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;冒泡排序是通过比较相邻…