BOS项目笔记 第4天
今天内容安排:
1、区域批量导入功能
jQuery OCUpload(一键上传插件)、apache POI、pinyin4j
2、实现区域的分页查询
3、对分页代码重构
4、添加分区(combobox下拉框)
5、分区的组合条件分页查询
6、分区数据导出功能
1. 区域数据批量导入功能
1.1 一键上传插件使用
ajax不能做文件上传。
第一步:在jsp页面中引入插件的js文件
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.ocupload-1.1.2.js"></script> |
第二步:在页面中提供任意一个元素
第三步:调用插件提供的upload方法,动态修改页面html代码
1.2 使用apache POI解析Excel文件
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
@Test public void test1() throws FileNotFoundException, IOException{ HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File("d:\abc.xls"))); HSSFSheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { String v1 = row.getCell(0).getStringCellValue(); String v2 = row.getCell(1).getStringCellValue(); String v3 = row.getCell(2).getStringCellValue(); String v4 = row.getCell(3).getStringCellValue(); String v5 = row.getCell(4).getStringCellValue(); System.out.println(v1 + " " + v2+" " + v3+ " " +v4+ " " + v5); } } |
在RegionAction中提供导入方法:
public String importXls() throws Exception{ String flag = "1"; //使用POI解析Excel文件 try{ HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(myFile)); //获得第一个sheet页 HSSFSheet sheet = workbook.getSheetAt(0); List<Region> list = new ArrayList<Region>(); for (Row row : sheet) { int rowNum = row.getRowNum(); if(rowNum == 0){ //第一行,标题行,忽略 continue; } String id = row.getCell(0).getStringCellValue(); String province = row.getCell(1).getStringCellValue(); String city = row.getCell(2).getStringCellValue(); String district = row.getCell(3).getStringCellValue(); String postcode = row.getCell(4).getStringCellValue(); Region region = new Region(id, province, city, district, postcode, null, null, null); list.add(region); } regionService.saveBatch(list); }catch (Exception e) { flag = "0"; } ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8"); ServletActionContext.getResponse().getWriter().print(flag); return NONE; } |
1.3 使用Pinyin4J生成简码和城市编码
@Test public void test1(){ String province = "河北省"; String city = "石家庄市"; String district = "长安区"; //城市编码--->>shijiazhuang city = city.substring(0, city.length() - 1); String[] stringToPinyin = PinYin4jUtils.stringToPinyin(city); String citycode = StringUtils.join(stringToPinyin, ""); System.out.println(citycode);
//简码---->>HBSJZCA province = province.substring(0, province.length() - 1); district = district.substring(0, district.length() - 1); String info = province + city + district;//河北石家庄长安 String[] headByString = PinYin4jUtils.getHeadByString(info);
String shortcode = StringUtils.join(headByString, ""); System.out.println(shortcode); } |
2. 重构分页查询代码
l 在BaseAction中抽取PageBean对象
l 在BaseAction中提供setPage和setRows方法
l 在BaseAction中抽取条件查询对象
l 在BaseAction的构造方法中创建条件查询对象,并注入给PageBean对象
l 在BaseAction中抽取将PageBean对象转为json的方法
l 在StaffAction中分页方法
3. 添加分区
第一步:使用combobox展示区域数据到下拉框中
第二步:在RegionAction中提供listajax方法,查询所有的区域数据,返回json数据
为了使返回的json中含有name字段,需要在Region类中提供getName方法
4. 分区组合条件分页查询
第一步:为查询按钮绑定事件,调用datagrid的load方法,重新发起ajax请求,并且输入框提交参数
第二步:提供将表单输入项序列化为json的工具方法
第三步:修改SubareaAction中的分页查询方法,封装分页查询的条件
public String pageQuery() throws Exception{ //在查询之前,封装条件 DetachedCriteria detachedCriteria2 = pageBean.getDetachedCriteria(); String addresskey = model.getAddresskey(); Region region = model.getRegion(); if(StringUtils.isNotBlank(addresskey)){ //按照地址关键字模糊查询 detachedCriteria2.add(Restrictions.like("addressKey", addresskey)); } if(region != null){ //创建别名,用于多表关联查询 detachedCriteria2.createAlias("region", "r"); String province = region.getProvince(); String city = region.getCity(); String district = region.getDistrict(); if(StringUtils.isNotBlank(province)){ //按照省进行模糊查询 detachedCriteria2.add(Restrictions.like("r.province", "%"+province+"%")); } if(StringUtils.isNotBlank(city)){ //按照省进行模糊查询 detachedCriteria2.add(Restrictions.like("r.city", "%"+city+"%")); } if(StringUtils.isNotBlank(district)){ //按照省进行模糊查询 detachedCriteria2.add(Restrictions.like("r.district", "%"+district+"%")); } } subareaService.pageQuery(pageBean); String[] excludes = new String[]{"detachedCriteria","currentPage","pageSize","decidedzone","subareas"}; this.writePageBean2Json(pageBean, excludes); return NONE; } |
5. 分区数据导出功能
导出Excel文件提供客户下载。
第一步:为“导出”按钮绑定事件
第二步:在Action中提供导出方法
/** * 使用POI写入Excel文件,提供下载 * @throws IOException */ public String exportXls() throws IOException { List<Subarea> list = subareaService.findAll(); // 在内存中创建一个Excel文件,通过输出流写到客户端提供下载 HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个sheet页 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("省市区");
for (Subarea subarea : list) { HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); dataRow.createCell(0).setCellValue(subarea.getId()); dataRow.createCell(1).setCellValue(subarea.getRegion().getId()); dataRow.createCell(2).setCellValue(subarea.getAddresskey()); Region region = subarea.getRegion(); dataRow.createCell(3).setCellValue(region.getProvince()+region.getCity()+region.getDistrict()); }
String filename = "分区数据.xls"; String agent = ServletActionContext.getRequest().getHeader("User-Agent"); filename = FileUtils.encodeDownloadFilename(filename, agent); //一个流两个头 ServletOutputStream out = ServletActionContext.getResponse().getOutputStream(); String contentType = ServletActionContext.getServletContext().getMimeType(filename); ServletActionContext.getResponse().setContentType(contentType); ServletActionContext.getResponse().setHeader("content-disposition", "attchment;filename="+filename); workbook.write(out); return NONE; } |