Spring Web MVC入门(2)(请求1)

目录

请求

1.传递单个参数

2.传递多个参数

3.传递对象

4.后端参数重命名(后端参数映射)

非必传参数设置

5.传递数组


请求

访问不同的路径就是发送不同的请求.在发送请求时,可能会带一些参数,所以学习Spring的请求,主要是学习如何传递参数到后端及后端如何接收.

1.传递单个参数

接收单个参数,在Spring MVC中直接用方法中的参数就可以,比如:

@RequestMapping("/User")
@RestController
public class UserController {
    @RequestMapping("/m1")
    public String method1(String name) {
        return "接收到参数name: " + name;
    }
}

使用浏览器发送请求并传参: http://127.0.0.1:8080/User/m1?name=helloSpring

可以看到后端程序正确拿到了name参数的值

如果参数不一致,是获取不到参数的.

注意事项: 使用基本类型来接收参数时,参数必须传(除boolean类型外),否则会报500错误.

类型不匹配时,会报400错误.

2.传递多个参数

和接收多个参数一样,直接使用方法的参数接收即可.使用多个形参.

@RequestMapping("/User")
@RestController
public class UserController {
    @RequestMapping("/m2")
    public String method1(String name,String password) {
        return "接收到参数name: " + name + "password: " + password; 
    }
}

使用浏览器发送请求并传参: http://127.0.0.1:8080/User/m2?name=helloSpring&password=1234

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果.

3.传递对象

如果参数比较多是,方法声明就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明.

Spring MVC 也可以自动实现对象参数的赋值,比如Person对象: 

public class Person {
    private int id;
    private String name;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

传递对象代码实现: 

@RequestMapping("/User")
@RestController
public class UserController {
    public Object method3(Person p) {
        return p.toString();
    }
}

使用浏览器发送请求并传参: 

http://127.0.0.1:8080/User/m3?id=1&name=lisi&pssword=1234

Spring 会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型赋值为默认初始值,比如int会被赋值为0.

4.后端参数重命名(后端参数映射)

某些特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个time给后端,而后端是使用createtime字段来接受的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用@RequestParam来重命名前后端的参数值

后端代码实现:

@RequestMapping("/demo")
@RestController
public class demo1 {
    @RequestMapping("/m1")
    public Object method1(@RequestParam("time") String createtime) {
        return "接受到参数createtime: " + createtime;
    }
}

   使用浏览器发送请求:  http://127.0.0.1:8080/demo/m1?time=zhangsan                                          

如果使用createtime进行参数传递呢?

访问: http://127.0.0.1:8080/demo/m1?createtime=zhangsan

可以得知: 

1.使用@RequestParam进行参数传递时,请求参数只能和@RequestParam声明的名称一致,才能进行参数绑定和赋值.

2.使用@RequestParam进行参数重命名时,参数就变成了必传参数.

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?

先来了解下参数必传的原因,我们查看@RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

可以看到required的默认值为true,表示含义就是:该注解修饰的参数默认为必传

既然如此,我们可以通过设置@RequestParam中的required=false来避免不传递时报错,具体实现如下:

@RequestMapping("/m1")
public class Demo2 {
    public Object method1(@RequestParam(value = "time",required = false) String createtime) {
        return "接收到参数: " + createtime;
    }
}

可以看到,添加required=false之后,time前面也加了key,变成了value="time"

注解属性赋值时,没有指明key的话,默认为value属性.

如果需要有多个属性进行赋值时,需要写上key

5.传递数组

Spring MVC可以自动绑定数组参数的赋值

后端实现代码:

@RequestMapping("/test1")
public class test {
    @RequestMapping("/m1")
    public String method1(String[] arrayParam) {
        return Arrays.toString(arrayParam);
    }

使用浏览器发送请求: 

http://127.0.0.1:8080/test1/m1?arrayParam=zhangsan&arrayParam=lisi

可以看到后端对数组参数进行了正确的接收和响应

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

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

相关文章

Linux多线程编程-哲学家就餐问题详解与实现(C语言)

在哲学家就餐问题中,假设有五位哲学家围坐在圆桌前,每位哲学家需要进行思考和进餐两种活动。他们的思考不需要任何资源,但进餐需要使用两根筷子(左右两侧各一根)。筷子是共享资源,哲学家们在进行进餐时需要…

IDEA中Git常用操作及Git存储原理

Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统(VSC),是团队合作开发…

【pbootcms】新环境搭建环境安装时发生错误

【pbootcms】新环境搭建环境安装时发生错误 提示一下内容: 登录请求发生错误,您可按照如下方式排查: 1、试着删除根目录下runtime目录,刷新页面重试 2、检查系统会话文件存储目录是否具有写入权限; 3、检查服务器环境pathinfo及伪静态规则配置; 先按照…

Pygame开发五子棋之人机对战游戏

引言 Pygame是一个基于Python的开源游戏开发库,它包含了丰富的多媒体功能,尤其是针对游戏开发所需的各种组件。如果你对游戏开发感兴趣,但又不想从底层开始编写所有东西,Pygame可以成为一个理想的起点。本文将介绍Pygame的基本概…

javaScript的面试重点--预解析

目录 一.前言 二.预解析案例 一.前言 关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。 二.预解析案例 预解析,简而言之,也就是…

Gstreamer学习3.1------使用appsrc灌颜色信号数据

这个视频内容讲解的离散余弦变换,讲的很好, 离散余弦变换可视化讲解_哔哩哔哩_bilibili 其中讲到,把颜色变化转换为曲线的处理, 在前面的学习中,我们知道了可以向appsrc来灌数据来进行显示 Gstreamer学习3----灌数据…

昇思25天学习打卡营第21天|基于MindSpore的DCGAN生成漫画头像

基于MindSpore的DCGAN生成漫画头像 GAN基础原理 生成对抗网络(GAN)的基础原理是通过两个互相博弈的模型,生成模型和判别模型,来实现对数据分布的学习并产生新的、与真实数据极其相似的数据实例。 生成对抗网络(GAN&a…

SwiftUI 截图(snapshot)视频画面的极简方法

功能需求 在 万物皆可截图:SwiftUI 中任意视图(包括List和ScrollView)截图的通用实现 这篇博文中,我们实现了在 SwiftUI 中截图几乎任何视图的功能,不幸的是它对视频截图却无能为力。不过别着急,我们还有妙招。 在上面的演示图片中,我们在 SwiftUI 中可以随心所欲的截图…

【python数据结构精讲】双端队列

通过总结《流畅的Python》等书中的知识,总结Python中常用工具的方法。 deque,学名双端队列。 1. 常用方法 append():队列尾部添加appendleft():队首添加pop():移除队列最后一个元素popleft():移除队列第一…

Reinforced Causal Explainer for GNN论文笔记

论文:TPAMI 2023 图神经网络的强化因果解释器 论文代码地址:代码 目录 Abstract Introduction PRELIMINARIES Causal Attribution of a Holistic Subgraph​ individual causal effect (ICE)​ *Causal Screening of an Edge Sequence Reinforc…

springboot上传图片

前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地

PDF公式转Latex

文章目录 摘要数据集 UniMER介绍下载链接 LaTeX-OCRUniMERNet安装UniMER 用的数据集介绍下载链接 PDF-Extract-Kit整体介绍效果展示评测指标布局检测公式检测公式识别 使用教程环境安装参考[模型下载](models/README.md)下载所需模型权重 在Windows上运行在macOS上运行运行提取…

FastAPI 学习之路(四十四)WebSockets

我们之前的分析都是基于http的请求,那么如果是websockets可以支持吗,答案是可以的,我们来看下是如何实现的。 from fastapi import WebSocket, FastAPI from fastapi.responses import HTMLResponseapp FastAPI()html """&…

基于JavaMailSenderImpl和velocity模板的邮件发送

Java邮箱集成发送&#xff0c; 本文介绍了基于JavaMailSenderImpl和velocity模板引擎&#xff0c;发送自定义的邮件内容。 一、依赖引入 <dependency><groupId>com.crygier</groupId><artifactId>SpringUtils</artifactId><version>1.0.…

秋招突击——7/12——复习{每日温度、完全平方数、无重复最长子串}——新作{字节面试——控制多线程按照顺序输出}

文章目录 引言复习每日温度复习实现参考学习 完全平方数复习实现参考学习 无重复字符的最长子串复习实现参考学习 新作控制多线程输出Java实现线程——不使用锁实现使用synchronized关键实现——使用锁实现使用synchronized、wait和notify关键字实现 总结 引言 今天又要面试字…

CSS相对定位和绝对定位的区别

CSS相对定位和绝对定位的区别 区别1&#xff1a;相对的对象不同 相对定位是相对于自己绝对定位是相对于离自己最近的有定位的祖先 区别2:是否会脱离文档流 相对定位不会脱离文档流&#xff0c;不会影响其他元素的位置绝对定位会脱离文档流&#xff0c;会影响其他元素的布局 代…

MAC通过SSH连接VirtualBox中的虚拟机

1、虚拟机网络连接方式使用桥接方式-桥接网卡 2、重启虚拟机&#xff0c;查看虚拟机ip地址是否跟Mac宿主机在同一网段 3、SSH工具&#xff08;推荐Tabby&#xff09;输入IP、用户名和密码就能连接虚拟机了

JS进阶-异常处理

学习目标&#xff1a; 掌握异常处理 学习内容&#xff1a; throw抛异常try/catch捕获异常debugger throw抛异常&#xff1a; 异常处理是预估代码执行过程中可能发生的错误&#xff0c;然后最大程度的避免错误的发生导致整个程序无法继续运行。 <title>throw抛异常</…

基于AT89C51单片机的多功能自行车测速计程器(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的多功能自行车测速计程器的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 选题背景 原理图 PCB图 仿真图 代码 系统论文 资源下载 选题背景 美丽的夜晚&…

Ubuntu 安装 XRDP,替代系统自带RDP远程桌面

起因&#xff0c;Ubuntu的自带RDP远程桌面很好用&#xff0c;但很傻卵&#xff0c;必须登录。 而设置了自动登录也不能解开KEYRING&#xff0c;必须必须必须用GUI手动登录。 &#xff08;我远程我用头给你坐机子面前开显示器先登录&#xff1f;&#xff1f;&#xff09; 比起VN…