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

springMVC-请求响应

springmvc——一 站式web框架,核心是处理http请求响应。
前后端分离:需要序列化,服务端把数据序列化成字符串或者流给前端,前端又把json转成对象,前端的叫反序列化。前端把数据序列化转成字符串给服务器,服务器收到字符串转成对象。(转化为json字符串进行网络传输)
序列化:对象转字符串
反序列化:字符串转对象

@RequestMapping路径映射

路径位置通配符:多个都能匹配上,就精确优先
    * : 匹配任意多个字符(0-n)不能匹配多个路径——使用/**解决
   ** :匹配任意多层路径
    ? : 匹配任意一个字符
     精确程度:完全匹配——?——*——**
     精确路径必须全局唯一

/*** //@RestController(处理请求和响应数据)<——@Controller、@ResponseBody* @ResponseBody:(告诉spring,把返回的内容写到响应体中,每次请求进来执行目标方法)*/
@RestController
public class HelloController {* @return*/@RequestMapping("/hello")public String hello(){return "Hello spring MVC 你好!";}}

请求限定

   请求方式:method
   请求参数:params
   请求头:headers
   请求内容类型:consumes
   响应内容类型:produces

@RestController
public class HelloController {/*** 限定请求方式-接收post请求*     GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;*/@RequestMapping(value = "/test01",method = RequestMethod.POST)public String test01(){return "Hello spring MVC 你好!";}/***限定请求参数-接收参数请求*  name:表示必须包含name=username参数 (http://localhost:8080/test02?name=username)*/@RequestMapping(value = "/test02",params ={ "name=username"})public String test02(){return "Hello spring MVC 你好!";}/*** 限定请求头-接收请求头请求* accept:表示必须包含请求头Accept* @return*/@RequestMapping(value = "/test03",headers = {"Accept"})public String test03(){return "Hello spring MVC test03";}/*** 请求内容类型-接收请求内容类型请求* application/json:表示浏览器必须携带json格式数据。*/@RequestMapping(value = "/test04",consumes = {"application/json"})public String test04(){return "Hello spring MVC test04";}/*** 响应内容类型* text/html;charset=UTF-8:生产html页面* @return*/@RequestMapping(value = "/test05",produces = {"text/html;charset=UTF-8"})public String test05(){return "<h1>hello</h1>";}
}

请求处理

~使用普通变量,收集请求参数

~使用@RequestParam

~使用POJO,统一封装多个参数

~@CookieValue获取Cookie数据

~使用POJO,级联封装复杂对象

~使用@RequestBody,封装JSON对象

~使用@RequestPart/@RequestParam,封装文件对象

使用普通变量,收集请求参数

    /***请求参数-使用普通变量* 要求:变量名和参数名保持一致*/@RequestMapping("/handle01")public String handle01(String username, String password) {System.out.println("username"+username+",password:"+password);return "success";}

使用@RequestParam

@RequestParam():取出某个请求参数的值,请求参数可以和变量名不一致。

    /*** 默认一定要携带的参数,否则报错* required = false:可以不携带//默认为true* defaultValue:默认值,参数可以不带* 无论请求参数是来自请求体还是url?后面,都可以取到(请求参数)* @return*/@RequestMapping("/handle02")public String handle02(@RequestParam("username") String name,@RequestParam(value = "password", defaultValue = "123456")String pwd,@RequestParam("phone")String phone,@RequestParam(value="agreement",required = false)boolean agree)  {System.out.println("username"+name+",password:"+pwd+",cellphone:"+phone+",agreement:"+agree);return "success";}

@PathVariable-路径变量

    /*** @PathVariable路径变量标识-取路径id的值* @param id* @return*/@RequestMapping("/handle/{id}")  //{id}路径变量,动态的public String handle08(@PathVariable Integer id)  {System.out.println("id:"+id);return "success";}

使用POJO,统一封装多个参数

/***请求参数-pojo统一封装参数* 自动把请求参数和pojo属性进行匹配* 效果:pojo的所有属性值都来自请求参数* @return*/@RequestMapping("/handle03")public String handle03(Person person) {System.out.println(person);return "success";}

使用POJO,级联封装复杂对象

/***使用pojo级联封装复杂属性* 属性套属性,对象套对象* 例如:①address属性中有三个属性,可以把address当成对象。*     ②前端传过来的属性能选多个,可以封装成数组。* @Data* public class Person {*     private String username;*     private Address address;*     private String[] hobby;* }* @Data* class Address{*     private String province;*     private String city;* }* @return*/@RequestMapping("/handle06")public String handle05(Person person)  {System.out.println(person);return "success";}

使用@RequestBody,封装JSON对象

 /*** 接受json数据* @RequestBody 获取请求体的json数据,自动转为person对象(反序列化)* 发出:请求体是json字符串,不是key=value* @return*/@RequestMapping("/handle07")public String handle06(@RequestBody Person person)  {System.out.println(person);return "success";}

使用MultipartFile封装文件对象

    /***例:前端发送表单数据,表单包含数据,和头像图片和生活照图片* 接受文件上传* @RequestParam取出文件项(前端参数名称),封装到MultipartFile,就可以拿到文件内容* @param person* @return*/@RequestMapping("/handle08")public String handle07(Person person, @RequestParam("headerImage") MultipartFile headerImgFile,@RequestParam("lifeImage") MultipartFile[] lifeImgFiles) throws IOException {//1、获取原始文件名String originalFilename = headerImgFile.getOriginalFilename();//2、文件保存headerImgFile.transferTo(new File("E:\\img\\" + originalFilename));
//        以上处理了头像,下面处理多个生活照if (lifeImgFiles.length > 0) {for (MultipartFile imgFile : lifeImgFiles) {imgFile.transferTo(new File("E:\\img\\" + imgFile.getOriginalFilename()));}System.out.println("=======生活照保存结束==========");}System.out.println(person);//文件大小long size = headerImgFile.getSize();//获取文件流InputStream inputStream = headerImgFile.getInputStream();return "success";}

响应处理

1.@ResponseBody+对象:响应json等非页面数据

2.ResponseEntity<B> :响应头、响应体数据(文件下载)

@RestController
public class ResponseTestController {/*** 会自动返回的对象转为json* @return*/@RequestMapping("/resp01")public Person resp01() {Person person = new Person();return person;}/*** 文件下载*  HttpEntity,拿到整个请求数据*  ResponseEntity,拿到整个响应数据(响应头,响应体,状态码)*  可以用作文件下载模板-只需要修改文件下载位置和文件名即可。* @return*/@RequestMapping("/download")public ResponseEntity<InputStreamResource> download() throws Exception {FileInputStream fileInputStream = new FileInputStream("E:\\photo.png");//       一口气读会溢出  所以使用分段读- InputStreamResource
//        byte[] bytes = fileInputStream.readAllBytes();//      文件名中文乱码-解决乱码问题String encode = URLEncoder.encode("1.jpg", "UTF-8");
//        解决文件太大会内存溢出问题InputStreamResource resource = new InputStreamResource(fileInputStream);return ResponseEntity.ok()
//                内容类型,流.contentType(MediaType.APPLICATION_OCTET_STREAM)
//                内容大小.contentLength(fileInputStream.available())
//                Content-Disposition:内容处理方式.header("Content-Disposition","attachment;filename="+encode).body(resource);}
}

日期处理

数据转换

 反序列化:前端提交的日期字符串——>日期对象

 序列化:日期对象——>日期字符串

默认的日期格式:xxxx-xx-05T06:46:58.000+00:00

解决方法:使用@JsonFormat注解(json转对象,对象转json)

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date birthday;

相关文章:

springMVC-请求响应

springmvc——一 站式web框架&#xff0c;核心是处理http请求响应。 前后端分离&#xff1a;需要序列化&#xff0c;服务端把数据序列化成字符串或者流给前端&#xff0c;前端又把json转成对象&#xff0c;前端的叫反序列化。前端把数据序列化转成字符串给服务器&#xff0c;服…...

数据交易和联邦学习的背景下的安全属性

数据交易和联邦学习的背景下的安全属性 在数据交易和联邦学习的背景下,安全属性对于保护数据隐私、确保系统可靠性和维护交易公平性至关重要。以下将分析文章中涉及的安全属性以及分析这些属性的目的。 涉及的安全属性 双向认证:文章虽未明确提及传统意义上的双向认证机制,…...

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)

文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点&#xff1a; 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…...

Datawhale-AI冬令营二期

目录 一、番茄时钟&#xff08;1&#xff09;输入Prompt&#xff08;2&#xff09;创建 HTML 文件解析1&#xff1a;HTML结构解析2&#xff1a;计时器内容解析3&#xff1a;按钮区域解析4&#xff1a;脚本引用 &#xff08;3&#xff09;使用JavaScript实现时钟功能解析1&#…...

Python的秘密基地--[章节7] Python 并发与多线程编程

第7章&#xff1a;Python 并发与多线程编程 随着计算机硬件的发展&#xff0c;多核处理器已经成为主流。为了更好地利用多核资源&#xff0c;提高程序的运行效率&#xff0c;Python 提供了并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;编…...

每天五分钟机器学习:凸函数

一、凸函数的定义:何为“凸”? 在数学上,凸函数的概念源于几何直观——想象一个平面上的曲线,如果在这条曲线上的任意两点之间连线段总是位于曲线的下方(或恰好与曲线重合),则这条曲线所对应的函数即为凸函数。更正式地,对于定义在实数集(或某个子集)上的函数f(x),…...

Merry Christmas HTML

简单分享 Merry Christmas HTML 设计的核心代码 HTML: <body class"card"> <div class"dialog"><div class"dialog-in"><div class"dialog-msg"><div class"heading">Youve got a post card!…...

JavaScript甘特图 dhtmlx-gantt

背景 需求是在后台中&#xff0c;需要用甘特图去展示管理任务相关视图&#xff0c;并且不用依赖vue&#xff0c;兼容JavaScript原生开发。最终使用dhtmlx-gantt&#xff0c;一个半开源的库&#xff0c;基础功能免费&#xff0c;更多功能付费。 甘特图需求如图&#xff1a; 调…...

阿里云-将旧服务器数据与配置完全迁移至新服务器

文章目录 一&#xff1a;创建镜像二&#xff1a;将创建好的镜像复制到新服务器所在的目标地域&#xff08;如果新服务器与镜像在同一地域就不用进行这一操作&#xff09;三&#xff1a;将镜像配置到新服务器上四&#xff1a;导出安全组&#xff08;如果新服务器与旧服务器使用同…...

以EM算法为例介绍坐标上升(Coordinate Ascent)算法:中英双语

中文版 什么是 Coordinate Ascent 算法&#xff1f; Coordinate Ascent&#xff08;坐标上升&#xff09;是一种优化算法&#xff0c;它通过在每次迭代时优化一个变量&#xff08;或一个坐标&#xff09;&#xff0c;并保持其他变量不变&#xff0c;逐步逼近最优解。与坐标下…...

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS&#xff0c;但是中间结果可以存放在内存中&#xff1b;调度可以使用 Spark 内置的&#xff0c;也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈&#xff1a; Spark Core&#xff1a;实现了…...

CSDN编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

【信息系统项目管理师】高分论文:论信息系统项目的资源管理(智慧储电站系统)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划资源管理2、估算活动资源3、获取资源4、建设团队5、管理团队6、控制资源论文 根据国家2030年前碳达峰行动方案,提出全面推进风电、太阳能发电大规模开发和高质量发展。XX地国家电网启动了“数字李…...

Web开发:ORM框架之使用Freesql的分表分页写法

一、自动分表&#xff08;高版本可用&#xff09; 特性写法 //假如是按月分表&#xff1a;[Table(Name "log_{yyyyMM}", AsTable "createtime2022-1-1(1 month)")]注意&#xff1a;①需包含log_202201这张表 ②递增规律是一个月一次&#xff0c;确保他们…...

Unity功能模块一对话系统(1)前置准备

也许你也曾被游戏中的对话系统深深吸引&#xff0c;那些精心设计的对白、鲜活的角色配音、甚至是简单的文字对话&#xff0c;往往能让玩家产生强烈的代入感和情感共鸣。如果你正在开发一款游戏&#xff0c;或者计划为你的项目加入一个引人入胜的对话系统&#xff0c;那么 Unity…...

strrchr的概念和使用案例

strrchr 是 C 语言标准库中的一个函数&#xff0c;用于在字符串中查找最后一次出现的字符&#xff0c;并返回指向该字符的指针。 概念&#xff1a; strrchr 函数在给定的字符串中从末尾开始搜索指定的字符&#xff0c;返回一个指向该字符最后一次出现的指针。如果字符在字符串…...

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…...

C++ 并发专题 - 实现一个线程安全的队列

一&#xff1a;概述 本文利用 C 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列&#xff0c;并且使用多个线程来向队列中添加和获取数据。 二&#xff1a;实现过程&#xff1a; #include <iostream> #include <queue> #include <mutex&g…...

SQL 基础教程

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中&#xff0c;您将学到如何使用 SQL 访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;Oracle, Sybase, SQL Server, DB2, Access 等等。 SQL 是用于访问和处理数据库的标准的计算机语言。 什么是…...

【源码】Sharding-JDBC源码分析之SQL中影子库ShadowSQLRouter路由的原理

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

Python----目标检测(yolov5-7.0安装及训练细胞)

一、下载项目代码 yolov5代码源 GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite yolov5-7.0代码源 Release v7.0 - YOLOv5 SOTA Realtime Instance Segmentation ultralytics/yolov5 GitHub 二、创建虚拟环境 创建一个3.8…...

华为云Flexus+DeepSeek征文 | 基于DeepSeek-V3构建企业知识库问答机器人实战

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 1. 引言 2. 技术选型与架构设计 2.1 技…...

【MySQL系列】MySQL 执行 SQL 文件

博客目录 一、MySQL 执行 SQL 文件的常见场景二、MySQL 执行 SQL 文件的主要方法1. 使用 MySQL 命令行客户端2. 在 MySQL 交互界面中使用 source 命令3. 使用 MySQL Workbench 等图形化工具4. 使用编程语言接口 三、执行 SQL 文件时的注意事项1. 字符集问题2. 事务处理3. 错误处…...

Java线程工厂:定制线程的利器

在Java中&#xff0c;线程工厂&#xff08;Thread Factory&#xff09;是一个创建新线程的工厂。它提供了一种方式&#xff0c;允许你在创建线程时定制线程的属性&#xff0c;比如设置线程名称、线程的优先级、守护线程属性等。 线程工厂的主要目的是将线程的创建逻辑从使用线…...

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告

本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示&#xff0c;同时&#xff0c;统计目标数量以及违停数量&#xff0c;生成结果评估&#xff0c;一并发送到前端展示。对于本文任何技术上的空缺&#xff0c;可在博主主页前面博客…...

十(1). 强制类型转换

继第十部分C强制类型转换的四种方式&#xff0c;再进行强化巩固一下知识点 static_cast 最常用的&#xff0c;在指针之间做转换 const_cast 去除常量属性 dynamic_cast 用在基类和派生类之间的转换 reinterpret_cast 在任意类型之间进行转 10.1 static_cast 常见的使用场景&am…...

从npm库 Vue 组件到独立SDK:打包与 CDN 引入的最佳实践

文章目录 前言一、 原始方案&#xff1a;直接发布 npm 组件二、升级为独立 SDK&#xff1a;支持 CDN 引入三、核心要点总结1. 独立 Vue 实例2. 动态渲染组件3. 手动挂载到 DOM4. 与用户环境的关系 前言 近期在项目中引入了一个支持多格式&#xff08;PDF、Video、Word等&#…...

powershell 安装 .netframework3.5

在 PowerShell 中安装 .NET Framework 3.5 可以通过几种不同的方法实现&#xff0c;取决于你的操作系统版本。以下是几种常见的方法&#xff1a; 方法1&#xff1a;使用 DISM 命令 对于 Windows 10 和 Windows 8.1&#xff0c;你可以使用 DISM&#xff08;Deployment Image Se…...

如何判断指针是否需要释放?

在 C 中判断一个指针是否需要释放可以考虑以下几个方面&#xff1a; 一、确定指针的来源 1. 动态分配的内存&#xff1a; 如果指针是通过new、new[]、malloc、calloc等动态内存分配函数获取的&#xff0c;那么在不再需要该内存时&#xff0c;必须手动释放。 例如&#xff1a…...

vue3: bingmap using typescript

项目结构&#xff1a; <template><div class"bing-map-market"><!-- 加载遮罩层 --><div class"loading-overlay" v-show"isLoading || errorMessage"><div class"spinner-container"><div class&qu…...