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直接用方法中的参数, 比如如下代码:

java 复制代码
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错误.

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

1.正常传递参数:

2.不传递age参数.

观察到状态码为500.

观察日志并解决.

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

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

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

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

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

传递多个参数

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

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

结果:

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

传递对象

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

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

java 复制代码
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 + '\'' +
                '}';
    }
}

传递对象:

java 复制代码
    @RequestMapping("/m4")
    public String method4(Person p) {
        return p.toString();
    }

运行结果:

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

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

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

举个栗子:

java 复制代码
    @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来避免报错:

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

传递数组

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

后端实现代码:

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

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

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

传递集合

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

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

请求方式和数组类似:

代码:

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

运行结果:

相关推荐
盖丽男6 小时前
彻底搞懂:前端MVVM、后端MVC、DDD极致面向对象的区别与落地真相
前端·mvc
Cyan_RA95 天前
SpringMVC 请求数据绑定与参数映射 详解
java·后端·spring·mvc·springmvc·映射请求数据
Cyan_RA97 天前
SpringMVC REST 详解
java·spring·mvc·springmvc·restful·jquery·jsp
budingxiaomoli10 天前
Spring Web MVC 知识总结
spring·mvc
虾米Life11 天前
MVC与MVVM 架构
架构·mvc·mvvm
笛卡尔的心跳13 天前
Spring MVC 注解
java·spring·mvc
小松加哲14 天前
Spring MVC 核心原理全解析
java·spring·mvc
那个失眠的夜14 天前
RESTful 语法规范 核心注解详解
java·spring·mvc·mybatis
羌俊恩14 天前
Centos环境django项目部署过程
django·flask·centos·mvc·mtv·web项目框架
Foreer黑爷16 天前
Spring MVC原理与源码:从请求到响应的全流程解析
java·spring·mvc