ssm学习笔记day04

news2025/6/6 12:04:55

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

    @Override
    public 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;
    }

    @Override
    public 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();

    @Nullable
    String getOriginalFilename();

    @Nullable
    String 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 可以参考javaweb
        String 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 可以参考javaweb
        String 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.coloradmin.cn/o/2398485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Read View在MVCC里如何工作

Read View的结构 Read View中有四个重要的字段&#xff1a; m_ids&#xff1a;创建 Read View 时&#xff0c;数据库中启动但未提交的「活跃事务」的事务 id 列表 。min_trx_id&#xff1a;创建 Read View 时&#xff0c;「活跃事务」中事务 id 最小的值&#xff0c;即 m_ids …

建筑工程施工进度智能编排系统 (SCS-BIM)

建筑工程施工进度智能编排 (SCS-BIM) 源码可见于&#xff1a;https://github.com/Asionm/SCS-BIM 项目简介 本项目是一个面向建筑工程的施工进度智能编制平台&#xff0c;用户只需上传一份标准 IFC 建筑信息模型文件&#xff0c;系统将自动完成以下任务&#xff1a; 解析模…

pikachu通关教程-XSS

XSS XSS漏洞原理 XSS被称为跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;&#xff0c;由于和层叠样式表&#xff08;Cascading Style Sheets&#xff0c;CSS&#xff09;重名&#xff0c;改为XSS。主要基于JavaScript语言进行恶意攻击&#xff0c;因为js非常灵活…

AIGC学习笔记(9)——AI大模型开发工程师

文章目录 AI大模型开发工程师008 LangChain之Chains模块1 Chain模块核心知识2 Chain模块代码实战LLMSequentialTransformationRouter AI大模型开发工程师 008 LangChain之Chains模块 1 Chain模块核心知识 组合常用的模块 LLM&#xff1a;最常见的链式操作类型SequentialChain…

Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法

Keil MDK5.37预装的是最新的ARM Compiler Version6 我们可以先右击查看工程属性 在Target标签下&#xff0c;我们可以看到Compiler Version5就是丢失的 在Target标签下&#xff0c;我们可以看到Compiler Version5就是丢失的 图1 以固件库方式编程&#xff0c;编译之后全是错…

Unity-UI组件详解

今天我们来学习Unity的UI的详解&#xff0c;这部分的内容相对较少&#xff0c;对于程序员来说主要的工作是负责将各种格式的图片呈现在显示器上并允许操作这些图片。 本篇帖子的理论依据依然是官方开源的UGUI代码&#xff0c;网址为&#xff1a;GitHub - Unity-Technologies/u…

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

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

Java 大视界 -- Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(273)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

【数据库】安全性

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

【图像处理入门】4. 图像增强技术——对比度与亮度的魔法调节

摘要 图像增强是改善图像视觉效果的核心技术。本文将详解两种基础增强方法&#xff1a;通过直方图均衡化拉伸对比度&#xff0c;以及利用伽马校正调整非线性亮度。结合OpenCV代码实战&#xff0c;学会处理灰度图与彩色图的不同增强策略&#xff0c;理解为何彩色图像需在YUV空间…

HALCON 深度学习训练 3D 图像的几种方式优缺点

HALCON 深度学习训练 3D 图像的几种方式优缺点 ** 在计算机视觉和工业检测等领域&#xff0c;3D 图像数据的处理和分析变得越来越重要&#xff0c;HALCON 作为一款强大的机器视觉软件&#xff0c;提供了多种深度学习训练 3D 图像的方式。每种方式都有其独特的设计思路和应用场…

FreeRTOS的简单介绍

一、FreeRTOS介绍 FreeRTOS并不是实时操作系统&#xff0c;因为它是分时复用的 利用CubeMX快速移植 二、快速移植流程 1. 在 SYS 选项里&#xff0c;将 Debug 设为 Serial Wire &#xff0c;并且将 Timebase Source 设为 TIM2 &#xff08;其它定时器也行&#xff09;。为何…

深入解析C++引用:从别名机制到函数特性实践

1.C引用 1.1引用的概念和定义 引用不是新定义⼀个变量&#xff0c;而是给已存在变量取了⼀个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同⼀块内存空间。比如四大名著中林冲&#xff0c;他有一个外号叫豹子头&#xff0c;类比到C里就…

项目交付后缺乏回顾和改进,如何持续优化

项目交付后缺乏回顾和改进可通过建立定期回顾机制、实施反馈闭环流程、开展持续学习和培训、运用数据驱动分析、培养持续改进文化来持续优化。 其中&#xff0c;实施反馈闭环流程尤其重要&#xff0c;它能够确保反馈信息得到有效传递、处理与追踪&#xff0c;形成良好的改进生态…

从0开始学习R语言--Day15--非参数检验

非参数检验 如果在进行T检验去比较两组数据差异时&#xff0c;假如数据里存在异常值&#xff0c;会把数据之间的差异拉的很大&#xff0c;影响正常的判断。那么这个时候&#xff0c;我们可以尝试用非参数检验的方式来比较数据。 假设我们有A&#xff0c;B两筐苹果&#xff0c…

EC2 实例详解:AWS 的云服务器怎么玩?☁️

弹性计算、灵活计费、全球可用&#xff0c;AWS EC2 全攻略 在 AWS 生态中&#xff0c;有两个核心服务是非常关键的&#xff0c;一个是 S3&#xff08;对象存储&#xff09;&#xff0c;另一个就是我们今天的主角 —— Amazon EC2&#xff08;Elastic Compute Cloud&#xff09…

第三发 DSP 点击控制系统

背景 ​ 在第三方 DSP 上投放广告&#xff0c;需要根据 DP Link 的点击次数进行控制。比如当 DP Link 达到 5000 后&#xff0c;后续的点击将不能带来收益&#xff0c;但是后续的广告却要付出成本。因此需要建立一个 DP Link 池&#xff0c;当 DP Link 到达限制后&#xff0c;…

【笔记】在 MSYS2 MINGW64 环境中降级 NumPy 2.2.6 到 2.2.4

&#x1f4dd; 在 MSYS2 MINGW64 环境中降级 NumPy 到 2.2.4 ✅ 目标说明 在 MSYS2 的 MINGW64 工具链环境中&#xff0c;将 NumPy 从 2.2.6 成功降级到 2.2.4。 &#x1f9f0; 环境信息 项目内容操作系统Windows 11MSYS2 终端类型MINGW64&#xff08;默认终端&#xff09;Py…

vue入门环境搭建及demo运行

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 vue简介&#xff1a;第一步&#xff1a;安装node.jsnode简介第二步&#xff1a;安装vue.js第三步&#xff1a;安装vue-cli工具第四步 &#xff1a;安装webpack第五步…

原始数据去哪找?分享15个免费官方网站

目录 一、找数据的免费官方网站 &#xff08;一&#xff09;国家级数据宝库&#xff1a;权威且全面 1.中国国家统计局 2.香港政府数据中心 3.OECD数据库 &#xff08;二&#xff09;企业情报中心&#xff1a;洞察商业本质 4.巨潮资讯 5.EDGAR数据库 6.天眼查/企查查&a…