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

运行结果: 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB——linux中yum命令安装及配置

一、创建mongodb-org-3.4.repo文件 vi /etc/yum.repos.d/mongodb-org-3.4.repo 将下面内容添加到创建的文件中 [mongodb-org-3.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www…

Linux服务器(Debian系)包含UOS安全相关巡检shell脚本

#!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format output_file"server_security_inspection_report_${current_date}.txt"# Empty the file initially echo > $output_file# 获取巡检时间 (…

Qt 实现 Asterix 报文解析库

【写在前面】 最近工作中需要解析 Cat 21 和 Cat 62 的 ADS-B 数据 ( 自己的工作包含航空领域 )。 然后&#xff0c;因为整个 Asterix 协议类别非常之多&#xff0c;每个类别的版本也多&#xff0c;纯手工实现每个版本解析根本不现实 ( 然鹅公司之前的解析库就是这么做的且做的…

MySQL语法分类 DDL(1)

DDL&#xff08;1&#xff09;(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…

C++11:自动类型推导 auto 和 decltype(下)

前面两篇文章分别介绍了 auto 和 decltype&#xff0c;今天聊聊它们两者之间的区别。 语法格式的区别 auto varname value; // auto的语法格式 decltype(exp) varname [ value]; // decltype的语法格式其中&#xff0c;varname 表示变量名&#xff0c;value 表示赋给变量的值…

mybatis源码阅读系列(二)

前言 上一篇文章mybatis源码阅读系列&#xff08;一&#xff09;介绍了mybatis和原生jdbc的区别&#xff0c;并通过代码展示了两者的运行过程和结果&#xff0c;下面让我们继续详细了解下mybatis的执行过程&#xff1b; package com.wyl.mybatis.service;import com.wyl.mybat…

Linux中 vim 编辑器的使用

文章目录 前言一、vim编辑器模式二、简单的插入、保存和退出三、 命令模式下常用命令即其作用1. 命令模式 思维导图 前言 首先&#xff0c;了解一下 什么是vim 编辑器&#xff1f;在不同的系统中&#xff0c;文本的管理也会不同&#xff1b;windos系统就不多说了&#xff0c…

【运维】StarRocks数据迁移到新集群(针对于集群互通、不互通的情况)

文章目录 一. 迁移整体思路1. 对于新旧集群互通的情况2. 对于新旧集群不互通的情况 二、迁移过程&#xff08;两个集群互通的情况&#xff09;1. 备份过程1.1. 通过mysqlclient与starrocks进行关联1.2. 创建仓库与minio建立联系1.3. 备份数据到minio 2. 迁移过程2.1. 通过mysql…

Web核心,HTTP,tomcat,Servlet

1&#xff0c;JavaWeb技术栈 B/S架构:Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…

【Leetcode】2684. 矩阵中移动的最大次数

文章目录 题目思路代码结果 题目 题目链接&#x1f517; 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整数组成。 你可以从矩阵第一列中的 任一 单元格出发&#xff0c;按以下方式遍历 grid &#xff1a; 从单元格 (row, col) 可以移动到 (…

FPGA和ASIC

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第16篇,在本篇文章给大家介绍FPGA和ASIC。 一个四核i7的CPU的晶体管中有20亿的晶体管&#xff0c;需要链接起20亿的晶体管可不是一件容易的事情&#xff0c;所以设计一个CPU需要用年来算&#x…

一款博客网站源码

一款博客网站源码 源码软件库 为大家内置了主题 清爽又强大真正的永久可用的一条源码&#xff0c;该版本为整合版本&#xff0c;内置了Joe主题&#xff0c;搭建后直接启用即可~ 安装环境要求&#xff1a; PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff…