java⾥⾯Dto对象跟VO的区别
浅析VO、DTO、DO、PO的概念、区别和⽤处
javaBean 是⼀种JAVA语⾔写成的可重⽤组件。为写成JavaBean,类必须是具体的和公共的,并且具有⽆参数的构造器。JavaBean 通过提供符合⼀致性设计模式的公共⽅法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过⾃⾝机制发现和操作这些JavaBean 的属性。
VO即value object值对象
主要体现在视图的对象,对于⼀个WEB页⾯将整个页⾯的属性封装成⼀个对象。然后⽤⼀个VO对象在控制层与视图层进⾏传输交换。
DTO (经过处理后的PO,可能增加或者减少PO的属性):
Data Transfer Object数据传输对象
主要⽤于远程调⽤等需要⼤量传输对象的地⽅。
⽐如我们⼀张表有100个字段,那么对应的PO就有100个属性。
但是我们界⾯上只要显⽰10个字段,
客户端⽤WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以⽤只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果⽤这个对象来对应界⾯显⽰,那此时它的⾝份就转为VO。
POJO(POJO是⼀种概念或者接⼝,⾝份及作⽤随环境变化⽽变化):
POJO有⼀些private的参数作为对象的属性。然后针对每个参数定义了get和set⽅法作为访问的接⼝
plain ordinary java object 简单java对象
即POJO是⼀个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊⾓⾊和不继承或不实现任何其它Java框架的类或接⼝。
POJO对象有时也被称为Data对象,⼤量应⽤于表现现实中的对象。
⼀个POJO持久化以后就是PO。
直接⽤它传递、传递过程中就是DTO
直接⽤来对应表⽰层就是VO
发布于:2018.06.25 02:15
VO与DTO的区别
既然DTO是展⽰层与服务层之间传递数据的对象,为什么还需要⼀个VO呢?对!对于绝⼤部分的应⽤场景来说,DTO和VO的属性值基本是⼀致的,⽽且他们通常都是POJO,因此没必要多此⼀举,但不要忘记这是实现层⾯的思维,对于设计层⾯来说,概念上还是应该存在VO和DTO,因为两者有着本质的区别,DTO代表服务层需要接收的数据和返回的数据,⽽VO代表展⽰层需要显⽰的数据。
⽤⼀个例⼦来说明可能会⽐较容易理解:
例如Service层有⼀个getUser的⽅法返回⼀个系统⽤户,其中有⼀个属性是gender(性别),对于Service层来说,它只从语义上定义:1-男性,2-⼥性,0-未指定,⽽对于展⽰层来说,它可能需要⽤“帅哥”代表男性,⽤“美⼥”代表⼥性,⽤“秘密”代表未指定。说到这⾥,可能你还会反驳,在服务层直接就返回“帅哥美⼥”不就⾏了吗?对于⼤部分应⽤来说,这不是问题,但设想⼀下,如果需求允许客户可以定制风格,⽽不同风格对于“性别”的表现⽅式不⼀样,⼜或者这个服务同时供多个客户端使⽤(不同门户),⽽不同的客户端对于表现层的要求有所不同,那么,问题就来了。再者,回到设计层
⾯上分析,从职责单⼀原则来看,服务层只负责业务,与具体的表现形式⽆关,因此,它返回的DTO,不应该出现与表现形式的耦合。
理论归理论,这到底还是分析设计层⾯的思维,是否在实现层⾯必须这样做呢?⼀⼑切的做法往往会得不偿失,下⾯我马上会分析应⽤中如何做出正确的选择。
VO与DTO的应⽤
上⾯只是⽤了⼀个简单的例⼦来说明VO与DTO在概念上的区别,本节将会告诉你如何在应⽤中做出正确的选择。
在以下才场景中,我们可以考虑把VO与DTO⼆合为⼀(注意:是实现层⾯):
当需求⾮常清晰稳定,⽽且客户端很明确只有⼀个的时候,没有必要把VO和DTO区分开来,这时候VO可以退隐,⽤⼀个DTO即可,为什么是VO退隐⽽不是DTO?回到设计层⾯,Service层的职责依然不应该与View层耦合,所以,对于前⾯的例⼦,你很容易理解,DTO对于“性别”来说,依然不能⽤“帅哥美⼥”,这个转换应该依赖于页⾯的脚本(如JavaScript)或其他机制(JSTL、EL、CSS)
即使客户端可以进⾏定制,或者存在多个不同的客户端,如果客户端能够⽤某种技术(脚本或其他机制)实现转换,同样可以让VO退隐
以下场景需要优先考虑VO、DTO并存:
因为某种技术原因,⽐如某个框架(如Flex)提供⾃动把POJO转换为UI中某些Field时,可以考虑在实现层⾯定义出VO,这个权衡完全取决于使⽤框架的⾃动转换能⼒带来的开发和维护效率提升与设计多⼀个VO所多做的事情带来的开发和维护效率的下降之间的⽐对。
如果页⾯出现⼀个“⼤视图”,⽽组成这个⼤视图的所有数据需要调⽤多个服务,返回多个DTO来组装(当然,这同样可以通过服务层提供⼀次性返回⼀个⼤视图的DTO来取代,但在服务层提供⼀个这样的⽅法是否合适,需要在设计层⾯进⾏权衡)。
发布于:2018.06.25 02:22
JavaBean 是⼀种JAVA语⾔写成的可重⽤组件。为写成JavaBean,类必须是具体的和公共的,并且具有⽆参数的构造器。JavaBean 通过
提供符合⼀致性设计模式的公共⽅法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过⾃⾝机制发现和操作这些JavaBean 的属性。
VO即value object值对象
主要体现在视图的对象,对于⼀个WEB页⾯将整个页⾯的属性封装成⼀个对象。然后⽤⼀个VO对象在控制层与视图层进⾏传输交换。DTO (经过处理后的PO,可能增加或者减少PO的属性):
Data Transfer Object数据传输对象
主要⽤于远程调⽤等需要⼤量传输对象的地⽅。
⽐如我们⼀张表有100个字段,那么对应的PO就有100个属性。
但是我们界⾯上只要显⽰10个字段,
客户端⽤WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以⽤只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果⽤这个对象来对应界⾯显⽰,那此时它的⾝份就转为VO。
POJO(POJO是⼀种概念或者接⼝,⾝份及作⽤随环境变化⽽变化):
POJO有⼀些private的参数作为对象的属性。然后针对每个参数定义了get和set⽅法作为访问的接⼝
plain ordinary java object 简单java对象
即POJO是⼀个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊⾓⾊和不继承或不实现任何其它Java框架的类或接⼝。
POJO对象有时也被称为Data对象,⼤量应⽤于表现现实中的对象。
⼀个POJO持久化以后就是PO。
直接⽤它传递、传递过程中就是DTO
直接⽤来对应表⽰层就是VO
发布于:2018.06.26 02:01
经常会接触到VO,DO,DTO的概念,本⽂从领域建模中的实体划分和项⽬中的实际应⽤情况两个⾓度,对这⼏个概念进⾏简析。java技术介绍百度百科
得出的主要结论是:在项⽬应⽤中,VO对应于页⾯上需要显⽰的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除⼆者之外需要进⾏传递的数据。
⼀、实体类
百度百科中对于实体类的定义如下:
实体类的主要职责是存储和管理系统内部的信息,它也可以有⾏为,甚⾄很复杂的⾏为,但这些⾏为必须与它所代表的实体对象密切相关。
根据以上定义,我们可以了解到,实体类有两⽅⾯内容,存储数据和执⾏数据本⾝相关的操作。这两⽅⾯内容对应到实现上,最简单的实体类是POJO类,含有属性及属性对应的set和get⽅法,实体类常见的⽅法还有⽤于输出⾃⾝数据的toString⽅法。
⼆、领域模型中的实体类
领域模型中的实体类分为四种类型:VO、DTO、DO、PO,各种实体类⽤于不同业务层次间的交互,并会在层次内实现实体类之间的转化。
业务分层为:视图层(VIEW+ACTION),服务层(SERVICE),持久层(DAO)
相应各层间实体的传递如下图
项⽬中我们并没有严格遵循这种传递关系,但这种和业务层次的关联对我们理解各实体类的作⽤是有帮助的。(我们没有接触到PO的原因,我理解为ORM对PO进⾏了封装)
以下是资料的原⽂,上图是基于此绘制的:
概念:
VO(View Object):视图对象,⽤于展⽰层,它的作⽤是把某个指定页⾯(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的⽬的是为了EJB的分布式应⽤提供粗粒度的数据实体,以减少分布式调⽤的次数,从⽽提⾼分布式调⽤的性能和降低⽹络负载,但在这⾥,我泛指⽤于展⽰层与服务层之间的数据传输对象。
DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或⽆形的业务实体。
PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成⼀⼀对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若⼲个)就对应PO的⼀个(或若⼲个)属性。
模型:
下⾯以⼀个时序图建⽴简单模型来描述上述对象在三层架构应⽤中的位置
l ⽤户发出请求(可能是填写表单),表单的数据在展⽰层被匹配为VO。
l 展⽰层把VO转换为服务层对应⽅法所要求的DTO,传送给服务层。
l 服务层⾸先根据DTO的数据构造(或重建)⼀个DO,调⽤DO的业务⽅法完成具体业务。
l 服务层把DO转换为持久层对应的PO(可以使⽤ORM⼯具,也可以不⽤),调⽤持久层的持久化⽅法,把PO传递给它,完成持久化操作。l 对于⼀个逆向操作,如读取数据,也是⽤类似的⽅式转换和传递,略。
三、项⽬中的实体类
项⽬中常见的实体类有VO,DO和DTO,命名规则也常是以相应字符串结尾,如*VO.Java。但是DTO不总是遵循这个规则,⽽通常与他的⽤途有关,如写成*Query.Java,表⽰存储了⼀个查询条件。项⽬中实体类出现的业务层次也没有这么严格,例如我们可以在视图层就组装⼀个DO,也可以将⼀个VO从持久层传出来,所以与业务分层相关联的划分⽅法显得有些冗余。从项⽬代码中抽象出的理解是:VO对应于页⾯上需要显⽰的数据,DO对应于数据库中存储的数据,DTO对应于除⼆者之外需要进⾏传递的数据。
发布于:2018.06.27 01:03
不复制粘贴,写的通俗易懂⼀点。由于会分包分层,避免乱套。就有了这些对象类型
VO(value object)
⽤于返回给前端交互。传给前端的对象被称作VO(web层)。也就是前端调⽤你restful接⼝你返回的对象。
DTO(Data Transfer Object)
⽤于业务层(biz层)的处理
⼀般来说的流程就是
从数据库中取出的对象,⽐如是data ,那么就先需要转换成dataDTO处理数据。然后返回到restful前转换成需要的VO
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。