和开振学Spring boot 3.0之Spring MVC:④获取参数(上)

之前,我反复说过处理器封装了控制器,HandlerMapping的机制找到处理器后,通过处理器就能运行控制器,那么处理器增强了控制器什么功能呢?

我们用脑子想一下,要运行控制器之前,我们需要做什么?那必须是方法的参数嘛。所以处理器第一步就是要根据我们的方法来获取参数。

只是获取参数的内容有点多,我打算分三篇文章进行讲解,所以这里的标题添加了一个“上”

1、Spring MVC是如何获得调用控制器方法参数的?

对于控制器来说参数可能来自于很多方面,比如Session,HTTP请求参数,HTTP请求头,系统参数,请求路径等当然还有特殊的请求体(可以是文件或者JSON,后面我们会再谈)。为了能处理控制器参数,Spring MVC处理器方法参数解析器(HandlerMethodArgumentResolver),通过它能够解析来自各方面的参数。获得参数后,就能够调用控制器的方法了。

为此,我们先来看Spring MVC为我们提供了哪些处理器方法参数解析器(HandlerMethodArgumentResolver),如下图所示。

处理器方法参数解析器(HandlerMethodArgumentResolver)

 请注意到上图,我加红色框的都是我们常用的解析器,只是Spring MVC会把这步擦除,让我们不知不觉的使用了它们而已。我们这里稍微记住这个机制,下面的内容就与它们有关。

2、在无注解下获取参数

为了讲解,我这里先给出一段代码如下:

package com.csdn.mvc.chapter1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
// 这个注解可以配置在类或者方法上
@RequestMapping("/param")
public class ParameterController {
    /**
     * 在无注解下获取参数,要求参数名称和HTTP请求参数名称一致,此时允许参数为空
     * @param intVal  -- 整数
     * @param longVal -- 长整型
     * @param strVal --字符串
     * @return 响应JSON参数
     */
    // HTTP GET请求
    @GetMapping("/no/annotation")
    @ResponseBody
    public Map<String, Object> noAnnotation(
            Integer intVal, Long longVal, String strVal) {
        var paramsMap = new HashMap<String, Object>();
        paramsMap.put("intVal", intVal);
        paramsMap.put("longVal", longVal);
        paramsMap.put("strVal", strVal);
        return paramsMap;
    }


}

 请注意这里的方法带有参数名称分别为“intVal”“longVal”“strVal”,只要我们的HTTP带上这些参数请求,就可以获取了。而方法标注了@ResponseBody,就意味着将返回的东西变为JSON数据集。

也就是在默认的情况下,Spring MVC会自动给同名的请求参数匹配上控制器方法的参数。这就是处理器方法参数解析器(HandlerMethodArgumentResolver)起到的作用,只是Spring MVC屏蔽了这个过程,让我们体会不到而已。

@RequestMapping("/param")标注在类上,说明该类所有请求都需要加入“/param”前缀,而@GetMapping是HTTP的GET请求。在Spring 4.3的版本之后,为了简化method配置项的配置新增了几个注解,如@GetMapping、@PostMapping、@PatchMapping、@PutMapping和@DeleteMapping。分别对应HTTP的GET、POST、PATCH、PUT和DELETE请求,关于这些在REST风格请求中,我会再讨论。

没有注解的参数是允许为空的,比如我们请求:http://localhost:8080/param/no/annotation?intVal=1&longVal=1

可以得到这样的结果。(注意:strVal参数为空

3、使用@RequestParam获取参数

上面是无注解下拿到参数,而事实是还可以从请求参数中拿到参数。因为HTTP请求参数与控制器方法参数不同名的比比皆是,所以需要建立一个机制,从HTTP请求参数中获取控制器参数。那么就要使用注解@RequestParam了。它会启用RequestParamMethodArgumentResolver去获取参数。

我们在ParameterController 添加一个方法来测试,如下。

/**
 * 通过@RequestParam获取参数,此时默认不允许参数为空
 * @param intVal  -- 整数
 * @param longVal -- 长整型
 * @param strVal --字符串
 * @return 响应JSON参数
 */
// HTTP GET请求
@GetMapping("/annotation")
@ResponseBody
public Map<String, Object> annotation(
        @RequestParam("int_val") Integer intVal,
        @RequestParam("long_val") Long longVal,
        @RequestParam("str_val") String strVal) {
    var paramsMap = new HashMap<String, Object>();
    paramsMap.put("intVal", intVal);
    paramsMap.put("longVal", longVal);
    paramsMap.put("strVal", strVal);
    return paramsMap;
}

@RequestParam代表从HTTP请求参数中获取参数给控制器,“int_val”“long_val”“str_val”代表参数名称,然后可以将控制器的参数命名为自己想要的intVal、longVal和strVal等。@RequestParam可以通过名称将它们对应起来。

只是大家需要注意,@RequestParam标注的参数默认是不能为空的,如果为空,那么就会抛出异常。如果你允许它为空,那么可以修改进行配置,如下。

@RequestParam(value="int_val", required = false) Long intVal

代码中的required配置项默认值为true,也就是不能缺省,如果修改为false,那么就允许缺省了。当然在大部分情况下,我都不建议你配置了,以避免抛出臭名昭著的NullPointerException。

4、从URL中获取参数

在REST请求中很多时候,我们需要从URL中获取参数,比如请求:

GET http://localhost:8080/user/1

代表我们获取编号为1用户的用户信息,这样编号需要从URL中获取。这个时候需要使用@PathVariable和URL的结合来实现。为此我们在ParameterController 添加一个方法来测试,如下。

@GetMapping("/path/{intVal}/{longVal}/{strVal}")
@ResponseBody
public Map<String, Object> path(
        @PathVariable("intVal") Integer intVal,
        @PathVariable("longVal") Long longVal,
        @PathVariable("strVal") String strVal) {
    var paramsMap = new HashMap<String, Object>();
    paramsMap.put("intVal", intVal);
    paramsMap.put("longVal", longVal);
    paramsMap.put("str", strVal);
    return paramsMap;
}

这里的@GetMapping的路径是“/path/{intVal}/{longVal}/{strVal}”,这些{paramName}格式是定位参数的位置,从而可以在path()方法使用@PathVariable({paramName})就能够获取对应URL中的参数。

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

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

相关文章

《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况&#xff0c;请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。 1.1 为什么要关心 Java 的变化 Java8做的…

小程序的组件化开发

目录&#xff1a; 1 小程序组件化思想 2 自定义组件的过程 3 组件样式实现细节 4 组件使用过程通信 5 组件插槽定义使用 6 Component构造器 在小程序里面需要创建组件的话需要在最外层建component包&#xff0c;然后在使用新建component来创建类似page的4个文件&#xff…

Spark 简介与原理

目录标题1 Spark 简介与原理1.1 Spark与Hadoop的区别1.2 Spark的应用场景1.3 Spark的作业运行流程1.4 Spark 2.X与Spark 1.X的区别1 Spark 简介与原理 Spark 是一个大规模数据处理的统一分析引擎。 具有迅速、通用、易用、支持多种资源管理器的特点。 Spark生态系统: Spark SQL…

C++之AVL树

文章目录前言一、概念二、AVL树结点的定义三、AVL树的插入四、AVL树的旋转1.右单旋的情况以及具体操作抽象图h 0h 1h 2代码实现2.左单旋的情况以及具体操作抽象图代码实现3.右左双旋的情况以及具体操作抽象图h 0h 1h 23.左右双旋的情况以及具体操作抽象图5.总结6.完整实现…

stable-diffusion-webui浅叙

GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 使用Git下载&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 运行 webui-user.bat : git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.g…

Python每日一练(20230413)

目录 1. 最后一个单词的长度 ※ 2. 全排列 &#x1f31f;&#x1f31f; 3. 计数质数 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 最后一个单词的长度 给你一个字符串 s&…

sql server 入门教程

sql server 入门教程 1、创建数据库 1&#xff09;鼠标右键数据库选项&#xff0c;点击新建数据库 2&#xff09;命名数据库 根据自己业务情况取一个自定义数据库名字&#xff0c;比如&#xff1a;my_database 3&#xff09;查看数据库 如果添加没看到&#xff0c;那么可鼠…

知识图谱:Neo4j数据库的基本使用——创建张学良的关系谱

一、知识图谱及Neo4j数据库介绍 知识图谱&#xff08;Knowledge Graph&#xff09;是人工智能的重要分支技术&#xff0c;它在2012年由谷歌提出&#xff0c;是结构化的语义知识库&#xff0c;用于以符号形式描述物理世界中的概念及其相互关系&#xff0c;其基本组成单位是“实体…

安全防御第四天:防病毒网关

一、恶意软件1.按照传播方式分类&#xff08;1&#xff09;病毒病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点…

基于目标级联法的微网群多主体分布式优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

花了近三周时间对 ChatGPT 进行多方面了解、体验后写的报告,超级全面,建议想了解的朋友看看

优质介绍视频&#xff1a; GPT4前端【AI编程新纪元】 【渐构】万字科普GPT4为何会颠覆现有工作流&#xff1b;为何你要关注微软Copilot、文心一言等大模型 ChatGPT 是什么&#xff1a;ChatGPT最初是2022年11月30日由OpenAI开发并推出的聊天机器人&#xff0c;是基于 GPT-3.5 …

Spring 源码分析(二)——GenericBeanDefinition 分析

BeanDefinition 中存储着 Bean 的定义信息&#xff0c;它具有属性值、构造函数参数值以及具体实现 Bean 提供的进一步信息&#xff0c;在学习 Spring 的 Bean 初始化流程之前&#xff0c;还是非常有必要先了解一下 BeanDefinition。 一、注册 Bean 示例 首先&#xff0c;本文…

SQL Server的日志传送

日志传送和复制一、前言二、相关术语和定义三、日志传送和复制3.1、在主数据库丢失时从辅助数据库进行复制的要求和过程3.2、使用事务复制进行日志传送3.3、使用合并复制进行日志传送一、前言 日志传送允许您自动将事务日志备份从主服务器实例上的主数据库发送到单独辅助服务器…

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申&#xff1a;在服务器上运行后台进程1-2-5、nohup和&的区别二、进程查看2-1、jobs命令&#xff08;基本不用&#xff09;2-2、ps命令…

Msray-Plus采集工具让您的市场营销更加简单,让您的营销成果更加显著

市场营销是现代企业不可或缺的一环&#xff0c;企业的发展和营销成果密不可分。然而&#xff0c;市场营销的过程中&#xff0c;需要大量的数据采集和整理工作&#xff0c;这对于营销人员来说是一项繁琐的工作&#xff0c;同时也是一项非常重要的工作。因为数据的准确性和完整性…

NumPy 秘籍中文第二版:十二、使用 NumPy 进行探索性和预测性数据分析

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们涵盖以下秘籍&#xff1a; 探索气压探索日常气压范围研究年度气压平均值分析最大可见度用自回归模型预测气压使用移动平均模型预测气压研究年…

吐血奉献精心整理的一大波数据集

80开源数据集资源汇总&#xff08;包含目标检测、医学影像、关键点检测、工业检测等方向&#xff09; 数据集下载汇总链接&#xff1a;https://www.cvmart.net/dataSets数据集将会不断更新&#xff0c;欢迎大家持续关注&#xff01; 小目标检测 AI-TOD航空图像数据集 数据集…

【消息队列】聊一下生产者消息发送流程

消息发送流程 1.生产者main线程调用send发送消息&#xff0c;先走拦截器&#xff0c;然后会将消息进行序列化&#xff0c;然后选择对应的分区器&#xff0c;将消息发送到RecordAccumulator中&#xff0c;默认是32m 2.Sender线程会异步读取&#xff0c;要不数据达到batch的大小 …

7nm舱泊一体SoC的新玩家

2016年&#xff0c;高通推出基于14纳米工艺的汽车座舱芯片骁龙820A&#xff0c;彼时&#xff0c;传统座舱SoC霸主NXP主推的是28纳米工艺的iMX8系列。不过&#xff0c;两款芯片都没有能够达到预期的量产效果。 真正的时代变革&#xff0c;来自于高通在2019年发布的全球首款量产7…

三大前端框架Vue, Angular, React

今天就来好好分析分析这三个框架。 背景介绍 Angular Angular 是 Google 在 2010 年发布的 AngularJS 的升级版&#xff0c;也称为 Angular 2。AngularJS 是由 Misko Hevery 和 Adam Abrons 在 2009 年创建的&#xff0c;最初被称为 "GetAngular"&#xff0c;并于…
最新文章