当前位置: 首页 > 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;

http://www.lryc.cn/news/511333.html

相关文章:

  • 数据交易和联邦学习的背景下的安全属性
  • 顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
  • Datawhale-AI冬令营二期
  • Python的秘密基地--[章节7] Python 并发与多线程编程
  • 每天五分钟机器学习:凸函数
  • Merry Christmas HTML
  • JavaScript甘特图 dhtmlx-gantt
  • 阿里云-将旧服务器数据与配置完全迁移至新服务器
  • 以EM算法为例介绍坐标上升(Coordinate Ascent)算法:中英双语
  • Spark生态圈
  • CSDN编辑器
  • 【信息系统项目管理师】高分论文:论信息系统项目的资源管理(智慧储电站系统)
  • Web开发:ORM框架之使用Freesql的分表分页写法
  • Unity功能模块一对话系统(1)前置准备
  • strrchr的概念和使用案例
  • 缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布
  • C++ 并发专题 - 实现一个线程安全的队列
  • SQL 基础教程
  • 【源码】Sharding-JDBC源码分析之SQL中影子库ShadowSQLRouter路由的原理
  • 雷池 WAF 搭配阿里云 CDN 使用教程
  • 3.银河麒麟V10 离线安装Nginx
  • 【模块一】kubernetes容器编排进阶实战之kubernetes 资源限制
  • 【开源】一款基于SpringBoot的智慧小区物业管理系统
  • Goland:专为Go语言设计的高效IDE
  • 云手机与Temu矩阵:跨境电商运营新引擎
  • 仓颉编程笔记1:变量函数定义,常用关键字,实际编写示例
  • Python小括号( )、中括号[ ]和大括号{}代表什么
  • React里使用lodash工具库
  • 【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。
  • C语言-数据结构-图