ssm学习笔记day04

article/2025/6/7 12:20:46

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是八进制流文件。


http://www.hkcw.cn/article/aGlSftZeCj.shtml

相关文章

Spine工具入门教程4之网格与权重

1、概念 网格的定义&#xff1a; 启用网格&#xff0c;可以在图片内设置多边形&#xff0c;操纵多边形的顶点可以让图片变形。 权重的定义&#xff1a; 图解网格和权重的操作方法&#xff1a; 2、调整网格/权重 &#xff08;1&#xff09;设置网格 目前调整小臂骨骼对图片不…

吉他入门个人学习笔记

目录 一.一二期 1. 十二平均律 2.调音 3.弦数-音名-唱名 三.第三期 1.43231323训练 2.c大调二十四品常用音阶图 四.第四期 1.小星星 2.爬格子训练 五.第五期 六.第六期——大三和弦 和弦总览 1.C和弦 2.D和弦 3.E和弦 4.G和弦 5.A和弦 第七期.小三和弦 五百…

队列的讲解:C++队列的使用

一.队列的介绍&#xff1a; 队列是C/C中最基础的数据结构之一&#xff0c;队列本质上是一种线性表。它遵循着先进先出(fifo)的特点&#xff0c;在队列中一般在队尾插入&#xff0c;队头出队。这就相当于排队一样&#xff0c;刚入队的人需要排在队尾(rear)&#xff0c;每次出队…

使用Process Explorer、System Informer(Process Hacker)和Windbg工具排查软件高CPU占用问题

目录 1、问题现象 2、使用Process Explorer和System Informer&#xff08;该工具原先叫Process Hacker&#xff09;查看占用CPU高的线程 3、使用System Informer工具时发现了一个关键细节 4、将Windbg附加到软件进程上&#xff0c;根据System Informer中显示的线程id到Wind…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷

我的初衷&#xff1a;我想学习AI。具体的方向是这样的&#xff1a;原本传统的平台业务去对接智能体。比如发票业务&#xff0c;发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息&#xff0c;可以通过智能体给出需要处理的…

【八股消消乐】索引失效与优化方法总结

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

Java面试八股--06-Linux篇

目录 一、Git 1、工作中git开发使用流程&#xff08;命令版本描述&#xff09; 2.Reset与Rebase&#xff0c;Pull与Fetch的区别 3、git merge和git rebase的区别 4、git如何解决代码冲突 5、项目开发时git分支情况 二、Linux 1、Linux常用的命令 2、如何查看测试项目的…

动态规划-647.回文子串-力扣(LeetCode)

一、题目解析 这里的子字符串是连续的&#xff0c;与之前的子序列不同&#xff0c;这里需要我们统计回文子串的数目。 二、算法原理 这里也有其他算法可以解决该问题&#xff0c;如中心扩展算法 时间复杂度O(N^2)/空间复杂度O(1)&#xff0c;马拉车算法(具有局限性) 时间复杂…

条形进度条

组件 <template><view class"pk-detail-con"><i class"lightning" :style"{ left: line % }"></i><i class"acimgs" :style"{ left: line % }"></i><view class"progress&quo…

大模型赋能:金融智能革命中的特征工程新纪元

一、AI进化论&#xff1a;从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面&#xff1a;银行风控模型像老式收音机&#xff0c;需要人工反复调试参数才能捕捉风险信号&#xff1b;而大模型则是智能调音台&#xff0c;能自动“听…

HA: Wordy靶场

HA: Wordy 来自 <HA: Wordy ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.130 3&#xff0c;对靶机进行端口服务探…

技巧小结:外部总线访问FPGA寄存器

概述 需求&#xff1a;stm32的fsmc总线挂载fpga&#xff0c;stm32需要访问fpga内部寄存器 1、分散加载文件将变量存放到指定地址即FPGA寄存器地址 sct文件指定变量存储地址&#xff0c;从而可以直接访问外设&#xff0c;&#xff08;28335也可以&#xff0c;不过用的是cmd文件…

深入理解 x86 汇编中的重复前缀:REP、REPZ/REPE、REPNZ/REPNE(进阶详解版)

一、重复前缀&#xff1a;串操作的 “循环加速器” 如果你写过汇编代码&#xff0c;一定遇到过需要重复处理大量数据的场景&#xff1a; 复制 1000 字节的内存块比较两个长达 200 字符的字符串在缓冲区中搜索特定的特征值 手动用loop指令编写循环&#xff1f;代码冗长不说&a…

【PCB设计】STM32开发板——原理图设计(电源部分)

一、PCB设计流程 二、准备工作 1.点击文件新建工程并命名 2.新建图页 在绘制较为复杂的原理图时&#xff0c;可以建立多个图页&#xff0c;使得原理图更加清晰。 右击原理图→新建图页 右击→重命名 3.设计规则相关配置 取消勾选第22个 4.调整页面大小 5.放置“电源树”图片…

C++仿RabbitMQ实现消息队列

前言 本项目将使用 C 在 Linux&#xff08;CentOS 7.6&#xff09; 环境下开发一个仿 RabbitMQ 的简易消息队列。 开发和调试环境如下&#xff1a; 操作系统&#xff1a;Linux (CentOS 7.6) 编辑器&#xff1a;Visual Studio Code / Vim 编译器&#xff1a;g&#xff08;GNU…

离散数学_数理逻辑(二):命题逻辑的推理

前言 每一件事都存在现象和本质.现象是表面,本质是内在.数学可以说是自然科学之母,是一切自然现象的本质.对于编程,表面上是在写代码,实际上是在用离散数学理解问题和解决问题. 引入 命题逻辑的推理部分. "推理"在思考中占了很大比重.笔者曾经把学习方法分了两种:一…

KITTI数据集(计算机视觉和自动驾驶领域)

KITTI&#xff08;Karlsruhe Institute of Technology and Toyota Technological Institute at Chicago&#xff09;数据集是计算机视觉和自动驾驶领域中最广泛使用的基准数据集之一。它由德国卡尔斯鲁厄理工学院和美国芝加哥丰田技术研究所联合发布&#xff0c;旨在推动自动驾…

力扣4.寻找两个正序数组的中位数

文章目录 题目介绍题解 题目介绍 题解 题解链接&#xff1a;题解 核心思路&#xff1a;通过二分查找的确定分割点使左右两部分元素数量相等。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n1 nums1.length;int n2 nums2.length…

Windows下将Nginx设置注册安装为服务方法!

一、需求背景 每次启动 Nginx 都要去到 Nginx 安装目录下寻找 nginx.exe 文件点击&#xff0c;很是麻烦。 并且远程登录桌面&#xff0c;有时注销用户&#xff0c;会把在当前用户打开的nginx关闭了。 于是考虑可不可以跟其它服务一样能够开机自启&#xff1f;显然是可以的。…