Spring Web MVC入门(2)

news2024/11/24 4:12:50

学习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;
    }

    @Override
    public 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;
    }

运行结果: 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio 打包 Maker MV apk 详细步骤

一.使用RPG Make MV 部署项目&#xff0c;获取项目文件夹 这步基本都不会有问题&#xff1a; 二.安装Android Studio 安装过程参考教材就行了&#xff1a; https://blog.csdn.net/m0_62491877/article/details/126832118 但是有的版本面板没有Android的选项&#xff08;勾…

SpringAI——Java生态接入LLM

最近&#xff0c;Spring官网发布了SpringAI&#xff0c;可点此查看https://spring.io/blog/2024/03/12/spring-ai-0-8-1-released&#xff0c;对于SpringAI的介绍&#xff0c;可看官方文档&#xff1a;https://spring.io/projects/spring-ai#overview。 本文将使用SpringAI配合…

QML 布局管理器之GridLayout

一.QML GridLayout介绍 在QML中&#xff0c;GridLayout是一种用于布局元素的容器。它允许您以网格形式组织和排列元素。要使用rowspan、columnspan、layoutFillWidth和rowSpacing属性&#xff0c;您可以将一个元素跨越多行和多列&#xff0c;并填充整个宽度&#xff0c;同时设置…

Python Web开发记录 Day12:Django part6 用户登录

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡《竹枝词》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、登录界面2、用户名密码校验3、cookie与session配置①cookie与session②配置…

unity学习(60)——选择角色界面--MapHandler2-MapHandler.cs

1.新建一个脚本&#xff0c;里面有static变量loadingPlayerList using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Assets.Scripts.Model {internal class LoadData{public static List<Pl…

Qt QTableWidget 实现行选中及行悬浮高亮

表格整行的 selected、hover 高亮需求很常见&#xff0c;但使用 Qt 提供的开箱即用的方法根本无法实现这个需求&#xff08;至少在当前的时间节点是不行的&#xff09;&#xff1b;想要实现这个效果必须要费一点点力气&#xff0c;我们尽量选择较为简单的方法。 话不多说&…

Ubuntu 20.04 系统如何优雅地安装NCL?

一、什么是NCL&#xff1f; NCAR Command Language&#xff08;NCL&#xff09;是由美国大气研究中心&#xff08;NCAR&#xff09;推出的一款用于科学数据计算和可视化的免费软件。 它有着非常强大的文件输入和输出功能&#xff0c;可读写netCDF-3、netCDF-4 classic、HDF4、b…

基于Struts开发物流配送(快递)管理系统

开发工具&#xff1a;EclipseJdkTomcatMySQL数据库

手机中的8款万能App推荐!

目录 1.全能AI工具箱——HuluAI 2.AI视频生成——巨日禄 3.全能办公套件——鲸鲮Office 4.视频音频转换器——VideotoMP3Converter 5.特效滤镜摄影——PicsArt 6.智能工具箱——SmartTools 7.手机视频编辑软件——KineMaster 8.安卓版万能文档阅读器——AllDocumentRea…

「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架

文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | Change 插件配置集成 | Settings引入依赖 | XML定义插件引导类 | Clas…

NeRF学习——NeRF-Pytorch的源码解读

学习 github 上 NeRF 的 pytorch 实现项目&#xff08;https://github.com/yenchenlin/nerf-pytorch&#xff09;的一些笔记 1 参数 部分参数配置&#xff1a; 训练参数&#xff1a; 这段代码是在设置一些命令行参数&#xff0c;这些参数用于控制NeRF&#xff08;Neural Radi…

sqllab第二十六关通关笔记

知识点&#xff1a; 空格替换 %09 %0a %0b %0c %0d %a0 (%2b)or替换&#xff1a;|| ||是不需要空格区分的and替换&#xff1a;&& &&同样不需要空格区分的双写绕过&#xff0c;但是绕过后需要和内容进行空格区分的&#xff0c;要不然不发挥作用&#xff1b;这关…

确保云原生部署中的网络安全

数字环境正在以惊人的速度发展&#xff0c;组织正在迅速采用云原生部署和现代化使用微服务和容器构建的应用程序&#xff08;通常运行在 Kubernetes 等平台上&#xff09;&#xff0c;以推动增长。 无论我们谈论可扩展性、效率还是灵活性&#xff0c;对于努力提供无与伦比的用…

【python开发】并发编程(上)

并发编程&#xff08;上&#xff09; 一、进程和线程&#xff08;一&#xff09;多线程&#xff08;二&#xff09;多进程&#xff08;三&#xff09;GIL锁 二、多线程开发&#xff08;一&#xff09;t.start()&#xff08;二&#xff09;t.join()&#xff08;三&#xff09;t.…

基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 ESTAR模型概述 4.2 WNL值&#xff0c;P值&#xff0c; Q值&#xff0c;12阶ARCH值 4.3ADF检验 5.完整程序 1.程序功能描述 基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿…

【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)

&#x1f4d6; 前言&#xff1a;MapReduce是一种分布式并行编程模型&#xff0c;是Hadoop核心子项目之一。实验前需确保搭建好Hadoop 3.3.5环境、安装好Eclipse IDE &#x1f50e; 【Hadoop大数据技术】——Hadoop概述与搭建环境&#xff08;学习笔记&#xff09; 目录 &#…

基于springboot+mysql+Shiro实现的宠物医院管理系统

1.项目介绍 系统主要为用户提供了管理员权限的用户&#xff0c;实现了前台查看客户信息、在线添加预约等&#xff1b;后台管理医生坐诊信息、管理就诊信息、修改密码&#xff0c;管理公告、管理宠物分类、管理就诊、管理用户、修改密码等。在设计方面&#xff0c;本系统采用MV…

Echo框架:高性能的Golang Web框架

Echo框架&#xff1a;高性能的Golang Web框架 在Golang的Web开发领域&#xff0c;选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架&#xff0c;以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…

计算机网络——物理层(数据交换方式)

计算机网络——数据交换方式 提高数据交换方式的必要性电路交换电路交换原理电路交换的阶段建立阶段通信阶段和连接拆除阶段 电路交换的优缺点报文交换什么是报文报文交换的阶段报文交换的优缺点 分组交换分组交换的阶段分组交换的优缺点 数据交换方式的选择数据报方式数据报方…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…