关于三层架构中的VO,DTO对象的使用说明
文章目录
前言
看到网上很多资料,都在将VO和DTO之间微妙的关系,最近有个项目刚好用到很多VO和DTO之间的转换调用,于是就想将自己的经验和理解写下来,我会使用先分开理解,再说差异。一、VO(View Object)
简单来说VO的生命周期就是,页面发给控制器我们可以使用实体的VO对象,控制器返回给页面也可以使用VO对象
,即面向页面开发,页面需要什么我们就封装一个VO给它。
你们会问怎么做的好处是什么?
案例1:
我们返回的数据中包含时间参数,一般我们会做日期格式化。如果返回的是JSON对象,那么我们一般会直接在实体对象的日期属性上添加@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
,如果有了VO,就会是这样处理,我们会把这个日期处理的注解,放到VO上,因为可能不同的业务对时间的格式要求不同,还有符合设计原则中的单一职责
,符合单一原则会让你的代码结构清晰。
案例2:
我们在做前端提交的时候往往都需要做后端校验,这个时候如果我们使用的是@Validated
注解,那么VO的价值就体现出来啦,我们不需要在实体Bean
(Student)里面写一堆注解,实体Bean(Student)依然可以保持Pojo的标准
,把校验注解写到StudentVO
,实现了隔离原则
。
这个时候你会遇到一个问题,如果server层是实体Bean(Student),controller层是(StudentVO),要怎么转换能,如果你使用的是Spring框架,那么Spring已经为我们做好一切,提示:org.springframework.beans.BeanUtils
,再提示:copyProperties()方法
.
二、DTO(Data Transfer Object)
Controller层将VO对象转换为DTO对象传输给Service层,Service层通过DTO对象进行数据传输进行业务处理,然后返回DTO对象。
三、FO(Form Object)
页面表单提交的数据转换为FO对象,Controller转换为DTO对象传输给,Service层通过DTO对象进行数据传输进行业务处理,然后返回DTO对象,Controller转换为VO对象返回到页面。