【SSH实战】IntelliJ IDEA环境开发BOS物流项目(六)POI技术Excel文件导出

、分区组合条件分页查询

n 分区分页查询(没有过滤条件)

页面:WEB-INF/pages/base/subarea.jsp

第一步:修改jsp页面中datagridURL地址


第二步:在SuareaAction中提供分页查询方法pageQuery

public String pageQuery(){
        subareaService.pageQuery(pageBean);
        this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","decidedzone","subareas"});
        return NONE;
    }

第三步:修改subarea.hbm.xml


n 分区分页查询(带有过滤条件)

第一步:提供一个工具方法,可以将指定的form表单中所有的输入项转为json数据,用于参数提交

            // 定义一个工具方法,用于将指定的form表单中所有的输入项转为json数据
            $.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数据
				var p = $("#searchForm").serializeJson();
                // 调用数据表格的load方法,重新发一次ajax请求,并且提交参数
				$("#grid").datagrid("load",p);
				// 关闭查询窗口
				$("#searchWindow").window("close");
            });

第三步:修改Action中分页查询方法

   /**
     * 分页查询
     * @return
     */
    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中的分页查询方法


、分区数据导出

n 页面调整

		// 导出按钮对应的处理函数
        function doExport(){
            // 发送请求,请求Action,进行文件下载
			window.location.href = "subareaAction_exportXLs.action";
        }

使用POI将数据写到Excel文件

n 通过输出流进行文件下载

    /**
     * 分区数据导出功能
     * @return
     */
    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;
    }

、定区添加

n 定区概念

n 定区添加页面调整

第一步:修改定区页面中combobox下拉框URL地址


n 服务端实现

第二步:在StaffAction中提供listajax方法,查询所有未删除的取派员,返回json

    /**
     * 查询所有未删除的取派员,返回json
     * @return
     */
    public String listAjax(){
        List<Staff> list = staffService.findListNotDelete();
        this.java2Json(list,new String[]{"decidedzones"});
        return NONE;
    }

第三步:在BaseDao中扩展一个通用查询方法

	@Override
	public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
		return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
	}

第四步:在StaffService中扩展方法,查询未删除的取派员

    public List<Staff> findListNotDelete() {
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);
        // 添加过滤条件
        detachedCriteria.add(Restrictions.eq("deltag","0"));
        //detachedCriteria.add(Restrictions.ne("dettag","1")); // 同上面等价
        return staffDao.findByCriteria(detachedCriteria);
    }

四、使用combobox展示取派员数据

n 页面调整

第一步:修改页面中datagridURL地址


n 服务端实现

第二步:在SubareaAction中提供listajax方法,查询所有未关联到定区的分区,返回json

    /**
     * 查询所有未关联到定区的分区,返回json
     * @return
     */
    public String listAjax(){
        List<Subarea> list = subareaService.findListNotAssociation();
        this.java2Json(list,new String[]{"decidedzone","region"});
        return NONE;
    }

第三步:在SubareaService中扩展方法,查询未关联到定区的分区

    /**
     * 查询所有未关联到定区的分区
     * @return
     */
    public List<Subarea> findListNotAssociation() {
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);
        // 添加过滤条件,分区对象中decidedzone属性为null
        detachedCriteria.add(Restrictions.isNull("decidedzone"));
        return subareaDao.findByCriteria(detachedCriteria);
    }

五、保存定区

第一步:为保存按钮绑定事件提交表单


问题一:提交的表单存在多个id


解决方案:将datagrid的filed由id改为subareaid


问题二:

提交的表单中subareaid参数的值为null

解决方案:在分区类中提供getSubareaid方法

第二步:服务端实现

创建定区的Action、Service、Dao

/**
 * 定区管理
 * @author lee [email protected]
 * @create 2018-04-21 15:12
 **/
@Controller
@Scope
public class DecidedzoneAction extends BaseAction<Decidedzone>{

    @Autowired
    private DecidedzoneService decidedzoneService;
    // 属性驱动,接收多个分区id
    private String[] subareaid;

    public String[] getSubareaid() {
        return subareaid;
    }

    public void setSubareaid(String[] subareaid) {
        this.subareaid = subareaid;
    }

    /**
     * 添加定区
     * @return
     */
    public String add(){
        decidedzoneService.save(model,subareaid);
        return LIST;
    }

Service代码

@Service
@Transactional
public class DecidedzoneServiceImpl implements DecidedzoneService{
    @Autowired
    private DecidedzoneDao decidedzoneDao;
    @Autowired
    private SubareaDao subareaDao;

    /**
     * 添加一个定区,同时关联分区
     * @param model
     * @param subareaid
     */
    public void save(Decidedzone model, String[] subareaid) {
        decidedzoneDao.save(model);
        for(String id : subareaid){
            Subarea subarea = subareaDao.findById(id);
            subarea.setDecidedzone(model);
        }
    }

配置struts.xml

		<!--定区管理-->
		<action name="decidedzoneAction_*" class="decidedzoneAction"  method="{1}">
			<result name="list">/WEB-INF/pages/base/decidedzone.jsp</result>
		</action>

六、定区分页查询

第一步:修改定区jsp页面中datagrid的URL地址


第二步:在定区Action中提供pageQuery方法

    /**
     * 分页查询定区
     * @return
     * @throws IOException
     */
    public String pageQuery() throws IOException {
        // 调用service分页查询
        decidedzoneService.pageQuery(pageBean);
        // 转json并响应到页面
        this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","subareas","decidedzones"});
        return NONE;
    }

第三步:在Decidedzone.hbm.xml中修改,查询定区对象时需要立即加载关联的取派员对象


七、分页问题总结

1、页面不需要展示关联数据时

解决:将关联对象属性排除掉


2、页面需要展示关联数据时
解决:将关联对象改为立即加载,并且将关联对象中的属性排除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章