1、带有过滤条件的查询(解决form表单提交时,分页携带过滤条件困难的问题)and连表查询返回数据不标准问题
由于使用的都是ajax请求,页面没刷新,数据(条件的参数)一直存在页面中
1 //定义一个工具方法,用于将指定的form表单中所有的输入项转为json数据{key:value,key:value} 2 $.fn.serializeJson=function(){ 3 var serializeObj={}; 4 var array=this.serializeArray(); 5 $(array).each(function(){ 6 if(serializeObj[this.name]){ 7 if($.isArray(serializeObj[this.name])){ 8 serializeObj[this.name].push(this.value); 9 }else{ 10 serializeObj[this.name]=[serializeObj[this.name],this.value]; 11 } 12 }else{ 13 serializeObj[this.name]=this.value; 14 } 15 }); 16 return serializeObj; 17 }; 18 19 $("#btn").click(function () { 20 //将指定的form表单中所有的输入项转为json数据{key:value,key:value} 21 var p = $("#searchForm").serializeJson(); 22 console.info(p); 23 //调用数据表格的load方法,重新发送一次ajax请求,并且提交参数 24 $("#grid").datagrid("load",p); 25 //关闭查询窗口 26 $("#searchWindow").window("close"); 27 });
1 public String pageQuery() throws Exception { 2 // 取出离线Criteria对象 3 DetachedCriteria dc = super.pageBean.getDetachedCriteria(); 4 // 获取region对象 5 Region region = super.model.getRegion(); 6 7 if (super.model!=null){ 8 String province = region.getProvince(); 9 String city = region.getCity(); 10 String district = region.getDistrict(); 11 // 多表查询*** 12 // 为另一张表起别名 ==> select * from subarea s inner join region r on s.region_id = r.id 13 dc.createAlias("region", "r"); 14 15 if(StringUtils.isNotBlank(province)){ 16 //添加过滤条件,根据省份模糊查询-----多表关联查询,使用别名方式实现 17 //参数一:分区对象中关联的区域对象属性名称 18 //参数二:别名,可以任意 19 dc.add(Restrictions.like("r.province", "%"+province+"%")); 20 } 21 22 if(StringUtils.isNotBlank(city)){ 23 //添加过滤条件,根据市模糊查询-----多表关联查询,使用别名方式实现 24 //参数一:分区对象中关联的区域对象属性名称 25 //参数二:别名,可以任意 26 dc.add(Restrictions.like("r.city", "%"+city+"%")); 27 } 28 29 if(StringUtils.isNotBlank(district)){ 30 //添加过滤条件,根据区模糊查询-----多表关联查询,使用别名方式实现 31 //参数一:分区对象中关联的区域对象属性名称 32 //参数二:别名,可以任意 33 dc.add(Restrictions.like("r.district", "%"+district+"%")); 34 } 35 } 36 37 38 subareaService.pageQuery(super.pageBean); 39 40 super.writeJson(super.pageBean,new String[]{"currentPage", "detachedCriteria", "pageSize","decidedzone","subareas"}); 41 42 return "none"; 43 }
1 // 3.指定封装对象的方式 2 detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
2、文件导出
1 /** 2 * 分区数据导出功能 3 * @throws IOException 4 */ 5 public String exportXls() throws IOException { 6 //第一步:查询所有的分区数据 7 List<Subarea> list = subareaService.findAll(); 8 9 //第二步:使用POI将数据写到Excel文件中 10 //在内存中创建一个Excel文件 11 HSSFWorkbook workbook = new HSSFWorkbook(); 12 //创建一个标签页 13 HSSFSheet sheet = workbook.createSheet("分区数据"); 14 //创建标题行 15 HSSFRow headRow = sheet.createRow(0); 16 headRow.createCell(0).setCellValue("分区编号"); 17 headRow.createCell(1).setCellValue("开始编号"); 18 headRow.createCell(2).setCellValue("结束编号"); 19 headRow.createCell(3).setCellValue("位置信息"); 20 headRow.createCell(4).setCellValue("省市区"); 21 22 for (Subarea subarea : list) { 23 HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); 24 dataRow.createCell(0).setCellValue(subarea.getId()); 25 dataRow.createCell(1).setCellValue(subarea.getStartnum()); 26 dataRow.createCell(2).setCellValue(subarea.getEndnum()); 27 dataRow.createCell(3).setCellValue(subarea.getPosition()); 28 dataRow.createCell(4).setCellValue(subarea.getRegion().getName()); 29 } 30 31 //第三步:使用输出流进行文件下载(一个流、两个头) 32 33 String filename = "分区数据.xls"; 34 String contentType = ServletActionContext.getServletContext().getMimeType(filename); 35 ServletOutputStream out = ServletActionContext.getResponse().getOutputStream(); 36 ServletActionContext.getResponse().setContentType(contentType); 37 38 //获取客户端浏览器类型 39 String agent = ServletActionContext.getRequest().getHeader("User-Agent"); 40 filename = FileUtils.encodeDownloadFilename(filename, agent); 41 ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename="+filename); 42 workbook.write(out); 43 return NONE; 44 }
1 public class FileUtils { 2 /** 3 * 下载文件时,针对不同浏览器,进行附件名的编码 4 * 5 * @param filename 下载文件名 6 * @param agent 客户端浏览器 7 * @return 编码后的下载附件名 8 * @throws IOException 9 */ 10 public static String encodeDownloadFilename(String filename, String agent) 11 throws IOException { 12 if (agent.contains("Firefox")) { // 火狐浏览器 13 filename = "=?UTF-8?B?" 14 + new BASE64Encoder().encode(filename.getBytes("utf-8")) 15 + "?="; 16 filename = filename.replaceAll(" ", ""); 17 } else { // IE及其他浏览器 18 filename = URLEncoder.encode(filename, "utf-8"); 19 filename = filename.replace("+", " "); 20 } 21 return filename; 22 } 23 }
3、BaseDao扩展一个离线Criteria查询
4、前端字段名重复问题(不知道对应那个字段了),多张表保存问题
1 private String[] subareaid; // 接受前端传来的subareaid 2 3 public void setSubareaid(String[] subareaid) { 4 this.subareaid = subareaid; 5 } 6 7 public String save() throws Exception { 8 9 decidedzoneService.save(super.model, subareaid); 10 11 return "list"; 12 }
1 public void save(Decidedzone model, String[] subareaid) { 2 // 此时保存的是decidedzone表中的数据,另一个表的还没保存 3 decidedzoneDao.save(model); 4 // 保存subarea表中的decidedzone_id字段 5 for (String s : subareaid) { 6 Subarea subarea = subareaDao.findById(s); 7 subarea.setDecidedzone(model); // 关联分区,由于是持久化状态,不用保存 8 } 9 10 }