bean的一种使用姿势
问题描述
我们所使用的spring MVC框架的结构分为三层,control,service和dao层。其中,dao负责与数据库进行交互;service处理业务逻辑;control负责与页面交互。
我们的系统中,有很多表格展现的内容,其中表格还需要有查询数据、分页等页务逻辑。
我找到以前的代码,js向controller传参数是这样的:
function getQueryCondition() {
var root = corporateManager.treeManager.data[0].id;
if (root != 'root') {
var start = new Date(Date.parse($("#startTime").val().substring(0, 10) + "T00:00:00"));
var end = new Date(Date.parse($("#endTime").val().substring(0, 10) + "T23:59:59"));
if (Math.floor((end - start) / (1000 * 60 * 60 * 24) + 1) > 7) {
$.ligerDialog.error("查询时间间隔不能大于7天!");
return;
}
}
var serviceInfo = {
"code": $("#code").val(),
"name": $("#name").val(),
"mustQueryPerson": "true",
"corporate": getCorporateSelect(),
"startTime": $("#startTime").val() + " 00:00:00",
"endTime": $("#endTime").val() + " 23:59:59",
"backTime": $("#backTime").val(),
"attendanceState": $("#attendanceState").val(),
"pagesize": recordGridManager.get("pageSize"),
"queryType": "attendance",
"dormId": $("#dormID").val()
};
return serviceInfo;
}
在controller里面接收到参数是这样的,其中还要进行非空的验证判断,分页数据的处理等。
String startTime = request.getParameter("startTime");
String endTime = request.getParameter("endTime");
String person = request.getParameter("personID");
backTime = request.getParameter("backTime");
int pageno = Integer.valueOf(request.getParameter("page") == null ? "1" : request.getParameter("page"));
String[] pageSizeArr = map.get("pagesize");
String attendanceState = request.getParameter("attendanceState");
String dormId = request.getParameter("dormId");
int pageSize = Integer.valueOf(pageSizeArr == null ? "10" : (pageSizeArr.length > 1 ? pageSizeArr[1] : pageSizeArr[0]));
//获取到人员实体集合
String code = request.getParameter("code");
String name = request.getParameter("name");
String corporate = request.getParameter("corporate");
这样调用service中的方法
personObjectList = service.getNoswingPerson(corporateList, name, code, sdfT.parse(backTime).getTime(), attendanceState, sdf.parse(startTime).getTime(), sdf.parse(endTime).getTime(), dormId, (pageno - 1) * pageSize, pageSize,dayLong);
在service中又进行了一次处理,然后传给dao层。
HashMap hm = new HashMap();
StringBuffer deptSb = new StringBuffer();
if (deptID != null && deptID.size() > 0) {
deptSb.append("(");
for (Object ob : deptID) {
deptSb.append("'").append(ob.toString()).append("'").append(",");
}
deptSb.deleteCharAt(deptSb.length() - 1);
deptSb.append(")");
}
hm.put("time1", time + RIGHT_TIME);
hm.put("state", state);
hm.put("startTime", startTime);
hm.put("endTime", endTime);
hm.put("deptIDList", deptSb.length() == 0 ? null : deptSb.toString());
hm.put("personName", personName.equals("") ? null : "%" + personName + "%");
hm.put("dormId", "".equals(dormId) ? null : dormId);
hm.put("personCode", personCode.equals("") ? null : "%" + personCode + "%");
hm.put("days", days);
hm.put("start", start);
hm.put("size", size);
return dao.getNoswingPerson(hm);
dao中怎么使用就省略了。可以看到,其实controller和service层其实进行处理了两次,而且由于存在讨厌的空指针异常,还判断了两次空……
so urgly!
另一种解决方案
我把需要的条件封装到两个bean中,其中基类包括分页等通用的处理,导出类中包含一些个性化的设置,并进行了空指针异常判断的处理等内容。
public class BaseCondition {
private int start = 0;
private int size = 0;
private int page = 1;
private int pageSize = 10;
private String sortName="";
private String sortOrder="DESC";
public String getSortName() {return sortName;}
public void setSortName(String sortName) {
if(sortName==null) return;
this.sortName = sortName;
}
public String getSortOrder() {return sortOrder;}
public void setSortOrder(String sortOrder) {
if(sortOrder==null) return;
this.sortOrder = sortOrder;
}
public void setPage(int page){this.page = page;}
public int getPage(){return this.page;}
public void setPageSize(int pageSize){this.pageSize = pageSize;}
public int getStart() {
if(start == 0){
return (page - 1) * pageSize;
}
return start;
}
public void setStart(int start) {this.start = start;}
public int getSize() {
if(size == 0) {
return pageSize;
}
return size;
}
public void setSize(int size) {
this.size = size;
}
}
public class Condition extends BaseCondition{
private long startTime;
private long endTime;
private String isPresidium = "0";
private String representativeType="";
private String monitorId="";
private String signWay="";
private String cmId="";
private int isSignInOut=0;
private int total = 0;
private int statisType = 0;
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public void setStartTimeStr(String startTimeStr){
try{
this.startTime = sdf.parse(startTimeStr).getTime();
} catch(Exception e){
this.startTime = 0;
}
}
public void setEndTimeStr(String endTimeStr){
try{
this.endTime = sdf.parse(endTimeStr).getTime();
} catch(Exception e){
this.endTime = 0;
}
}
public long getStartTime() {return startTime;}
public void setStartTime(long startTime) {this.startTime = startTime;}
public long getEndTime() {return endTime;}
public void setEndTime(long endTime) {this.endTime = endTime;}
public String getIsPresidium() {return isPresidium;}
public void setIsPresidium(String isPresidium) {
if(isPresidium==null) return;
this.isPresidium = isPresidium;
}
public String getRepresentativeType() {return representativeType;}
public void setRepresentativeType(String representativeType) {
if(representativeType==null) return;
this.representativeType = representativeType;
}
public String getMonitorId() {return monitorId;}
public void setMonitorId(String monitorId) {
if(monitorId==null) return;
this.monitorId = monitorId;
}
public String getSignWay() {return signWay;}
public void setSignWay(String signWay) {
if(signWay==null) return;
this.signWay = signWay;
}
public String getCmId() {return cmId;}
public void setCmId(String cmId) {
if(cmId==null) return;
this.cmId = cmId;
}
public int getTotal() {return total;}
public void setTotal(int total) {this.total = total;}
public int getStatisType() {return statisType;}
public void setStatisType(int statisType) {this.statisType = statisType;}
public int getIsSignInOut() {return isSignInOut;}
public void setIsSignInOut(int isSignInOut) {this.isSignInOut = isSignInOut;}
public String getDirection() {
if(isSignInOut ==0){
return "('10','20')";
}else{
return "('10')";
}
}
public String getStatisTypeCondition(){
if(statisType == 1){
return "direction in " + getDirection();
}
if(statisType == 2){
return "(direction not in " + getDirection() +" or direction is null)";
}
return " 1= 1 ";
}
}
由于采用了spring框架, 我们的controller只需要这样传入实体就可以了
@RequestMapping(params = "method=getAttendStatis")
public @ResponseBody
String getAttendStatis(Condition condition) {
……
}
而service也只需下传给dao就可以了,当然,如果需要处理数据,在这里处理一下
public List<allpersoninfo> getDetailList(Condition condion){
List<allpersoninfo> list = meetingControlManagerDao.getDetailList(condion);
if(list == null){
return new ArrayList<allpersoninfo>();
}
return list;
}
</allpersoninfo></allpersoninfo></allpersoninfo>
简单总结一下:
使用这种方式的主要优点
- 减少了一次数据处理的过程,后台只在bean中一次写入,不需要再进行处理
- 集中进行为空判断等操作,减少冗余
- 其实我们做的很多管理系统中,查询条件有很多都是类似的,这些查询条件都是可以复用的(如人员姓名,人员身份证号等),而不用每个模块封装一个查询的bean
- and so on……其实我也没有想到