广告弹窗后台管理:
代码修改,新增两个字段,新增一张表
新增需求:
在advert_html表中添加两个字段:pageId和position,由这两个字段确定广告所在的位置,新增广告位置表advert_position,用来确定广告位置。
收获:
1.所有逻辑都放在service层处理:
2.所有从页面传回来的数据都不可信,需要进行一次判断:
一般判断是非为null
if (null != page) { Date startTime = page.getStart(); Date endTime = page.getEnd(); Integer status = page.getStatus();
list一般用null和isEmpty()来判断
if (dataList != null && !dataList.isEmpty()) { TODO: 16/7/22 dtoList = new ArrayList<AdvertHtmlDto>(dataList.size()); dtoList = entiyListToDtoList(dataList, dtoList); TODO: 16/7/22 }
3.调用对象属性的时候需要判断对象是否为nul,判调用属性的方法时同样需要判断属性是否为null,这样为为了防止出现空指针异常:
if (advertHtml != null) { Date beginTime=advertHtml.getBeginTime(); if(beginTime==null){ return; }
4.用到的固定数值可以设置为常量:
if (null != status && status != Constants.PAGE_RETURN_STATUS_ALL) {
public static int PAGE_RETURN_STATUS_NOTRELEASE = 0;//未发布 public static int PAGE_RETURN_STATUS_ALREADYRELEASE = 1;//已发布 public static int PAGE_RETURN_STATUS_DELETED = 2;//已删除 public static int PAGE_RETURN_STATUS_ALL = -1;//全部
5.需要访问数据库的操作尽可能地放到后面,这样做如果前面的代码报错时该操作就可以不进行,省去了访问数据库的操作:
if (rowCount == 0) { return null; } page.getPager().setRowCount(rowCount); page.setSort("ad.begin_time");//设置排序字段 page.getPager().setOrderDirection(false);//设置排序方案 TODO: 2016/7/21 0021 List<AdvertHtml> dataList = mapper.queryByList(page);
6.尽可能地把代码抽出来封装到方法中,处理时直接调用方法就好,这样看起来清晰,而且易懂:
if (!dataList.isEmpty()) { TODO: 16/7/22 dtoList = new ArrayList<AdvertHtmlDto>(dataList.size()); dtoList = entiyListToDtoList(dataList, dtoList); TODO: 16/7/22 }
private List<AdvertHtmlDto> entiyListToDtoList(List<AdvertHtml> dataList, List<AdvertHtmlDto> dtoList) { for (AdvertHtml advertHtml : dataList) { AdvertHtmlDto advertHtmlDto = EntiyToDto(advertHtml); dtoList.add(advertHtmlDto); } return dtoList; }
private AdvertHtmlDto EntiyToDto(AdvertHtml advertHtml) { AdvertHtmlDto advertHtmlDto = new AdvertHtmlDto(); //实体类与DTO数据转换 advertHtmlDto.setAdvertId(advertHtml.getAdvertId()); advertHtmlDto.setCreateTime(advertHtml.getCreateTime()); advertHtmlDto.setUpdateTime(advertHtml.getUpdateTime()); advertHtmlDto.setType(advertHtml.getType()); advertHtmlDto.setPicPath(advertHtml.getPicPath()); advertHtmlDto.setTargetUrl(advertHtml.getTargetUrl()); advertHtmlDto.setBeginTime(advertHtml.getBeginTime()); advertHtmlDto.setEndTime(advertHtml.getEndTime()); advertHtmlDto.setIsDelete(advertHtml.getIsDelete()); fillDto(advertHtml, advertHtmlDto); //逻辑判断 Date beginTime = advertHtml.getBeginTime(); if (beginTime == null) { return null; } long getBeginTime = beginTime.getTime(); long currentTime = new Date().getTime(); if (currentTime > getBeginTime) { advertHtmlDto.setIsDelete(2); } if (getBeginTime - currentTime < 3600 * 1000) { advertHtmlDto.setIsEditable(0); } else { advertHtmlDto.setIsEditable(1); } return advertHtmlDto; }
7.若一个变量需要进行多次方法调用才能得到的话,可以多设几个变量,这样代码不会过长,而且更容易被看懂:
if (advertHtml != null) { // long beginTime = advertHtml.getBeginTime().getTime(); Date beginTime=advertHtml.getBeginTime(); if(beginTime==null){ return; } long getBeginTime=beginTime.getTime();
8.Dao,Entiy,,Dto,Vo认知与理解:
Dao,Entiy:与实体对应,访问数据库:
必须存在
@Data public class AdvertHtml extends BaseEntity { private Long advertId; private Date createTime; private Date updateTime; private Integer type; //0.图片,1.gif图片. private String picPath; //图片地址. private String targetUrl; //目标网址. private Date beginTime; // 开始时间 private Date endTime; //结束时间 private Integer isDelete; //状态,是否删除 private Integer pageId; private Integer position; }
Dto:后台向页面传输数据的载体:
应用场景:需要在页面展示一些实体中并不存在的字段
@Data public class AdvertHtmlDto extends BasePage { private Long advertId; private Date createTime; private Date updateTime; private Integer type; //0.图片,1.gif图片. private String picPath; //图片地址. private String targetUrl; //目标网址. private Date beginTime; // 开始时间 private Date endTime; //结束时间 private Integer isDelete; //状态,是否删除 private Integer isEditable; //状态,是否可编辑 private Integer pageId; private Integer position; private String positionName; private Long positionId; }
Vo:页面向后抬传输数据的载体:
应用场景:页面向后台传入一些数据,但和实体字段可能不一致
@Data public class AdvertHtmlModelPage extends BasePage { private Boolean deleted; private Date start; private Date end; private Integer status; }
9.if语句逻辑处理:
尽可能地采用发散性的树状结构思维,不要采用扁平化思维
业务需求:
按条件查询广告:
页面传入三个字段,用来确定发布时间begintime的范围的开始时间start和结束时间end,发布状态status,确定发布状态的是n当前时间,begintime大于当前时间则为未发布,小于当前时间则为发布
(1).扁平化思维:
//三个参数
// if (page.getStatus() != null && startTime != null && endTime != null) {
/* Date startTime = startTime;
Date endTime = endTime;
//之间
if (nowTime.after(startTime) && nowTime.before(endTime)) {
if (page.getStatus() == 2) {
page.setStart(nowTime);
}
if (page.getStatus() == 3) {
page.setEnd(nowTime);
}
}
if (nowTime.before(startTime)) {
if (page.getStatus() == 3) {
page.setEnd(nowTime);
// throw new Exception("不可能");
}
}
if (nowTime.after(endTime)) {
if (page.getStatus() == 2) {
page.setStart(nowTime);
// throw new Exception("不可能");
}
}*/
// }
//两个参数
/* if (page.getStatus() != null && startTime != null && endTime == null) {
Date startTime = startTime;
if (nowTime.before(startTime)) {
*//* if (page.getStatus() == 2) {
}*//*
if (page.getStatus() == 3) {
page.setEnd(nowTime);
// throw new Exception("不可能");
}
}
if (nowTime.after(startTime)) {
if (page.getStatus() == 2) {
page.setStart(nowTime);
}
if (page.getStatus() == 3) {
page.setEnd(nowTime);
}
}
}
if (page.getStatus() != null && startTime == null && endTime != null) {
Date endTime = endTime;
if (nowTime.before(endTime)) {
if (page.getStatus() == 2) {
page.setStart(nowTime);
}
if (page.getStatus() == 3) {
page.setEnd(nowTime);
}
}
if (nowTime.after(endTime)) {
if (page.getStatus() == 2) {
page.setStart(nowTime);
// throw new Exception("不可能");
}
}
}
//一个参数
if (page.getStatus() != null && startTime == null && endTime == null) {
if (page.getStatus() == 2) {
page.setStart(nowTime);
}
if (page.getStatus() == 3) {
page.setEnd(nowTime);
}
}*/
/* if (page.getStatus() == null && startTime != null && endTime == null) {
}
if (page.getStatus() == null && startTime == null && endTime != null) {
}*/
(2).发散性思维
/* if(null != page) {
Date startTime = page.getStart();
Date endTime = page.getEnd();
Integer status = page.getStatus();
if (null == status) {
} else if (2 == status) {
if (null == startTime) {
startTime=nowTime;
} else if (startTime.before(nowTime)) {
if (null == endTime) {
startTime=nowTime; //3=2,2<now,3=null
} else if (endTime.after(nowTime)) {
startTime=nowTime;//3=2,2<now,3>now
} else {
// return null;//3=2,2<now,3<now
startTime=nowTime;
}
}
} else if (3 == status) {
if (null == startTime) {
endTime=nowTime;
} else if (startTime.before(nowTime)) {
if (null == endTime) {
endTime=nowTime; //3=3,2<now,3=null
} else if (endTime.after(nowTime)) {
endTime=nowTime;//3=3,2<now,3>now
} else {
//3=3,2<now,3<now
}
} else if (startTime.after(nowTime)) {
if (null == endTime) {//3=3,2>now,3=null
endTime=nowTime;
} else if (endTime.after(nowTime)) {//3=3,2>now,3>now
// return null;
endTime=nowTime;
} else {
// return null; //3=3,2>now,3<now
endTime=nowTime;
}
}
}
}*/
(3).精简
/* if (null == status) {
} else if (0 == status) {
if(endTime!=null&&endTime.before(nowTime)){
// return null;
throw new ServiceException(ResponseCode.SERVICE_EXCEPTION,"不可能");
}else{
if(startTime==null || startTime.before(nowTime)){
startTime=nowTime;
}
}
delete=false;
}
else if (1 == status) {
if(startTime!=null&&startTime.after(nowTime)){
throw new ServiceException(ResponseCode.SERVICE_EXCEPTION,"不可能");
// return null;
}else{
if(endTime==null || endTime.after(nowTime)){
endTime=nowTime;
}
}
delete=false;
}
else if (2 == status) {
delete=true;
}else{
delete=null;
}*/
(4).最终版
Date nowTime = new Date(); if (null != page) { Date startTime = page.getStart(); Date endTime = page.getEnd(); Integer status = page.getStatus(); Boolean delete = null; if (null != status && status != Constants.PAGE_RETURN_STATUS_ALL) { if (Constants.PAGE_RETURN_STATUS_DELETED == status) { delete = true; } else { delete = false; if (Constants.PAGE_RETURN_STATUS_NOTRELEASE == status) { if (endTime != null && endTime.before(nowTime)) { return null; } else { if (startTime == null || startTime.before(nowTime)) { startTime = nowTime; } } } else if (Constants.PAGE_RETURN_STATUS_ALREADYRELEASE == status) { if (startTime != null && startTime.after(nowTime)) { return null; } else { if (endTime == null || endTime.after(nowTime)) { endTime = nowTime; } } } } } page.setStart(startTime); page.setEnd(endTime); page.setDeleted(delete); }10.mvc新理解
controller与页面一一对应,一个controller与一个service对应,一个service可以拥有多个dao,dao与实体一一对应,实体与数据库表一一对应。实体的字段与数据库表一致,dao层对实体进行增删改查操作,controller接收页面请求调用service,service进行业务逻辑处理并调用dao层相应方法访问数据库,对数据库数据进行访问。