Spring MVC:Spring 前置知识 & HTTP 请求的参数传递1.0

目录

1. 什么是 Spring MVC

2. Spring Boot - Spring Framework - Spring MVC 之间的关系

3. Spring MVC 的交互过程

3.1 建立连接

3.1.1 @RequestMapping

3.1.1.2 @RequestMapping 路径映射

拓展 - HTTP 状态码

3.2 不同注解支持的请求方式

3.2.1 @RequestMapping

3.2.2 @GetMapping

3.2.3 @PostMapping 

3.3 请求

3.3.1 传递单个参数

3.3.1.1 参数类型: String

 3.3.1.2 Integer / int 

3.3.2 传递多个参数

3.3.2.1 直接写形参接收

3.3.2.2 通过对象接收

3.3.3 后端参数重命名(参数绑定)

3.3.3.1 非必传参数设置

3.3.4 传递数组

3.3.5 传递集合


1. 什么是 Spring MVC

首先, Spring MVC 是一个 web 框架, 全称为 "Spring Web MVC".

Spring Web MVC 是 Spring Framework 中的一个模块, 是基于 Servlet API 构建的原始 Web 框架.

以下是官方对于 Spring Web MVC 的介绍:

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC," comes from the name of its source module (spring-webmvc), but it is more commonly known as "Spring MVC".

Spring Web MVC 广泛被称为 "Spring MVC", 虽然名字带有 MVC, 但更倾向于构建 web 应用程序.

2. Spring Boot - Spring Framework - Spring MVC 之间的关系

首先, Springboot, Spring Framework, Spring mvc 都是 Spring 生态的一部分.

其次, 他们之间的关系如下:

  1. Spring mvc 是 Spring Framework 的一个模块, 专门用于 Web 应用开发, 是 Spring 家族中专门用于构建 Web 应用程序的模块, 并且依赖于 Spring Framework.
  2. Spring Framework 可以认为是 Spring 框架的基础,提供了核心功能和基础设施.
  3. Springboot 可是认为是 Spring Framework 进一步的优化, 建立在 Spring Framework 之上, 用于简化 Spring 应用. 可以说 Spring Boot 包含了 Spring Framework 的功能, 但它不仅包含了 Spring Framework 的所有功能, 还包括了 Spring MVC 以及其他 Spring 项目的功能.

可以说 Spring Boot 包含了(依赖于) Spring Framework, 而 Spring Framework 包含了 Spring MVC 模块. 这种包含关系意味着 Spring Boot 间接地也包含了 Spring MVC.

Spring Boot 提供了一个更高层次的抽象, 使得开发者可以更快速、更轻松地构建和部署 Spring 应用.

所以, 一个 Spring Boot 项目可以同时实现 Spring Framework 和 Spring MVC 的功能.


3. Spring MVC 的交互过程

当用户在浏览器中输入 URL 后, Spring MVC 项目就可以感知到用户发送的请求, 进而返回响应信息.

Spring MVC 和用户进行交互的过程, 主要分为以下三个步骤:

  1. 建立连接: 用户和 java 程序之间建立连接, 使得用户能够调用我们的 Spring 程序.
  2. 请求: 用户发送请求, Spring 程序获取到请求中的参数(用户请求的内容).
  3. 响应: 根据请求, 计算响应后返回响应.

3.1 建立连接

当用户访问一个 URL 时, 这个 URL 中必定包含着用户要访问的服务器主机的 IP, 主机中的某个应用程序(端口号), 已经这个程序的中唯一的一个资源.

而这个资源, 在 URL 中会标明其具体的路径. 而要想和用户之间建立连接, 首先必须确定用户要访问的资源的路径.

资源路径由 类路径和方法路径 构成, 使用 @RequestMapping 注解来进行表示.

3.1.1 @RequestMapping

3.1.1.2 @RequestMapping 路径映射

@RequestMapping 既可以用来修饰类, 也可以用来修饰方法.

当只修饰方法时, 表示当前资源只有方法路径, 没有类路径; 当同时修饰类和方法时, 表示当前资源的路径是类路径 + 方法路径.

但是, 强烈建议, 给所有的类都加上的类路径!! 原因如下:

  1. 避免发生错误
  2. 增加可读性

因为 每个资源的 路径+请求方法 必须唯一(请求方式后面会说), 如果一个资源仅有一个方法路径, 当资源很多时, 这个路径可能就不唯一了, 就会出现错误.

 当输入的 URL 的和对应的资源路径不匹配时, 就会发生错误:

拓展 - HTTP 状态码

这里再聊一聊有关 HTTP 状态码的知识.

状态码: 在响应的首行中, 表示 请求 的处理结果.

  • 状态码为 200 (2xx), 表示访问成功:
  • 状态码为 404 (4xx), 表示访问的资源不存在 [客户端错误] (可能是用户输入错了, 要考虑路径是否输入错误):
  • 状态码为 500 (5xx), 表示后端服务器出错(后端代码有问题):
  • 当服务器没有启动时, 用户发生请求, 也会出现错误:
  • 状态码为 3xx, 表示重定向.

3.2 不同注解支持的请求方式

3.2.1 @RequestMapping

@RequestMapping 注解, 默认支持所有的 HTTP 请求方式, 不论是 GET/POST/PUT/DELETE, 都统统支持.

我们可以在 postman 中设置请求方法, 观察响应结果:

可以观察到, @RequestMapping 既支持 GET, 也支持 POST.

如果想让 @RequestMapping 支持特定的请求方式, 需要修改其中 method 的属性值:

因为 method 属性是一个数组, 所以可以设置 RequestMapping 支持多种方式的 HTTP 请求:

 可以认为 RequestMapping 是一个类, 我们传入的路径, method = xxx 等信息, 就是在给其中的属性赋值:

(当只传入一个参数时, 默认是给 value 赋值, 也就是资源路径)

3.2.2 @GetMapping

@GetMapping 注解, 只支持方式为 GET 的 HTTP 请求:

3.2.3 @PostMapping 

@PostMapping 注解, 只支持方式为 GET 的 HTTP 请求:

注意, 我们前面提到,

一个资源是唯一的, 是指: 路径唯一 + 请求方式/注解 唯一 

也就是说, 如果要访问的是 @GetMapping 和 @PostMapping 中的资源, 则说明这两个请求的方式是不相同, 那么这两个资源的路径就可以是相同的:

(根据请求方式, 调用不同的方法)

 但是, 如果多个资源的路径都是由 @RequestMapping 来表示的, 由于 @RequestMapping 可以支持所有的请求方式, 所以多个资源的路径必须唯一, 否则报错:

3.3 请求

和客户端建立起连接后, 就可以接收用户发来的请求, 而用户发来的请求通常是带有参数的, 这些参数就是请求的内容.

这些参数会传递到后端, 后端接收后, 就会根据请求的内容(参数), 计算响应, 进而返回响应.

3.3.1 传递单个参数

当发送带参请求后, Spring MVC 就会根据请求中的参数名, 将值传递对应路径的方法中的参数.

使用 Spring MVC 程序中的方法, 直接接收参数即可.

3.3.1.1 参数类型: String

注意:

前端请求中的参数名称一定要和后端程序中的参数名称一致, 否则是获取不到参数的:
(若获取不到参数, 则默认为 null)

 3.3.1.2 Integer / int 

后端程序中参数的类型为 Integer 或者为 int 时, 有什么区别呢??

当前段正确传递整型参数时, 是没有问题的:

但是当前端没有进行传参操作时, 就出现问题了:

这是因为前端没有进行传参操作, 则后端程序的方法参数默认接收的值为 null:

  1. 包装类 Integer 为引用类型, 可以赋值为 null.
  2. 而 int 为基本类型, 不能强转为 null, 所以会报错.

综上:

  1. 使用基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报错.
  2. 企业开发中, 对于参数可能为空的数据,应使用包装类型.

3.3.2 传递多个参数

3.3.2.1 直接写形参接收

和接收单个参数一样, 使用多个形参接收即可:

3.3.2.2 通过对象接收

当参数只有这一两个时, 我们可以直接在方法的参数列表上写出形参, 但是, 当参数有十几二十个时, 还在参数列表上一个一个写, 也未免太麻烦了.

此时, 我们就可以将形参定义为一个类对象, 将前端传递的参数向对象中的属性进行赋值, Spring 会根据参数名称自动绑定到对象的各个属性上:

如果对象的某个属性未进行传参, 则为默认零值(基本类型为默认为对应零值, 引用类型默认为 null):

3.3.3 后端参数重命名(参数绑定)

由于 URL 会直接放到浏览器的地址栏中, 所以在实际开发中, 为了达到加密效果, 前端向后端传递的参数名称通常是经过简化的:

而经过加密后的参数名称, 通常可读性是很低的.

我们上文提到过, 在前后端交互的过程中, 前端传递的参数, 必须和后端程序方法中的参数名称是一致的.

也就是说, 后端的方法中, 也需要使用这些可读性差的参数名, 那问题就出现了, 如果我后端也使用这些可读性低的名称, 那后端过个几天可能就忘记这个参数是干啥用的了.

所以, @RequestParam 就出现了, 我们可以使用 @RequestParam 对后端的参数进行重命名, 重新命名为一个可读性高的名称:
(说是重命名, 其实本质是参数绑定, 把重命名前的那个参数, 和重命名后的参数进行绑定, 你就是我, 我就是你~~)

需要注意的是, 使用 @RequestParam 进行参数绑定后, 被绑定的参数, 就成了必传参数, 当前端没有传递这个参数时, 就会报错:

3.3.3.1 非必传参数设置

但是, 我们可以通过修改 @RequestParam 中的 required 属性值为 false (默认为true, 表示必传) , 来将这个绑定的参数设置为 非必传参数:

3.3.4 传递数组

和之前的传参形式一样, 后端的形参数组直接接收即可:

传递形式有以下两种:

注意:

  • 当同一个参数名下有多个参数进行传递时, 默认封装到一个数组中.

3.3.5 传递集合

当传递的是集合时, 传递方式和数组是相同的.

但是, 当参数名称相同时, 由于默认传递的是数组, 所以, 需要使用 @RequestParam 将传递的参数和集合进行绑定:


END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值