1、概念:
DTO:Data Transfer Object,数据传输对象,起到数据封装与隔离的作用
2、应用介绍:
在实际项目中,DTO的分在两层传输,一层是service层向controller层,这一层的DTO封装service执行结果,给controller,简化业务数据,只提取部分业务相关字段或补充处理相关字段,不同业务可能有不同的此类dto,具有业务相关性;
另外一层是controller层向web前端层,这一层DTO封装controller执行结果,返回给前端web,请求返回实体封装类,适用于所有ajax请求返回的类型实体,无业务相关性
实际上,第一层DTO通常会被封装进第二次DTO中,在接口调用如RPC调用中,订阅者只需要拿到简化的业务数据对象,而不用把整个实体bean给对方。
3、实例:
service层向controller层dto:
例如执行秒杀业务,执行结果通常包含状态码、状态信息、执行业务id以及成功的明细数据,把分散的数据进行封装返回给controller
DTO实体类:
public class SeckillExecution {
private long seckillId;
//秒杀执行状态code
private int state;
//秒杀执行状态信息
private String stateInfo;
//不直接使用枚举来定义成员变量属性,因为传输对象以json格式给前台,默认情况下无法处理枚举类型数据
//private SeckillStateEnum seckillStateEnum
//秒杀成功,返回的购买明细实体
private SuccessKilled successKilled;
/**
* 秒杀执行成功初始化
* @param seckillId
* @param seckillStateEnum 封装状态信息的枚举常量
* @param successKilled
*/
public SeckillExecution(long seckillId, SeckillStateEnum seckillStateEnum,SuccessKilled successKilled) {
super();
this.seckillId = seckillId;
this.state = seckillStateEnum.getStateCode();
this.stateInfo = seckillStateEnum.getStateInfo();
this.successKilled = successKilled;
}
/**
* 秒杀执行失败的初始化
* @param seckillId
* @param seckillStateEnum 封装状态信息的枚举常量
*/
public SeckillExecution(long seckillId, SeckillStateEnum seckillStateEnum) {
super();
this.seckillId = seckillId;
this.state = seckillStateEnum.getStateCode();
this.stateInfo = seckillStateEnum.getStateInfo();
}
setter()
getter()
}
service直接返回DTO对象:
public SeckillExecution executeSeckill(。。。){
。。。
}
而实际的业务对象是这样的:
public class Seckill {
private long seckillId;
private String name;
private int number;
private Date startTime;
private Date endTime;
private Date createTime;
setter()
getter()
}
注:在RPC接口调用过程中,把DTO及接口提供给订阅者,而不用冗余的业务实体。
controller层向web前端层dto:
public class SeckillResult<T> {
private static final long serialVersionUID = 1L;
//注意boolean类型的getter方法,不是以get开头,而是以is开头,会影响数据封装,需手动修改
private boolean success;
//返回给前台的实体数据或者字符串
private T data;
//异常信息
private String error;
/**
* 数据获取失败的情况
* @param success
* @param error
*/
public SeckillResult(boolean success, String error) {
super();
this.success = success;
this.error = error;
}
/**
* 数据获取成功,封装数据实体
* @param success
* @param data
* @param error
*/
public SeckillResult(boolean success, T data) {
super();
this.success = success;
this.data = data;
}
setter()
getter()
}
以上内容虽说表层、简单,但都是项目中很使用的东西,更深层次的设计模式理论等,后续再深入、补充。。。