Spring MVC(建立连接 + 请求)

文章目录

  • 一、建立客户端和服务器的连接
  • 二、如何构造请求(传参)
    • 2.1 构造请求方式 + 参数通用注解
    • 2.2 传递单个参数
    • 2.3 传递多个参数
    • 2.4 传递数组/集合
    • 2.5 传递对象
    • 2.6 传递JSON
  • 三、相关的其他请求操作
    • 3.1 获取URL中的参数 @PathVariable
    • 3.2 上传文件 @RequestPart
    • 3.3 获取和设置 Cookie/Session
      • Cookie和Session相关概念
      • 获取 + 设置 Cookie
      • 获取 + 设置Session
    • 3.4 获取Header

一、建立客户端和服务器的连接

  1. 如何建立:@RequestMapping
    • 通过 @RequestMapping 注解建立一个路由映射
    • 由于Spring Boot 内置了Tomcat,Tomcat会帮我们根据这个路由映射,去找到执行的文件
  2. @RequestMapping
    • 修饰对象:类和方法都可以修饰
    • 支持的方法:所以的请求方法都支持
      • 关于指定支持的方法:使用method属性
@RestController
@RequestMapping("/test")
public class HelloController {
    @RequestMapping(value = "/sayhi",method = RequestMethod.GET)
    public String sayHi(){
        return "hello";
    }
}
  1. 注解的属性:如果注解没有写属性名,默认属性名是value,而一旦有多个就需要区分哪个是哪个了

  2. 地址相关问题

    • 访问地址:类的路径/方法路径
    • 路径的写法
      • 层级:可以写多层,如@RequestMapping(“/hello/m1”)
      • 类路径:企业开发商建议写上类路径,因为这既可以减少名字的重复率,降低取名的难度,还可以方便我们查找代码
      • 关于/:理论上可以省略,但实际在企业开发上,建议加上,且是前加后不加 -------> 【/hello/m1】
      • 路径名VS方法名:两者没有什么关系,可以不一样,但是我们通常会取名一样,因为这样可以减少取名频率,且方便我们查找代码

二、如何构造请求(传参)

2.1 构造请求方式 + 参数通用注解

  1. 请求构造方式

    • 两种方法:请求的构造主要由前端或工具两种方式构造
    • 为什么我们使用Postman:但由于前后端分离,后端开发人员只需要提供一个接受参数的服务即可,至于怎么传参是前端的事,所以我们一般不用前者,而且为了测试个后端代码,还要写个前端很不值当。所以,我们此处所讲的都是通过postman来构造请求。
  2. 如何构造post请求)

    • 依靠前端:依靠前端的form表单/ajax
    • 依靠工具:使用Postman工具构造
  3. 如何传递JSON对象

    • 依靠前端:依靠前端的ajax传递
    • 依靠工具:使用Postman工具构造
  4. Postman使用的简单介绍:与HTTP格式一一对应

    • 为什么优先使用POST:Postman如果使用GET请求,Spring会默认从查询字符串里拿数据,这是Postman的默认设置,此时如果要传的数据是JSON之类的,就会出bug。所以,我们优先使用POST方法

在这里插入图片描述

在这里插入图片描述

  1. 后端参数重命名:@RequestParam注解,注解里面的参数是“前端传的”,后面的则是“后端想用的”
    • 底层逻辑:服务器获取到name对应的值后,将其赋值给username
    • 注意点:使用这个注解后,重命名的参数就变成必传参数了。如果想修改为“非必传”,只需要把required这个属性设置为false即可。
      在这里插入图片描述
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/m4")
    public String m4(@RequestParam("name") String username){
        return username;
    }
}

2.2 传递单个参数

  1. 底层逻辑
    • 从请求的参数中,获取参数名为name的值,并给name赋值。
    • 相当于封装了Servlet的getPartmer方法,所以后端参数名要求和传的参数名一致。
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/m1")
    public String m1(String name){
        return name;
    }
}

在这里插入图片描述

2.3 传递多个参数

  1. 如果设置的值未传怎么办:值为nul
    • 为何推荐使用包装类:因为如果未传值,该参数就会被赋值为null,如果此时数据类型为基本数据类型就会报错。所以企业开发中,我们建立使用包装类。
  2. 参数顺序:传递原理参考【传递单个参数】,所以参数传递顺序是无所谓的
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/m2")
    public String m2(String name, Integer age){
        return "name:" + name + ", age:" + age;
    }
}

在这里插入图片描述

2.4 传递数组/集合

  1. 原理:当发送的请求中,同一个参数有多个时,浏览器会默认帮我们给封装成一个数组
  2. 传递数组
    • 两种请求路径
      • 参数间使用&:127.0.0.1:8080/param/m1?name=李四&name=张三&name=王五
      • 参数间使用,:127.0.0.1:8080/param/m1?name=李四,张三,王五
    • 后端代码
@RestController
@RequestMapping("/param")
public class ParamController {

    @RequestMapping("/m1")
    public String m1(String[] name){
        //使用lambda表达式进行循环
        Arrays.stream(name).forEach(s -> {
            System.out.print(s + " ");
        });
        return "已经正常接受数组";
    }
}
  1. 传递集合:使用 @RequestParam
    • 为什么要使用注解:因为如果收到多个同参数名的参数,Spring会默认帮我们封装为数组,此时我们是无法用调用集合的方法的。所以我们需要用@RequestParam注解告诉Spring这个参数是个集合。
    • 请求路径:和【传递数组】的传递方法一样
    • 后端代码
@RestController
@RequestMapping("/param")
public class ParamController {

    @RequestMapping("/m2")
    public String m2(@RequestParam List<String> name){
        return "接收到的list对象有:" + name.toString();
    }
}

2.5 传递对象

  1. 原理
    • 前三种方法的弊端
      • 一旦我们需要更改参数,就需要去修改接口定义,并且通知所以调用这个方法的地方,全部改请求参数,这十分繁琐。
      • 一旦前端未传一个后端业务运行所必须的参数,程序就会报错,容错率低
    • 为什么使用对象
      • 如果要修改参数,我们直接在对象内部添加即可
      • 遇到前端未传后端必须的数据时,后端代码里加点逻辑即可
  2. 后端代码
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/m3")
    public String m3(Person person){
        return person.toString();
    }
}
public class Person {
    private String name;
    private String age;
}
  1. 请求发送:共有两种方法
    • query string:query string里直接把值放进去,Spring 会帮我们进行关系的映射。如【127.0.0.1:8080/param/m3?name=lisi&age=15】
    • JSON:解决了第一种方法query string内容太多的问题

2.6 传递JSON

  1. 什么是JSON
    • 一种轻量级的数据交互格式
    • 本质是一个字符串,可以和Java对象互相转换
      • 如何互转:使用ObjectMapper类的方法
  2. JSON的泛用性:因为只是数据交互格式,故而实际上面所有的传参都可以通过JSON来传
  3. JSON的格式介绍
    • 键值对
      • 存储地点:数据保存在键值对(Key/Value)中
      • 数据类型:key全部都是字符串,所以要用引号引起来,value则可以是各种类型
      • 分隔问题:键和值使用冒号分隔,数据之间则用逗号分隔
    • 对象和数组表示方法:对象用{}表示,数组用[]表示
  4. 如何传递JSON数据:使用 @RequestBody 注解
    • 为什么要使用该注解
      • 默认情况下,Spring MVC 会将请求参数绑定到方法的参数上,但请求体中的数据并不包含在标准的请求参数中(原本是key-value,传过来直接变成了一整个数据)
      • @RequestBody注解可以让Spring自动把Body里的数据转成对象
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m1")
    public String m1(@RequestBody Person person){
        return "收到的对象是:" + person.toString();
    }
}

在这里插入图片描述

三、相关的其他请求操作

3.1 获取URL中的参数 @PathVariable

  1. 获取一个URL
    在这里插入图片描述
  2. 可以获取多个URL,但要注意顺序:因为对于URL来说,他并不知道这些值有什么作用,它只会按照顺序放,不会一一对应
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m2/{userId}/{userName}")
    public String m2(@PathVariable Integer userId, @PathVariable String userName){
        return "接受到的userId为:" + userId + ", userName为:" + userName;
    }
}
  1. 请求格式必须要和后端定义的URL格式,不一致会报错
  2. 关于改名
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m2/{id}/{userName}")
    public String m2(@PathVariable("id") Integer userId, @PathVariable String userName){
        return "接受到的id为:" + userId + ", userName为:" + userName;
    }
}

3.2 上传文件 @RequestPart

  1. 如何上传:使用MultipartFile类接收文件 + @RequestPart 注解 + form-data式发送
    • 关于 MultipartFile类:可以接收各种文件,此处我们不用File类
    • 关于 form-data:以表单的形式传输二进制数据,而文件底层就是一大串二进制数据
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m3")
    public String m3(@RequestPart MultipartFile file) throws IOException {
    	//打印传过来的文件名,此处是【普洱.jpg】
        System.out.println(file.getOriginalFilename());
        //将传过来的文件保存在当前机器上,路径为【D:/apply/+file.getOriginalFilename()】
        file.transferTo(new File("D:/apply/" + file.getOriginalFilename()));
        return "success";
    }
}

在这里插入图片描述

3.3 获取和设置 Cookie/Session

Cookie和Session相关概念

结合这个理解

  1. 为什么会有Cookie和Session
    • (1)HTTP是无状态的,即没有记忆功能,现在请求和过一会请求,同样的请求参数只会执行同样的处理逻辑。
    • (2)这就意味着,哪怕访问的是一个频繁访问的路径,我们也需要反复登录
    • (3)但有时候,我们需要让我们的服务有记忆功能,Cookie和Session就可以满足这个需求
  2. Cookie可以伪造,Session不行
  3. Cookie 和 Session 都是会话机制
    • 什么是会话机制:会话即对话
      在这里插入图片描述

获取 + 设置 Cookie

这是获取

  1. 使用Servlet原生的API获取可以获取到所有的Cookie
    • 为何能使用:因为Spring 是基于Servlet封装的,所以Servlet能用的,他都能用
    • HttpServletRequest和HttpServletResponse:都是Spring的内置对象,可以两个都加上,也可以只放一个,根据需求来
    • 为何要伪造Cookie:如果此时没有Cookie,cookies就会为null,后面更是会空指针异常。所以在没有Cookie的情况下,我们如果要测试该代码,需要伪造Cookie。
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies = request.getCookies();

        //使用lambda表达式进行循环
        Arrays.stream(cookies).forEach(cookie -> {
            System.out.println(cookie.getName() + ":" + cookie.getValue());
        });

        return "success";
    }
}
  1. 使用@CookieValue注解获取只能获取到指定的Cookie
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/getCookie")
    public String getCookie(@CookieValue String name, @CookieValue Integer age){ 
    	//可以放置多个参数 
        return "Cookie存储的name为" + name;
    }
}

这是伪造Cookie

在这里插入图片描述
在这里插入图片描述

获取 + 设置Session

获取

  1. 使用内置对象 HttpServletRequest
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession(false);  //默认值为true
        if (session != null){
            String username = (String)session.getAttribute("username");
            return "登录用户:" + username;
        }

        return "session 为空";
    }
}
  1. 使用内置对象 HttpSession
    • 对 HttpSession session 的理解:相当于第一种方法的【request.getSession(true)】
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/getSession")
    public String getSession(HttpSession session){
        String username = (String)session.getAttribute("username");
        return "username为:" + username;
    }
}
  1. 使用 @SessionAttribute 注解
    • 注意该参数变成了必传的:该注解的内部定义
      在这里插入图片描述
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/getSession")
    public String getSession(@SessionAttribute String username){
        return "session中存储的username为:" + username;
    }
}

设置

  1. 通过Servlet方法设置:因为Session是服务端的,我们没有办法进行伪造,所以只能通过后端代码创建
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("username", "zhangsan");
        return "success";
    }
}

在这里插入图片描述

3.4 获取Header

  1. 使用内置对象HttpServletRequest
@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        //获取Header中某个key的值
        String userAgent = request.getHeader("User-Agent");
        return "userAgent:" + userAgent;
    }
}
  1. 使用@RequestHeader注解
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/619055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIP-Datacom-ARST自选题库_07_割接【35道题】

一、单选题 1.在割接的测试阶段&#xff0c;符合以下哪一种情况的可以判断为割接成功? 网络承载的上层应用业务测试正常 网络设备的配置查看结果正常 网络流量路径正常 路由协议运行正常 2.在割接的测试阶段中&#xff0c;表明已经完成测试的标准是: IP设备的配置查看结…

Docker 直接运行一个 Alpine 镜像

由于镜像很小&#xff0c;下载时间往往很短&#xff0c;读者可以直接使用 docker run 指令直接运行一个 Alpine 容器&#xff0c;并指定运行的 Linux 指令&#xff0c;例如&#xff1a; PS C:\Users\yhu> docker run alpine echo 123 Unable to find image alpine:latest lo…

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…

Nios-II编程

文章目录 一硬件部分设计1Qsys2Quartus 二软件1Nios-II Eclipse 三运行项目及效果1配置 FPGA 一硬件部分设计 1Qsys 1创建一个项目 2点击 Tools 下拉菜单下的 Platform Designer 工具&#xff0c;启动 Platform Designer 后&#xff0c;点击 File-save&#xff0c;在文件名中…

易图讯智慧公安警用三维电子沙盘系统

智慧公安警用三维电子沙盘系统是一个结合现代科技手段&#xff0c;为公安部门提供全面、高效、智能的警务管理解决方案的系统。该系统以“情报大数据、指挥扁平化、勤务可视化、情指勤一体化”为设计思想&#xff0c;整合了多台设备、有无线通讯、短信平台、天网、交通平台、治…

活字格中如何打开指定文件夹

如何使用活字格打开指定文件夹 活字格是一款功能强大的电子表格软件&#xff0c;除了基本的表格计算功能之外&#xff0c;还提供了丰富的扩展功能&#xff0c;可以用来实现各种自动化操作。例如&#xff0c;我们可以使用活字格来打开指定的文件夹。 以下是具体的操作步骤&…

重学JavaScript高阶知识点(三)—— 详解Js中的内存管理

详解Js中的内存管理 1. 简介2. 内存生命周期3. JavaScript 的内存分配4. 垃圾回收 1. 简介 很多底层语言一般都有底层的内存管理接口&#xff0c;比如 C语言&#xff0c;可以调用对应的API去创建和释放内存空间。意思是需要手动去创建和释放内存空间&#xff0c;很明显&#x…

【C++11】列表初始化、右值引用的详细讲解(上)

前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全&#xff0c;不仅功能更强大&#xff0c;而且能提升程序员的开发效率加了许多特性&#xff0c;约140个新特性。使得C…

电商核心技术揭秘55:社群与粉丝经济的结合

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

OpenAI下周发布更新;TikTok将自动标记AIGC;智谱AI亮相2024 ICLR

OpenAI 官宣下周举办直播发布更新 OpenAI 今日凌晨官宣&#xff0c;将在当地时间 5 月 13 日上午十点&#xff08;北京时间 5 月 14 日凌晨两点&#xff09;在官网进行直播&#xff0c;届时将演示一些 ChatGPT 和 GPT-4 的更新。 OpenAI CEO Sam Altman 补充表示&#xff0c;届…

【论文润色心得】博士生的福音来啦!

&#x1f31f;【论文润色心得】博士生的福音来啦&#xff01;&#x1f393; &#x1f4da; 投稿屡遭拒绝&#xff1f;语言关难过&#xff1f;看这里&#xff0c;我找到了解决之道&#xff01;&#x1f469;‍&#x1f3eb; &#x1f4a1; 我的润色经历&#xff0c;从拒稿到接…

springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具&#xff0c;它将数字和统计信息转化为直观的视觉元素&#xff0c;如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域&#xff0c;包括&#xff1a; 商务分…

鸿蒙开发学习:初探【ArkUI-X】

ArkTS 是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配 ArkUI 框架&#xff0c;扩展了声明式 UI 、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 ArkUI-X 进一步将 ArkUI 扩展到了多个 OS 平台…

【三十一】springboot+easyExcel实现多文件导出压缩包

互相交流入口地址 整体目录&#xff1a; 【一】springboot整合swagger 【二】springboot整合自定义swagger 【三】springboot整合token 【四】springboot整合mybatis-plus 【五】springboot整合mybatis-plus 【六】springboot整合redis 【七】springboot整合AOP实现日志操作 【…

springcloud -nacos实战

一、nacos 功能简介 1.1.什么是Nacos&#xff1f; 官方简介&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 Nacos的关键特性包括&#xff1a; 服务发现和服务健康监测动态配置服务动态DNS服务服务及其元数…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源&#xff0c;对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源&#xff0c;在主干代码的 applications 目录里聚集了很多原生的应用实现&#xff0c;那么如何编译这些代码就是我们这篇文章的主要…

宝塔面板Java项目部署,五步轻松搞定

当涉及到正规的开发项目时&#xff0c;最终的上线部署是至关重要的一个环节。本文旨在以最简单便捷的方法来教你如何完成项目的部署工作。 1. SSH下载地址 项目完成后需要使用SSH终端进行项目部署&#xff0c;以确保安全的远程访问、和操作远程服务器。 Xshell (支持Windows系…

若依-生成主子表

1. sql语句建表导入到数据库中&#xff1a; -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

第五届电子通讯与人工智能学术会议(ICECAI 2024, 5/31-6/2)

目录 1. 会议官方2. 会议新闻中华人民共和国教育部新闻 3. 出版历史4. 大会简介5. 主办单位与嘉宾主办单位承办单位主讲嘉宾组委会 6. 征稿主题7. 论文出版8. 参会说明 1. 会议官方 2024 5th International Conference on Electronic communication and Artificial Intelligenc…