ssm学习笔记day04
RequestMapping
- 首先添加依赖
- Maven的配置
测试
在controller创建HelloController,如果只加@RequestMapping,默认跳转到新页面
如果要是加上@ResponseBody就把数据封装在包(JSON),标签@RestController是前后分离的注解(因为默认用@ResponseBody)
通配符
精度:'?' > '*' > '**'
例子:
/hell?
可以匹配 /hello 、 /hella 、/hellob,不可以匹配/helloo,因为oo是多个字符
/hell*
可以匹配/hello 、 /hella、/helloo等单层结构,/hello/a不可以
/hello/**
可以匹配所有/hello子层的结构
方法限定method
现在我们限定一个POST方式的Controller
测试需要用到Postman,因为浏览器不能自主Post,然后用Postman发送一个POST
可以看到POST结果返回成功,GET就返回405
方法类型
在 RequestMethod方法上有八种方法
参数限定params
http://localhost:8080/test02?age=18&username=zhangsan&gender=0
正常返回
测试
http://localhost:8080/test02?age=17&username=zhangsan&gender=0
异常,原因是age不为18。
http://localhost:8080/test02?age=18&gender=0
异常,原因是不包含username。
http://localhost:8080/test02?age=18&gender=0&username=wangwu
正常,顺序不影响结果
http://localhost:8080/test02?age=18&gender=1&username=wangwu
异常,原因是gender为1
请求头限定headers
内容类型限定consumes、produces
MediaType的类型
用json格式返回成功
用text格式返回415异常
produces限定类型,与consumes的区别是一个是消费者、一个是生产者,consumes是客户端到服务端的类型,produces是服务端到客户端的响应类型,即响应报文
请求实战演练
1.使用普通变量收集参数
/*没有携带自动封装为null,有就自动封装*/@RequestMapping("/handle01")public String test(String username ,String password ,String cellphone ,boolean agreement){System.out.println(username + " " + password + " " + cellphone + " " + agreement);return "ok";}
发送三次请求分别为
第一次:http://localhost:8080/handle01?username=zhangsan&password=123456&cellphone=23142234
第二次:http://localhost:8080/handle01?username=zhangsan&password=123456&cellphone=23142234&agreement=on
第三次:http://localhost:8080/handle01?username=zhangsan&cellphone=23142234
2.使用RequestParam明确收集参数
使用RequestParam明确收集参数默认必须携带,否则报错
ps:不管参数是放到url?后面还是请求体,都能被RequestParam接收
/*使用RequestParam明确收集参数默认必须携带如果不携带就炸了*/@RequestMapping("/handle02")public String handle02(@RequestParam("username") String name ,@RequestParam("password") String pwd ,@RequestParam("cellphone") String phone ,@RequestParam("agreement") boolean ok){System.out.println(name + " " + pwd + " " + phone + " " + ok);return "ok";}
发送http://localhost:8080/handle02?username=zhangsan&password=32451&cellphone=2341234&agreement=on
正常
发送http://localhost:8080/handle02?username=zhangsan&password=32451&agreement=on
则报错,因为没有携带cellphone信息
@RequestMapping("/handle02")public String handle02(@RequestParam("username") String name ,@RequestParam(value = "password" , defaultValue = "123456") String pwd ,@RequestParam(value = "cellphone" ) String phone ,@RequestParam(value = "agreement" , required = false) boolean ok){System.out.println(name + " " + pwd + " " + phone + " " + ok);return "ok";}
如果属性required=false表示可以不用携带参数、default表示添加默认值,也可以不用携带参数
发送http://localhost:8080/handle02?username=zhangsan&cellphone=2341234&agreement=on
返回zhangsan 123456 2341234 true
3.使用Pojo封装所有参数
Person.java
package com.atguigu.springmvc.bean;import lombok.Data;
import lombok.ToString;@Data
@ToString
public class Person {private String username ;private String password ;private String cellphone ;private boolean agreement ;}
@RequestMapping("/handle03")public String handle03(Person person){System.out.println(person.toString());return "ok";}
4.@RequestHeader
@RequestMapping("/handle04")public String handle04(@RequestHeader("host") String host){System.out.println(host);return "ok~"+host;}
5.获取Cookie的键值对
用@CookieValue(value = “value”)获取
@RequestMapping("/handle05")public String handle05(@CookieValue("haha") String haha){return "ok" + haha;}
发送一个含有value = haha的cookie的报文
结果正常返回,然后我就好奇如果用@RequestHeader(“Cookie”)会发生什么呢,让我们开始实验
@RequestMapping("/handle05")public String handle05(@CookieValue("haha") String haha,@RequestHeader("Cookie") String ck){System.out.println(haha + " " + ck);return "ok" + haha + " " + ck;}
结果如下
6.pojo级联封装复杂对象
package com.atguigu.springmvc.bean;import lombok.Data;import java.util.Arrays;@Data
public class Person {private String username ;private String password ;private String cellphone ;private boolean agreement ;private Address address ;private String sex ;private String[] hobby;private String grade;
}
@Data
class Address {private String province;private String city ;private String area;
}
如果遇到以下这种笔记复杂的对象,可以考虑级联(嵌套)封装
ps:由于一直返回地址,不知道什么地方出了问题,然后我就手动Data,即alt + insert
快捷键生成,代码如下。
package com.atguigu.springmvc.bean;import lombok.Data;import java.util.Arrays;public class Person {private String username ;private String password ;private String cellphone ;private Boolean agreement ;private Address address ;private String sex ;private String[] hobby;private String grade;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getCellphone() {return cellphone;}public void setCellphone(String cellphone) {this.cellphone = cellphone;}public Boolean getAgreement() {return agreement;}public void setAgreement(Boolean agreement) {this.agreement = agreement;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}@Overridepublic String toString() {return "Person{" +"username='" + username + '\'' +", password='" + password + '\'' +", cellphone='" + cellphone + '\'' +", agreement=" + agreement +", address=" + address +", sex='" + sex + '\'' +", hobby=" + Arrays.toString(hobby) +", grade='" + grade + '\'' +'}';}
}class Address {private String province;private String city ;private String area;public String getArea() {return area;}public void setArea(String area) {this.area = area;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}@Overridepublic String toString() {return "Address{" +"area='" + area + '\'' +", province='" + province + '\'' +", city='" + city + '\'' +'}';}
}
结果正常显示
7.@RequestBody接收json字符并转换
首先编写如下代码
@RequestMapping("/handle07")public String handle07(Person person){System.out.println(person);return "ok";}
用postman发送请求
返回的结果如下
这是因为不使用 @RequestBody 注解,将无法直接接收 JSON 格式的数据,当不使用@RequestsBody的时候,Spring会处理表单数据(form-data/x-www-form-urlencoded)或者url?name=value,即键值对。
现在给它加上一个@RequestBody
@RequestMapping("/handle07")public String handle07(@RequestBody Person person){System.out.println(person);return "ok";}
8.文件上传
- 文件上传的要求
method = post , enctype = “multipart/form-data” - 代码的编写
@RequestMapping("/handle08")public String handle08(Person person,@RequestParam("headerImg") MultipartFile headerImgFile,@RequestParam("lifeImg") MultipartFile[] lifeImgFile) throws IOException {//获取原始路径String originalFilename = headerImgFile.getOriginalFilename();long size = headerImgFile.getSize();InputStream inputStream = headerImgFile.getInputStream();System.out.println(originalFilename + "=>" + size);headerImgFile.transferTo(new File("D:\\javastudy\\img\\" + originalFilename));System.out.println("头像保存结束");if(lifeImgFile.length > 0){for(MultipartFile imgFile : lifeImgFile){imgFile.transferTo(new File("D:\\javastudy\\img\\" + imgFile.getOriginalFilename()));}System.out.println("生活照保存结束");}System.out.println(person);return "ok!!!";}
用MultipartFile的接收文件,MultipartFile的源代码如下
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.web.multipart;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import org.springframework.core.io.InputStreamSource;
import org.springframework.core.io.Resource;
import org.springframework.lang.Nullable;
import org.springframework.util.FileCopyUtils;public interface MultipartFile extends InputStreamSource {String getName();@NullableString getOriginalFilename();@NullableString getContentType();boolean isEmpty();long getSize();byte[] getBytes() throws IOException;InputStream getInputStream() throws IOException;default Resource getResource() {return new MultipartFileResource(this);}void transferTo(File dest) throws IOException, IllegalStateException;default void transferTo(Path dest) throws IOException, IllegalStateException {FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));}
}
Test:
在properties中添加以下两句话可以修改传送文件大小
9.HttpEntity获取整个请求
@RequestMapping("/handle09")public String handle09(HttpEntity<String> entity){System.out.println("请求头"+entity.getHeaders());System.out.println("请求体"+entity.getBody());return "OK~~~";}
就是Entity是请求头、请求体的总和,用HttpEntity可以获得请求头和请求体。
10.原生api HttpServletRequestRequest、HttpServletResponse
@RequestMapping("/handle10")public String handle10(HttpServletRequest request, HttpServletResponse response){//原生api,HttpServletRequestRequest和HttpServletResponse 可以参考javawebString username = request.getParameter("username");System.out.println(username);return "OK~~~";}
获取HttpMethod方法
@RequestMapping("/handle10")public String handle10(HttpServletRequest request, HttpServletResponse response, HttpMethod method){System.out.println(method);//原生api,HttpServletRequestRequest和HttpServletResponse 可以参考javawebString username = request.getParameter("username");System.out.println(username);return "OK~~~";}
小结
响应实战演练
1.返回json
不加任何注释,默认返回json
package com.atguigu.springmvc.controller;import com.atguigu.springmvc.bean.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ResponseTestController {@RequestMapping("/resp01")public Person resp01() {Person person = new Person();person.setUsername("zhangsan");person.setPassword("111");person.setCellphone("1234");person.setAgreement(true);person.setSex("男");person.setHobby(new String[]{"足球","篮球"});person.setGrade("三年级");return person;}
}
核心原因:@RestController包含@ReponseBody(返回json对象)
2.文件下载
@RequestMapping("/download")public ResponseEntity<byte[]> download() throws IOException {FileInputStream inputStream = new FileInputStream("D://javastudy//img//d2d0adc1a979dc30d622b1cb1596875f.png");byte[] bytes = inputStream.readAllBytes();return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(bytes.length)//文件处理方式.header("Content-Disposition" , "attachment;filename=haha.png").body(bytes);}
首先返回值为一个响应体为字节流的响应体,理由是可以调用响应头的文件类型,然后开始把自己想传输的文件整成一个文件流,然后在ResponseEnitity中配置整个响应的信息。
ps:ResponseEntity.ok()/contentType返回的都是ResponseEntity类,所以顺序先后不影响 , APPLICATION_OCTET_STREAM是八进制流文件。
相关文章:

ssm学习笔记day04
RequestMapping 首先添加依赖 Maven的配置 测试 在controller创建HelloController,如果只加RequestMapping,默认跳转到新页面 如果要是加上ResponseBody就把数据封装在包(JSON),标签RestController是前后分离的注解(因为默认用…...

Read View在MVCC里如何工作
Read View的结构 Read View中有四个重要的字段: m_ids:创建 Read View 时,数据库中启动但未提交的「活跃事务」的事务 id 列表 。min_trx_id:创建 Read View 时,「活跃事务」中事务 id 最小的值,即 m_ids …...
HDFS 写入和读取流程
HDFS 写入流程细化 1. 主线流程速记口诀 “先找主脑定文件,分配块副找节点;流水传块多副本,写完通知主脑存。” 2. 详细流程拆解 1. 客户端请求上传(Create 文件) 关键方法: org.apache.hadoop.fs.File…...

建筑工程施工进度智能编排系统 (SCS-BIM)
建筑工程施工进度智能编排 (SCS-BIM) 源码可见于:https://github.com/Asionm/SCS-BIM 项目简介 本项目是一个面向建筑工程的施工进度智能编制平台,用户只需上传一份标准 IFC 建筑信息模型文件,系统将自动完成以下任务: 解析模…...
Laravel模型状态:深入理解Eloquent的隐秘力量
Laravel的Eloquent ORM(对象关系映射)提供了强大且灵活的功能来处理数据库操作。深入理解Eloquent模型状态对于优化应用程序性能和维护代码的简洁性至关重要。本文将详细探讨Laravel Eloquent的模型状态及其隐秘力量。 一、Eloquent模型的基本概念 Elo…...
Spring Cloud Eureka:微服务架构中的服务注册与发现核心组件
前言 在微服务架构日益流行的今天,服务注册与发现机制成为了构建弹性、可扩展分布式系统的关键。作为Spring Cloud生态中的核心组件,Eureka为微服务架构提供了高效的服务注册与发现解决方案。本文将深入探讨Eureka的设计原理、核心机制以及在实际项目中…...
matlab实现求解兰伯特问题
求解兰伯特问题的matlab代码,非常好用 solve_lambertLYP.m , 1899 StumpffC.m , 136 StumpffdF.m , 294 StumpffF.m , 151 StumpffS.m , 167 Stumpffy.m , 96 text2.m , 104...
iOS 集成网易云信的音视频呼叫组件
云信官方文档在这 前提是集成了云信IM,并且已经IM登录成功,如果没有集成IM的看这里:iOS 集成网易云信IM-CSDN博客 1、CocoPods集成 #云信 pod NIMSDK_LITE, 10.8.0pod NERtcSDK, 5.6.50#rtc基础SDK pod NEChatUIKit#呼叫组件API组件 pod NE…...
【Elasticsearch】search_after不支持随机到哪一页,只能用于上一页或下一页的场景
search_after 确实不支持随机访问(即直接跳到任意一页),因此在前端需要随机跳转到某一页的场景中,使用 search_after 是不合适的。这种情况下,更适合使用 from 和 size 来实现分页。 为什么 search_after 不支持随机访…...
深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理
文章目录 深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理QObject 的继承关系QObject 的内存与生命周期管理父子对象树结构构造函数中的父对象参数父对象删除时自动删除子对象的原理举例说明 父子对象关系的好处继承关系与构造函数调用顺序信号槽机制与对…...

pikachu通关教程-XSS
XSS XSS漏洞原理 XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。主要基于JavaScript语言进行恶意攻击,因为js非常灵活…...
k8s fsGroup
fsGroup 是 Kubernetes 中 securityContext 的一个字段,用于为 Pod 中的所有容器设置共享的文件系统组 ID(GID)。当你在 Pod 的 securityContext 中设置了 fsGroup,Kubernetes 会对挂载到 Pod 的 所有 volume(卷&#…...
Spring Boot,注解,@ConfigurationProperties
好的,这是上面关于 ConfigurationProperties 注解和 setter 方法的判断题及其解析的中文版本: 该判断题表述为:“使用ConfigurationProperties 注解注入属性值时,必须为对应的属性提供setter方法。” 这个说法是 正确的。 Config…...

AIGC学习笔记(9)——AI大模型开发工程师
文章目录 AI大模型开发工程师008 LangChain之Chains模块1 Chain模块核心知识2 Chain模块代码实战LLMSequentialTransformationRouter AI大模型开发工程师 008 LangChain之Chains模块 1 Chain模块核心知识 组合常用的模块 LLM:最常见的链式操作类型SequentialChain…...
git管理github上的repository
1. 首先注册github并创建一个仓库,这个很简单,网上教程也很多,就不展开说了 2. 安装git,这个也很简单,不过这里有个问题就是你当前windows的用户名即:C/Users/xxx 这个路径不要有中文,因为git …...
STM32学习之WWDG(原理+实操)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法
Keil MDK5.37预装的是最新的ARM Compiler Version6 我们可以先右击查看工程属性 在Target标签下,我们可以看到Compiler Version5就是丢失的 在Target标签下,我们可以看到Compiler Version5就是丢失的 图1 以固件库方式编程,编译之后全是错…...
【iOS(swift)笔记-14】App版本不升级时本地数据库sqlite更新逻辑二
App版本不升级时,又想即时更新本地数据库怎么办? 办法二:从服务器下载最新的sqlite数据替换掉本地的数据(注意是数据不是文件) 稍加调整, // !!!注意!&…...
前端性能优化:提升用户体验的关键策略
引言 在当今快速发展的互联网时代,用户对网页加载速度和交互流畅度的要求越来越高。前端性能优化已成为提升用户体验、降低跳出率、提高转化率的关键因素。本文将深入探讨前端优化的核心策略和实践方法,帮助开发者构建更快、更高效的Web应用。 一、网络…...

Unity-UI组件详解
今天我们来学习Unity的UI的详解,这部分的内容相对较少,对于程序员来说主要的工作是负责将各种格式的图片呈现在显示器上并允许操作这些图片。 本篇帖子的理论依据依然是官方开源的UGUI代码,网址为:GitHub - Unity-Technologies/u…...
基于大模型的短暂性脑缺血发作(TIA)全流程预测与干预系统技术方案
目录 一、系统架构总览二、核心模块详细设计三、系统集成方案四、系统部署拓扑图五、技术验证方案六、健康管理子系统七、安全与合规设计技术指标与性能保障八、HL7 FHIR接口规范九、分层蒸馏方案十、多中心RCT研究设计十一、硬件选型成本优化方案跨模块集成工作流一、系统架构…...
嵌入式学习 D31:系统编程--Framebuf帧缓冲
(1)framebuf帧缓冲 :linux提供的显示设备驱动的接口。 设备路径 : 设备/dev/fb0 * 分辨率:像素点是w * h。 每个像素点色深 RGB:0-255 红绿蓝各3字节(byte)即可描述色深。…...

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐
简历上展示黑马点评 完整代码地址 项目描述 黑马点评项目是一个springboot开发的前后端分离项目,使用了redis集群、tomcat集群、MySQL集群提高服务性能。类似于大众点评,实现了短信登录、商户查询缓存、优惠卷秒杀、附近的商户、UV统计、用户签到、好…...

Java 大视界 -- Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(273)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

【数据库】安全性
数据库安全性控制的常用方法:用户标识和鉴定、存取控制、视图、审计、数据加密。 1.用户标识与鉴别 用户标识与鉴别(Identification & Authentication)是系统提供的最外层安全保护措施。 2.存取控制 2.1自主存取控制(简称DAC) (1)同一用户对于不同的数据对…...

【图像处理入门】4. 图像增强技术——对比度与亮度的魔法调节
摘要 图像增强是改善图像视觉效果的核心技术。本文将详解两种基础增强方法:通过直方图均衡化拉伸对比度,以及利用伽马校正调整非线性亮度。结合OpenCV代码实战,学会处理灰度图与彩色图的不同增强策略,理解为何彩色图像需在YUV空间…...
D2-基于本地Ollama模型的多轮问答系统
本程序是一个基于 Gradio 和 Ollama API 构建的支持多轮对话的写作助手。相较于上一版本,本版本新增了对话历史记录、Token 计数、参数调节和清空对话功能,显著提升了用户体验和交互灵活性。 程序通过抽象基类 LLMAgent 实现模块化设计,当前…...

HALCON 深度学习训练 3D 图像的几种方式优缺点
HALCON 深度学习训练 3D 图像的几种方式优缺点 ** 在计算机视觉和工业检测等领域,3D 图像数据的处理和分析变得越来越重要,HALCON 作为一款强大的机器视觉软件,提供了多种深度学习训练 3D 图像的方式。每种方式都有其独特的设计思路和应用场…...
123网盘SDK-npm包已发布
前言 大家好!今天想和大家分享一个我最近开源的项目:123 网盘 SDK。这个项目已经在 GitHub 开源,最近已经发布到 NPM,可以通过 npm i ked3/pan123-sdk 直接安装使用。 项目背景:为什么要开发这个 SDK? 在…...
强制卸载openssl-libs导致系统异常的修复方法
openssl升级比较麻烦,因为很多软件都会依赖它,一旦强制卸载(尤其是openssl-libs.rpm),就可能导致很多命令不可用,即使想用rpm命令重新安装都不行。 所以,除非万不得已,否则不要轻易去卸载openssl-libs。而且…...