当前位置: 首页 > 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、【…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Neo4j 完全指南:从入门到精通

第1章&#xff1a;Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...

Spring Boot 与 Kafka 的深度集成实践(二)

3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中&#xff0c;配置 Kafka 生产者主要是配置生产者工厂&#xff08;ProducerFactory&#xff09;和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例&#xff0c;而 KafkaTemplate 则是用于发送消息的核心组件&#x…...

项目研究:使用 LangGraph 构建智能客服代理

概述 本教程展示了如何使用 LangGraph 构建一个智能客服代理。LangGraph 是一个强大的工具&#xff0c;可用于构建复杂的语言模型工作流。该代理可以自动分类用户问题、分析情绪&#xff0c;并根据需要生成回应或升级处理。 背景动机 在当今节奏飞快的商业环境中&#xff0c…...