Spring MVC 实战:复杂类型接收表单字段

简介: 前言这是 Spring MVC 处理器方法参数实战的第二篇,我们来尝试使用复杂的成员变量类型来接收 form 表单字段。对于普通的 Java Web 项目,我们一般通过 ServletRequest#getParameter 方法来获取字符串类型的 form 表单字段值。

前言


这是 Spring MVC 处理器方法参数实战的第二篇,我们来尝试使用复杂的成员变量类型来接收 form 表单字段。


对于普通的 Java Web 项目,我们一般通过 ServletRequest#getParameter 方法来获取字符串类型的 form 表单字段值。


对于 Spring MVC 项目,直接将简单类型定义为处理器方法参数即可获取 form 表单字段值,如果表单字段比较多,还可以使用一个复杂类型来接收所有的表单字段值。


通常情况下,我们使用简单类型接收单个表单字段就足够了,然而在复杂的场景下,简单类型可能无法满足我们的需求。对于 application/json 类型的请求,我们可以定义任意复杂的类型来接收 json 格式的请求体,那么对于 form 类型的请求又该如何处理呢?


简单类型


先看看 Spring MVC 如何使用简单类型接收表单参数,假定我们要做一个注册功能,我们需要接收账号和密码,可以使用如下方式。


@RestController
public class UserController {
    @PostMapping("/register")
    public User register(@RequestParam("username") String username, @RequestParam("password") String password) {
        return null;
    }
}


如果表单字段比较多,我们可以把参数移到自定义的类型中。


@Data
public class User {
    private String username;
    private String password;
}
@RestController
public class UserController {
    @PostMapping("/register")
    public User register(User user) {
        return user;
    }
}


自定义类型


现在除了用户名和密码,我们还希望用户注册时能够提供所在省市,我们常规的思路是添加两个分别表示省份和城市的表单字段。


@Data
public class User {
    private String username;
    private String password;
    private String province;
    private String city;
}


省份和城市属于地址信息,可能我们希望定义到 Address 类中。


@Data
public class Address {
    private String province;
    private String city;
}
@Data
public class User {
    private String username;
    private String password;
    private Address address;
}


我们还希望使用 User 接收表单字段,但是表单字段只能传递字符串,该怎么办呢?

好在 Spring MVC 已经为我们考虑到了这种情况,使用 . 分隔成员变量作为表单字段名即可将表单字段值正确的绑定到自定义的成员变量类型中。PostMan 测试如下。


32.png


Spring MVC 成功解析出了表单 address.province 及 address.city 字段,并设置到 User 类型 address 成员变量中。


数组类型


除了自定义的类型,我们可能还有使用 List 或者数组接收表单字段的场景,例如在注册用户时我们希望用户提供兴趣爱好。修改 User 类型如下。


@Data
public class User {
    private String username;
    private String password;
    private Address address;
    private List<String> interests;
}


对于这种场景,我们可以使用类似 Java 数组的语法,成员变量后面添加 [index] 作为索引,其中索引值 index 为数字,也可以被单引号或双引号包括。PostMan 测试如下。


34.png



Spring 成功将表单字段解析到 List 中,对于数组同样适用,而且 Spring 还兼容了 [] 中的单引号或者双引号,索引从 0 开始,如果索引不连续中间的值则为 null。


Map 类型


如果我们还想让用户添加自定义的字段该怎么办呢?假定我们想使用 `Map 接收,可以修改 User 类型如下。


@Data
public class User {
    private String username;
    private String password;
    private Address address;
    private List<String> interests;
    private Map<String,Object> extra;
}


此时可以表单字段名称可以同样可以使用数组类型的语法,成员变量名后跟 [key] 作为 Map 中的 key,[] 内部可以添加单引号或者双引号。使用 PostMan 测试如下。


35.png


服务端成功使用 Map 接收到了表单字段。


实现分析


简单对复杂类型接收表单字段的实现做一个分析。对于处理器方法参数解析,都是 HandlerMethodArgumentResolver 处理的,前面几篇文章也断断续续提到了这个接口,对于不带注解的复杂类型,Spring MVC 使用的实现是 ModelAttributeMethodProcessor,这个实现会将 request 表单字段绑定到方法参数中,主要就是用到了 Spring 数据绑定的特性。


目录
相关文章
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
457 1
|
11月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
846 25
|
11月前
|
消息中间件 Java Kafka
【Azure Kafka】使用Spring Cloud Stream Binder Kafka 发送并接收 Event Hub 消息及解决并发报错
reactor.core.publisher.Sinks$EmissionException: Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially.
212 5
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
368 1
Spring高手之路24——事务类型及传播行为实战指南
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
399 5
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
286 1
我以为我对Spring MVC很了解,直到我遇到了...
|
安全 算法 Java
强大!基于Spring Boot 3.3 六种策略识别上传文件类型
【10月更文挑战第1天】在Web开发中,文件上传是一个常见的功能需求。然而,如何确保上传的文件类型符合预期,防止恶意文件入侵,是开发者必须面对的挑战。本文将围绕“基于Spring Boot 3.3 六种策略识别上传文件类型”这一主题,分享一些工作学习中的技术干货,帮助大家提升文件上传的安全性和效率。
781 0
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
391 3
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
630 2
|
XML JSON Java
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
1651 1