BOS物流管理系统第五天分区管理今天内容安排:1、分区添加分区是要关联区域信息(多表关联插入)2、分区列表查询多条件组合分页查询(jqueryeasyuidatagrid如何设置条件、springdata组合条件查询Specification接口规范)3、分区查询结果导出(POI生成Excel进行下载)1.任务一:分区添加业务:分区是对区域细分,为后续指定配送区域,提供基础数据导入功能,实现类似区域导入,作为作业完成1.1.jqueryeasuicombobox插件,实现下拉列表传统列表做法:1、页面加载后,自动发起ajax请求,获取区域的数据2、在回调函数,遍历每个区域数据,显示在选择区域下拉框(使用jquerydom操作)1.1.1.使用easyuicombobox制作下拉列表查询文档:用法一:对已经存在select(含有数据),添加class=”easyui-combobox”用法二:对input添加class=”easyui-combobox”此时,设置url属性、valueField属性、textField属性第一步:修改页面input使用comboboxsubarea.jsp页面在页面加载后,自动向region_ajaxlist.action发起请求,加载json数据第二步:在RegionAction添加ajaxlist查询方法业务层测试代码错误:信息延迟加载解决方案第三步:页面要显示name属性,region转换为json没有name属性效果:ok回显区域省市区信息!1.1.2.使用easyuicombobox的自动补全效果modestring定义了如何加载列表数据当文本改变。设置为“remote“如果下拉列表框从服务器加载。当设置为“remot“模式下,用户类型将被发送的http请求参数命名为“q”服务器来检索新数据。local将combobox的mode属性,设置为remote,远程补全当修改下拉框内容,自动向服务器发送请求参数q服务器获取q参数,根据q值查询,转换json返回修改RegionAction的ajaxlist查询方法ActionServiceDAO测试:ok自动补全下拉框显示区域信息完成!1.2.添加分区服务器实现1:将分区实体类主键修改assigend实体类修改:完善form参数为保存按钮save添加click事件,对form校验关联选择区域,combobox设置为requiredSave按钮的click事件BaseAction注入业务层接口编写SubareaAction编写SubareaServiceDAO接口修改Subarea实体,修改为默认主键策略添加分区业务完成!学生作业:先完成无条件分页查询!1.3.无条件分页查询1:入口subarea.jsp2:分页查询父类获取即可3::业务层实现测试无条件分业查询ok测试结果延迟加载错误定区信息分区查询不需要该数据所有排除区域信息页面需要所以不能排斥解决json插件序列化session生命周期问题:1:立刻查询配置标签(不推荐)2:代码Hiberante.initilize()延迟的对象立刻查询(局部操作)3:(hibernate)sessionspringdatajpa(EntityManager)生命周期延长到web层---默认所有事务只读!事务管理器一定切到所有业务事务管理采用第二种:(灵活session生命周期没有延长到web)业务层代码修改立刻查询延迟加载region数据配置web.xml引入EntityManagerInViewFilter分区无条件分页查询完成!2.条件分页查询2.1.客户端easyui框架条件分页查询分析说明2.2.服务器springdata如何分页条件查询(查询官方文档或者第三方实例)Springdata学习多条件分页复杂查询参照网址:复杂查询推荐Specification接口!springdata采用分页条件查询类似hibenatecriteria查询!多表连接2:配置好Model及其关系后,就可以在构建Specification的时候使用了,示例如下:SpecificationUserModelspec=newSpecificationUserModel(){publicPredicatetoPredicate(RootUserModelroot,CriteriaQuery?query,CriteriaBuildercb){Predicatep1=cb.like(root.get(name).as(String.class),%+um.getName()+%);Predicatep2=cb.equal(root.get(uuid).as(Integer.class),um.getUuid());Predicatep3=cb.gt(root.get(age).as(Integer.class),um.getAge());SetJoinUserModel,DepModeldepJoin=root.join(root.getModel().getSet(setDep,DepModel.class),JoinType.LEFT);Predicatep4=cb.equal(depJoin.get(name).as(String.class),ddd);//把Predicate应用到CriteriaQuery去,因为还可以给CriteriaQuery添加其他的功能,比如排序、分组啥的query.where(cb.and(cb.and(p3,cb.or(p1,p2)),p4));//添加分组的功能query.orderBy(cb.desc(root.get(uuid).as(Integer.class)));returnquery.getRestriction();}};2.3.分析jqueryeasyuidatagrid如何实现条件分页在查询窗口输入条件2.4.完善查询form,将查询条件转换为jsonDatagrid提供条件查询方法第一步:完善查询form表单第二步:用户点击查询按钮,将查询form数据,转换为jsonJqueryAPI提供两个方法serialize()将form参数,转换http协议参数格式key=value&key=value…serializeArray()将form参数转换为数组需要{firstname:hello,Lastname:world}通过对jquery对象函数扩展实现$.fn.serializeJson=function(){varserializeObj={};vararray=this.serializeArray();varstr=this.serialize();$(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;}});returnserializeObj;};客户端条件分页查询携带条件参数完成!客户端分页条件查询完成!!2.5.服务器端实现分区条件组合分页查询修改datagrid的urlSpringData支持类似QBC动态生成SQL查询!内部支持,提供JpaSpecificationExecutor接口,DAO继承这个接口JpaSpecificationExecutor内部提供条件、分页查询方法Service代码目标:将客户端条件封装到Specification对象中即可Action代码springdata分页查询关键字条件的添加区域条件的添加定区编码的添加将所有添加使用and连接测试多条件查询ok!@Action(value=subAreaAction_pageQuery)publicStringpageQuery(){try{//model瞬时态分页条件查询...//molde数据封装Specification实现类中//PredicatetoPredicate(RootTroot,CriteriaQuery?query,CriteriaBuildercb);方法将请求参数封装SpecificationSpecificationSubareaspec=newSpecificationSubarea(){publicPredicatetoPredicate(Rootroot,CriteriaQueryquery,CriteriaBuildercb){//将请求参数model数据封装Predicate//1:root表示SubareafromSubareajoin....where....省市区条件Region关键字SubArea定区DecidedZoneoid//2:cb连接条件构建器类似以前hibernateRestrictions.like/eq/gtListPredicatelist=newArrayListPredicate();//存放所有条件对象Predicateif(StringUtils.isNotBlank(model.getAddresskey())){//连自己表Predicatep1=cb.like(root.get(addresskey).as(String.class),%+model.getAddresskey()+%);list.add(p1);}//3:连接省市区多表Region查询if(model.getRegion()!=null){//subarea连接region表JoinregionJoin=root.join(root.getModel().getSingularAttribute(region,Region.class),JoinType.LEFT);if(StringUtils.isNotBlank(model.getRegion().getProvince())){Predicatep2=cb.like(regionJoin.get(province).as(String.class),%+model.getRegion().getProvince()+%);list.add(p2);}if(StringUtils.isNotBlank(model.getRegion().getCity())){Predicatep3=cb.like(regionJoin.get(city).as(String.class),%+model.getRegion().getCity()+%);list.add(p3);}if(StringUtils.isNotBlank(model.getRegion().getDistrict())){Predicatep4=cb.like(regionJoin.get(district).as(String.class),%+model.getRegion().getDistrict()+%);list.add(p4);}}//4:定区idif(model.getDecidedZone()!=null&&StringUtils.isNotBlank(model.getDecidedZone().getId())){Predicatep5=cb.equal(root.get(decidedZone).as(DecidedZone.class),model.getDecidedZone()