1 學習計划
1、分區組合條件分頁查詢
n 分區分頁查詢(沒有過濾條件)
n 分區分頁查詢(帶有過濾條件)
2、分區導出
n 頁面調整
n 使用POI將數據寫到Excel文件
n 通過輸出流進行文件下載
3、定區添加
n 定區概念
n 定區添加頁面調整
n 服務端實現
4、定區分頁查詢
n 頁面調整
n 服務端實現
n 分頁問題總結
2 分區組合條件分頁查詢
2.1 分區分頁查詢(沒有過濾條件)
頁面:WEB-INF/pages/base/subarea.jsp
第一步:修改jsp頁面中datagrid的URL地址
第二步:在SuareaAction中提供分頁查詢方法pageQuery
第三步:修改subarea.hbm.xml
2.2 分區分頁查詢(帶有過濾條件)
2.2.1 頁面調整
datagrid提供的方法:用於重新發送ajax請求,並且可以提交參數
第一步:提供一個工具方法,可以將指定的form表單中所有的輸入項轉為json數據,用於參數提交
//定義一個工具方法,用於將指定的form表單中所有的輸入項轉為json數據{key:value,key:value} $.fn.serializeJson=function(){ var serializeObj={}; var array=this.serializeArray(); $(array).each(function(){ if(serializeObj[this.name]){ if($.isArray(serializeObj[this.name])){ serializeObj[this.name].push(this.value); }else{ serializeObj[this.name]=[serializeObj[this.name],this.value]; } }else{ serializeObj[this.name]=this.value; } }); return serializeObj; };
第二步:為查詢窗口中查詢按鈕綁定事件
$("#btn").click(function(){ //將指定的form表單中所有的輸入項轉為json數據{key:value,key:value} var p = $("#searchForm").serializeJson(); console.info(p); //調用數據表格的load方法,重新發送一次ajax請求,並且提交參數 $("#grid").datagrid("load",p); //關閉查詢窗口 $("#searchWindow").window("close"); });
2.2.2 修改Action中分頁查詢方法
/** * 分頁查詢 */ public String pageQuery(){ DetachedCriteria dc = pageBean.getDetachedCriteria(); //動態添加過濾條件 String addresskey = model.getAddresskey(); if(StringUtils.isNotBlank(addresskey)){ //添加過濾條件,根據地址關鍵字模糊查詢 dc.add(Restrictions.like("addresskey", "%"+addresskey+"%")); } Region region = model.getRegion(); if(region != null){ String province = region.getProvince(); String city = region.getCity(); String district = region.getDistrict(); dc.createAlias("region", "r"); if(StringUtils.isNotBlank(province)){ //添加過濾條件,根據省份模糊查詢-----多表關聯查詢,使用別名方式實現 //參數一:分區對象中關聯的區域對象屬性名稱 //參數二:別名,可以任意 dc.add(Restrictions.like("r.province", "%"+province+"%")); } if(StringUtils.isNotBlank(city)){ //添加過濾條件,根據市模糊查詢-----多表關聯查詢,使用別名方式實現 //參數一:分區對象中關聯的區域對象屬性名稱 //參數二:別名,可以任意 dc.add(Restrictions.like("r.city", "%"+city+"%")); } if(StringUtils.isNotBlank(district)){ //添加過濾條件,根據區模糊查詢-----多表關聯查詢,使用別名方式實現 //參數一:分區對象中關聯的區域對象屬性名稱 //參數二:別名,可以任意 dc.add(Restrictions.like("r.district", "%"+district+"%")); } } subareaService.pageQuery(pageBean); this.java2Json(pageBean, new String[]{"currentPage","detachedCriteria","pageSize", "decidedzone","subareas"}); return NONE; }
修改BaseDao中的分頁查詢方法
3 分區數據導出功能
3.1 頁面調整
為頁面中導出按鈕綁定事件
3.2 服務端實現
第一步:查詢所有的分區數據
第二步:使用POI將數據寫到Excel文件中
第三步:使用輸出流進行文件下載
/** * 分區數據導出功能 * @throws IOException */ public String exportXls() throws IOException{ //第一步:查詢所有的分區數據 List<Subarea> list = subareaService.findAll(); //第二步:使用POI將數據寫到Excel文件中 //在內存中創建一個Excel文件 HSSFWorkbook workbook = new HSSFWorkbook(); //創建一個標簽頁 HSSFSheet sheet = workbook.createSheet("分區數據"); //創建標題行 HSSFRow headRow = sheet.createRow(0); headRow.createCell(0).setCellValue("分區編號"); headRow.createCell(1).setCellValue("開始編號"); headRow.createCell(2).setCellValue("結束編號"); headRow.createCell(3).setCellValue("位置信息"); headRow.createCell(4).setCellValue("省市區"); for (Subarea subarea : list) { HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); dataRow.createCell(0).setCellValue(subarea.getId()); dataRow.createCell(1).setCellValue(subarea.getStartnum()); dataRow.createCell(2).setCellValue(subarea.getEndnum()); dataRow.createCell(3).setCellValue(subarea.getPosition()); dataRow.createCell(4).setCellValue(subarea.getRegion().getName()); } //第三步:使用輸出流進行文件下載(一個流、兩個頭) String filename = "分區數據.xls"; String contentType = ServletActionContext.getServletContext().getMimeType(filename); ServletOutputStream out = ServletActionContext.getResponse().getOutputStream(); ServletActionContext.getResponse().setContentType(contentType); //獲取客戶端瀏覽器類型 String agent = ServletActionContext.getRequest().getHeader("User-Agent"); filename = FileUtils.encodeDownloadFilename(filename, agent); ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename="+filename); workbook.write(out); return NONE; }
4 定區添加
定區是進行物流分配的基本單位,可以將取派員、分區、客戶信息進行關聯,為自動分單提供數據。
頁面:WEB-INF/pages/base/decidedzone.jsp
4.1 頁面調整
4.1.1 使用combobox展示取派員數據
第一步:修改定區頁面中combobox下拉框URL地址
第二步:在StaffAction中提供listajax方法,查詢所有未刪除的取派員,返回json
/** * 查詢所有未刪除的取派員,返回json */ public String listajax(){ List<Staff> list = staffService.findListNotDelete(); this.java2Json(list, new String[]{"decidedzones"}); return NONE; }
第三步:在BaseDao中擴展一個通用查詢方法
第四步:在StaffService中擴展方法,查詢未刪除的取派員
4.1.2 使用datagrid展示分區數據
第一步:修改頁面中datagrid的URL地址
第二步:在SubareaAction中提供listajax方法,查詢所有未關聯到定區的分區,返回json
第三步:在SubareaService中擴展方法,查詢未關聯到定區的分區
4.1.3 為保存按鈕綁定事件提交表單
問題一:提交的表單中存在多個id參數
解決方案:將datagrid的filed由id改為subareaid
問題二:提交的表單中subareaid參數的值為null
解決方案:在分區類中提供getSubareaid方法
4.2 服務端實現
創建定區的Action、Service、Dao
Service代碼:
配置struts.xml
5 定區分頁查詢
第一步:修改定區jsp頁面中datagrid的URL地址
第二步:在定區Action中提供pageQuery方法
第三步:在Decidedzone.hbm.xml中修改,查詢定區對象時需要立即加載關聯的取派員對象
6 分頁查詢死循環問題
1、頁面不需要展示關聯數據時
解決:將關聯對象屬性排除掉
2、頁面需要展示關聯數據時
解決:將關聯對象改為立即加載,並且將關聯對象中的屬性排除