bean的一种使用姿势

1 篇文章 0 订阅
1 篇文章 0 订阅

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……其实我也没有想到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值