当前位置: 首页 > news >正文

Spring Web MVC入门(2)

学习Spring MVC

Postman介绍

在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题.

那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman.

界面介绍:

传参的介绍

1.普通传参, 也就是通过查询字符串来传参.

学习HTTP时,我们通过URL来了解互联网上对应的资源.

其中, 查询字符串就是我们传参所需要的参数. (以键值对的形式展示)

2.form-data(完整表示为:multipart/form-data)

指表单提交的数据,通常用于提交图片或文件.

 

3.x-www-form-urlencoded

form表单.

 

4.raw

可以上传任意形式的文本,可以上传text, json, xml, html等.

 

请求

访问不同的URL路径,本质就是发送不同的请求. 在发送请求时,可能会带一些参数(包括上面提到的几种). 所以学习Spring请求,主要是学习如何传递参数到后端以及后端是如何接收的

传递参数, 咱们主要是使用浏览器和Postman来模拟.

后端开发人员无需过度关注如何传递参数, 了解即可, 实际开发中以Postman测试为主.

传递单个参数

接收单个参数,在Spring MVC直接用方法中的参数, 比如如下代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String method1(String name) {return "接受到参数name:" + name;}
}

使用Postman发送请求并传参:

 

结果:

 

Spring MVC会根据方法的参数名,找到对应的参数, 赋值给方法.

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

比如请求URL:http://127.0.0.1:8080/param/m1?name1=spring

响应结果:

注意事项

使用基本类型来接收参数, 参数必须传(除了boolean类型),否则会报500错误.

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

@RequestMapping("/m2")
public String method2(int age) {return "接受到参数name:" + age;
}

1.正常传递参数:

 

2.不传递age参数.

观察到状态码为500.

 

观察日志并解决.

一般查看日志堆栈信息的首行, 报错信息显示:

int类型的参数为'age', 虽然是可选的, 但由于被声明基本类型而不能被转换为空值.考虑声明为对应的基本包装类型. 

3.传递参数类型不匹配:

 

对于包装类型,如果不传对应的参数, Spring接收到的参数就是null.

因此为减少上述问题的出现, 对于可能为空的参数, 建议设置为包装类型

传递多个参数

和传递单个参数一样,只要设置多个参数的接收列表即可.

    @RequestMapping("/m3")public String method3(String name, int age) {return "接受到参数name:" + name + ", age:" + age;}

结果:

 

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

传递对象

在传参的过程中,如果写太多参数, 就显得代码很丑, 这时我们就可以按格式创建一个类, 以对象的形式来传递.

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;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}
}

传递对象:

    @RequestMapping("/m4")public String method4(Person p) {return p.toString();}

运行结果: 

 

与传递多个参数类似, Spring会根据参数名称自动绑定到各个属性上, 如果一个属性未传递, 则赋值为null(基本类型和之前讲到的不同, 由于对象中的属性有初始值, 因此未传会被附为初始值).

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

某些特殊的情况下, 前端传递的参数key和后端的参数会存在不一样的情况, 比如前端传递的是一个name, 而后端接收的参数名称则是userName, 这时就会出现接收不到的情况. 我们不必强求它们的一致性, 可以使用 @RequestParam 来重命名后端的参数值. (即指示前端传来的是这个)

举个栗子:

    @RequestMapping("/m5")public String method5(@RequestParam("name") String userName) {return "接受到参数name:" + userName;}

 

可以看到, Spring可以正确地把传递的name参数绑定到了后端的参数userName上.

那么如果传递的是userName呢?

 

可以得出结论:

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

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

非必传参数设置

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

先来了解一下参数必传的原因, 让我们先来查看一下RequestParam的注解:

 

可以看到, 传递设置这里是true, 即该注解修饰的参数默认为必传.

解决方案:可以手动设置注解里面的required为false来避免报错:

    @RequestMapping("/m5")public String method5(@RequestParam(value = "name", required = false) String userName) {return "接受到参数name:" + userName;}

传递数组

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

后端实现代码:

    @RequestMapping("/m6")public String method6(String[] array) {return Arrays.toString(array);}

这里通过多个参数传递或者一个参数都可以:

 

 

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

传递集合

集合参数:和数组类似, 同一个请求的参数名为多个, 且需要使用@RequestParam绑定参数关系.

默认情况下, 请求中参数名相同的多个值, 是封装到数组. 如果要封装到集合, 要使用@RequestParam绑定参数关系.

请求方式和数组类似: 

代码:

    @RequestMapping("/m7")public String method7(@RequestParam List<String> list) {return "size:" + list.size() + ",listParam:" + list;}

运行结果: 

 

 

 

 

相关文章:

Spring Web MVC入门(2)

学习Spring MVC Postman介绍 在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题. 那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman. 界面介绍: 传参的介绍 1.普通传参, 也就…...

tomcat 实现会话绑定

Tomcat 后端服务器实现 Session ID会话保持 基础架构&#xff1a; 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试&#xff1a; 此时刷新&#xff0c;会话ID一直在变&#xff0c;这样不好 如何解决呢&#xff1f; 不好的是确定ip之后&#xff0c;会一直在一台机上…...

Android Studio中快速修改包名

Android Studio中快速修改包名 假设原包名是com.abc.efg&#xff0c; 新包名是com.aaa.bbb 1、点击齿轮图标&#xff0c;把Compact Middle Packages前面的对勾取消&#xff0c;如果没有就忽略此步 2、在左侧项目栏中&#xff0c;选择Android, App-->java-->com,下面可以看…...

solr/ES 分词插件Jcseg设置自定义词库

步骤&#xff1a; 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置&#xff1a; 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径&#xff0c;我们这个配置可以自定义&#xf…...

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)

概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关&#xff0c;从而实现智能物联。NodeMCU 是基于 Lua 的开源固件&#xff0c;ESP8266-NodeMCU是一个开源硬件开发板&#xff0c;支持WiFi功能&a…...

CSS扩展选择器

文章目录 1. 并集选择器2. 交集选择器3. 后代选择器4. 子代选择器5. 兄弟选择器5.1. 相邻兄弟选择器5.2. 通用兄弟选择器 6. 属性选择器7. 伪类选择器7.1. 动态伪类7.2. 结构伪类7.3. 否定伪类 8. 伪元素选择器9. Google 改进案例 1. 并集选择器 选中多个选择器对应的元素。一…...

知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会

在区块链技术的风起云涌和Web3生态的蓬勃发展中&#xff0c;知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit()&#xff0c;此次大会将为全球区块链开发者及业…...

电脑那个部件坏了或者是哪个软件需要修复来看价钱

电脑维修价格表是多少&#xff1f; 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多&#xff0c;而且会以各种奇怪的方式出现问题&#xff0c;下面我们就来看看具体的充电方法。 电脑维修价格表&#xff1a; 1. 重新安装系统。 安装XP系统通常需…...

GiT: Towards Generalist Vision Transformer through Universal Language Interface

GiT: Towards Generalist Vision Transformer through Universal Language Interface 相关链接&#xff1a;arxiv github 关键字&#xff1a;Generalist Vision Transformer (GiT)、Universal Language Interface、Multi-task Learning、Zero-shot Transfer、Transformer 摘要 …...

纽约时报起诉OpenAI和微软将决定未来LLM的发展

《纽约时报》诉OpenAI和微软案对未来LLM发展的重大影响 案件背景 《纽约时报》(NYT)近期对OpenAI和微软提起诉讼&#xff0c;指控OpenAI未经授权使用其受版权保护的内容来训练其AI模型&#xff0c;包括ChatGPT。NYT声称&#xff0c;OpenAI使用了数百万篇其文章&#xff0c;这…...

IntelliJ IDEA 面试题及答案整理,最新面试题

IntelliJ IDEA中的插件系统如何工作&#xff1f; IntelliJ IDEA的插件系统工作原理如下&#xff1a; 1、插件架构&#xff1a; IntelliJ IDEA通过插件架构扩展其功能&#xff0c;插件可以添加新的功能或修改现有功能。 2、安装和管理&#xff1a; 通过IDEA内置的插件市场下载…...

T1.数据库MySQL

二.SQL分类 2.1 DDL 2.1.1数据库操作 1). 查询所有数据库 show databases ; 2). 查询当前数据库 select database(); 3)创建数据库 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则] ; 4&#xff09;删除数据库 drop database …...

idea中database的一些用法

1、查看表结构 方法1&#xff0c;右键&#xff0c;选这个 方法2 双击表后&#xff0c;看到数据&#xff0c;点DDL 方法3 写SQL时&#xff0c;把鼠标放在表名上&#xff0c;可以快速查看表结构 2、表生成对应的实体类 表中右键&#xff0c;选择这2个&#xff0c;选择生成的路…...

外卖点餐系统 |基于springboot框架+ Mysql+Java+JSP技术+Tomcat的外卖点餐系统 设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 骑手功能模块 商家功能模块 管理员功能登录前台功能效果图 用户功能模块 系统功能设…...

挑战杯 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…...

Node.js 自带的 http 模块来实现一个简单的本地服务器

1.创建一个 server.js 文件&#xff1a; const http require(http); const fs require(fs); const path require(path);const server http.createServer((req, res) > {// 获取请求的文件路径const filePath path.join(__dirname, dist, req.url);// 读取文件内容并返…...

c++ 设计模式模版方法

最初版本 #pragma onceclass Library { public:void Step1(){}void Step3(){}void Step5(){} };class Appliacation { public:void Step2(){}void Step4(){} };int main() {Library lib;Appliacation app;lib.Step1();app.Step2();lib.Step3();app.Step4();lib.Step5(); }最终…...

踏上机器学习的征程:探索基础概念与学习模式

摘要: 机器学习是当今科技领域最具前沿和应用价值的技术之一,它正在改变我们对数据的理解和利用方式。本文将引导读者深入了解机器学习的基本概念,包括监督学习、无监督学习和半监督学习等,并通过生动的例子解释这些概念,帮助读者迈出学习机器学习的第一步。 导言: 随着…...

基于YOLO的自动驾驶目标检测研究综述

摘要:自动驾驶是人工智能发展领域的一个重要方向,拥有良好的发展前景,而实时准确的目标检测与识别是保证自动驾驶汽车安全稳定运行的基础与关键。回顾自动驾驶和目标检测技术的发展历程,综述了YOLO算法在车辆、行人、交通标志、灯光、车道线等目标检测上的应用,同时对比分…...

深度学习-解读GoogleNet深度学习网络

深度学习-解读GoogleNet深度学习网络 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰&#xff0c;打…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...