• A+

mvc模式中关于DTO层的简单使用

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()    
}

 

所属分类:后台

全部评论: 0

    我有话说:
    ×