品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
我们在写Controller的时候,向页面传数据时,部分开发者习惯使用Model、直接返回Map,或是封装专用传输对象,这几种写法效果好像都差不多,但适用场景其实不太一样。在用Map和自定义对象这两种方式接收参数的时候,很多人分不清什么时候该用哪个,写着写着就容易混淆。下面就给大家介绍一下Spring MVC用什么对象向前台传数据,Spring MVC使用Map接收和对象的区别的相关内容。
一、Spring MVC用什么对象向前台传数据
我们在传统的服务端渲染项目里常见的就是Model这个对象,在Controller方法入参声明Model,Spring MVC会自动完成注入,方法里调用addAttribute方法把数据以键值对形式存进去,视图页面通过键名就能取到对应的值,Model用起来比较轻量,常用在跳转到JSP或者Thymeleaf页面的场景,数据传过去之后模板引擎负责渲染成HTML。

与Model类似的还有ModelMap和ModelAndView,ModelMap其实是Model接口的一个实现类,用法差不多,都是用于存储键值对数据。ModelAndView就不一样了,它是把数据和视图信息绑在了一起,方法里可以直接设置视图名并通过addObject装载数据,一个对象就把返回页面和携带数据这两件事都做了。

现在前后端分离的项目中基本不用Model这一套,直接在方法上返回一个具体的对象,配合@ResponseBody或者@RestController,让消息转换器把这个对象序列化成JSON传给前端,这个对象可以是实体类,也可以是专门为接口返回设计的DTO。

我们在开发时通常会统一封装一个类似Result或者Response的结构,把状态码、提示信息和实际数据分开放,前端拿到之后按固定字段取值,不用每个接口都单独猜返回格式长什么样。

二、Spring MVC使用Map接收和对象的区别
下面再来说说用Map接收参数是怎么回事,Controller方法参数里声明一个Map类型,Spring MVC会自动把请求里的参数按键值对的形式塞进去,前端传了什么字段,Map里就会有对应的键,这种写法的好处是灵活,不用提前定义一个类,在遇到参数不固定或者只是临时接一下调试的时候,用Map确实省事些。

不过Map的灵活也是有代价的,Map接收参数没有类型校验,取值的时候得自己转类型,如果键名写错了,编译期是发现不了的,需要跑起来才会报错或者取到空值,排查起来会比较费劲。而且Map这种结构对后续维护不太友好,别人接手代码的时候光看方法签名根本不知道这个接口到底需要哪些参数,需要翻前端代码或者接口文档才能理清楚。

如果我们用对象接收就不一样了,只需要提前定义好一个类,字段名和类型都写清楚,Spring MVC会按照请求参数名和类的属性名自动匹配赋值,这样写的好处是类型安全,编译期就能及时发现问题,IDE也能给出完整的字段提示。而且可读性强,方法签名往那一放,这个接口需要什么参数一目了然,如果字段需要校验,还可以配合@Valid和相关注解,直接在实体类上加规则统一做参数校验。

所以我们在实际项目中,正式的业务接口基本都会考虑用对象接收参数,Map更多是用在一些不固定字段的场景,或者写代码调试的时候图个方便。
以上就是Spring MVC用什么对象向前台传数据,Spring MVC使用Map接收和对象的区别的全部内容了。向前台传数据,服务端渲染项目靠的是Model、ModelMap这类对象把数据交给模板引擎去渲染页面,前后端分离项目是直接给前端返回具体对象,靠消息转换器序列化成JSON。在接收参数的时候,Map虽然不用提前定义类,看上去很方便。但是没有类型校验也没有智能提示,维护会很麻烦,用对象来接收会安全些,可读性强,还能配合校验注解,正式业务接口一般优先选择实体对象接收参数。