springMVC-请求响应

embedded/2024/12/26 15:20:10/

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";}

使用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);}
}


http://www.ppmy.cn/embedded/148922.html

相关文章

【阅读记录-章节7】Build a Large Language Model (From Scratch)

系列文章目录 【阅读记录-章节1】Build a Large Language Model (From Scratch) 【阅读记录-章节2】Build a Large Language Model (From Scratch) 【阅读记录-章节3】Build a Large Language Model (From Scratch) 【阅读记录-章节4】Build a Large Language Model (From Scr…

SDL3 GPU编程探索

目录 前言 总体印象 一般流程 创建窗口 创建设备 准备资源 1.VBO&#xff0c;IBO 2.图像 3.资源转储 4.采样器 5.着色器 6.渲染管线 绘制 插曲 1.忘记初始化 2.关于数学库 3.SDL3_image 结语 前言 几天前冲浪才得知SDL有了一下代&#xff0c;而且还支持GPU编程…

Hive其五,使用技巧,数据查询,日志以及复杂类型的使用

目录 一、关于Hive使用的一些技巧 二、表的数据查询 三、Hive默认的日志 四、复杂数据类型 1、Array的使用 2、展开函数的使用 explode 3、Map的使用 4、Struct结构体 一、关于Hive使用的一些技巧 1、可以直接不进入hive的情况下执行sql语句 通过shell的参数 -e 可以执…

微服务分布式(一、项目初始化)

微服务是将大型的web项目拆分成成多个小型的springboot工程&#xff0c;依靠spring cloud相关分布式框架的工具进行整合&#xff0c;通常将一个大项目中不同的业务和技术分别拆分成不同的小模块独立运行。 下面我们先进行项目初始化&#xff0c;项目工具特别方便&#xff0c;我…

冰狐智能辅助使用插件化开发集成三方ocr

插件化开发&#xff08;Plugin Development&#xff09;是一种软件开发模式&#xff0c;它将一个应用程序的功能拆分为模块&#xff0c;并允许在运行时动态加载、卸载和扩展这些模块&#xff0c;以增强应用程序的功能。冰狐支持动态加载和卸载第三方插件模块&#xff0c;开发者…

离心式压缩机设计的自动化方法

离心式压缩机设计中的挑战 长期以来&#xff0c;人们一直使用不同形状和尺寸的压缩机&#xff0c;通过向流经转子的连续流体添加能量来产生压力上升。它们也在汽车工业的涡轮增压器中得到广泛使用。图 1 显示了典型的离心式&#xff08;径向&#xff09;压缩机叶轮。 图 1 叶轮…

Android简洁缩放Matrix实现图像马赛克,Kotlin

Android简洁缩放Matrix实现图像马赛克&#xff0c;Kotlin 原理&#xff0c;通过Matrix把一个原图缩小到原先的1/n&#xff0c;然后再把缩小后的小图放大n倍&#xff0c;自然就是马赛克效果&#xff08;相当于是放大后像素“糊”成一片了&#xff09;。 import android.content.…

kanzi3.6.10 窗口插件-查找绑定信息

文章目录 1. 创建kanzi窗口插件2. 业务逻辑3. 关键代码3.1 遍历本工程的绑定信息3.2 遍历所有工程的绑定信息3.3 DiguiSearchNode实现3.4 双击跳转 4. 安装 背景&#xff1a;在kanzi studio里按CtrlF&#xff0c;可以查找&#xff0c;能查找节点/资源等等&#xff0c;但是不能查…