javaWEB模块物流项目五.docx
《javaWEB模块物流项目五.docx》由会员分享,可在线阅读,更多相关《javaWEB模块物流项目五.docx(26页珍藏版)》请在冰豆网上搜索。
javaWEB模块物流项目五
BOS物流管理系统第五天分区管理
今天内容安排:
1、分区添加
分区是要关联区域信息(多表关联插入)
2、分区列表查询
多条件组合分页查询(jqueryeasyuidatagrid如何设置条件、springdata组合条件查询Specification接口规范)
3、分区查询结果导出(POI生成Excel进行下载)
1.任务一:
分区添加
业务:
分区是对区域细分,为后续指定配送区域,提供基础数据导入功能,实现类似区域导入,作为作业完成
jqueryeasuicombobox插件,实现下拉列表
传统列表做法:
1、页面加载后,自动发起ajax请求,获取区域的数据
2、在回调函数,遍历每个区域数据,显示在选择区域下拉框(使用jquerydom操作)
使用easyuicombobox制作下拉列表
查询文档:
用法一:
对已经存在
用法二:
对添加class=”easyui-combobox”此时,设置url属性、valueField属性、textField属性
第一步:
修改页面使用comboboxsubarea.jsp页面
在页面加载后,自动向region_ajaxlist.action发起请求,加载json数据
第二步:
在RegionAction添加ajaxlist查询方法
业务层
测试代码
错误:
信息延迟加载
解决方案
第三步:
页面要显示name属性,region转换为json没有name属性
效果:
ok回显区域省市区信息!
使用easyuicombobox的自动补全效果
mode
string
定义了如何加载列表数据当文本改变。
设置为“remote“如果下拉列表框从服务器加载。
当设置为“remot“模式下,用户类型将被发送的http请求参数命名为“q”服务器来检索新数据。
local
将combobox的mode属性,设置为remote,远程补全
当修改下拉框内容,自动向服务器发送请求参数q
服务器获取q参数,根据q值查询,转换json返回
修改RegionAction的ajaxlist查询方法
Action
Service
DAO
测试:
ok
自动补全下拉框显示区域信息完成!
添加分区服务器实现
1:
将分区实体类主键修改assigend
实体类修改:
完善form参数
为保存按钮save添加click事件,对form校验关联选择区域,combobox设置为required
Save按钮的click事件
BaseAction注入业务层接口
编写SubareaAction
编写SubareaService
DAO接口
修改Subarea实体,修改为默认主键策略
添加分区业务完成!
学生作业:
先完成无条件分页查询!
无条件分页查询
1:
入口subarea.jsp
2:
分页查询父类获取即可
3:
:
业务层实现
测试无条件分业查询ok
测试结果延迟加载错误
定区信息分区查询不需要该数据所有排除
区域信息页面需要所以不能排斥解决json插件序列化session生命周期问题:
1:
立刻查询配置标签(不推荐)
2:
代码Hiberante.initilize()延迟的对象立刻查询(局部操作)
3:
(hibernate)sessionspringdatajpa(EntityManager)生命周期延长到web层--->默认所有事务只读!
事务管理器一定切到所有业务事务管理
采用第二种:
(灵活session生命周期没有延长到web)业务层代码修改立刻查询延迟加载region数据
配置web.xml引入EntityManagerInViewFilter
分区无条件分页查询完成!
2.条件分页查询
客户端easyui框架条件分页查询分析说明
服务器springdata如何分页条件查询
(查询官方文档或者第三方实例)
Springdata学习多条件分页复杂查询参照网址:
Springdata复杂查询推荐Specification接口!
springdata采用分页条件查询类似hibenatecriteria查询!
多表连接
2:
配置好Model及其关系后,就可以在构建Specification的时候使用了,示例如下:
Specificationspec=newSpecification(){
publicPredicatetoPredicate(Rootroot,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());
SetJoindepJoin= 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();
}};
分析jqueryeasyuidatagrid如何实现条件分页
在查询窗口输入条件
完善查询form,将查询条件转换为json
Datagrid提供条件查询方法
第一步:
完善查询form表单
第二步:
用户点击查询按钮,将查询form数据,转换为json
JqueryAPI提供两个方法
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;
};
客户端条件分页查询携带条件参数完成!
客户端分页条件查询完成!
!
服务器端实现分区条件组合分页查询
修改datagrid的url
SpringData支持类似QBC动态生成SQL查询!
内部支持,提供JpaSpecificationExecutor接口,DAO继承这个接口
JpaSpecificationExecutor内部提供条件、分页查询方法
Service代码
目标:
将客户端条件封装到Specification对象中即可
Action代码springdata分页查询
关键字条件的添加
区域条件的添加
定区编码的添加
将所有添加使用and连接
测试多条件查询ok!
@Action(value="subAreaAction_pageQuery")
publicStringpageQuery(){
try{
//model瞬时态分页条件查询...
//molde数据封装Specification实现类中
//PredicatetoPredicate(Rootroot,CriteriaQuery
>query,CriteriaBuildercb);方法将请求参数封装Specification
Specificationspec=newSpecification(){
publicPredicatetoPredicate(Rootroot,CriteriaQueryquery,CriteriaBuildercb){
//将请求参数model数据封装Predicate
//1:
root表示SubareafromSubareajoin....where....省市区条件Region关键字SubArea定区DecidedZoneoid
//2:
cb连接条件构建器类似以前hibernateRestrictions.like/eq/gt
Listlist=newArrayList();//存放所有条件对象Predicate
if(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:
定区id
if(model.getDecidedZone()!
=null&&StringUtils.isNotBlank(model.getDecidedZone().getId())){
Predicatep5=cb.equal(root.get("decidedZone").as(DecidedZone.class),model.getDecidedZone());
list.add(p5);
}
//Listlist=newArrayList();集合长度大小由用户表单请求参数决定
Predicate[]p=newPredicate[list.size()];//定义数组泛型
//list.toArray返回的Object数组
returncb.and(list.toArray(p));//Predicate数组内部所有条件and关系
}
};
Pagedata=subAreaService.pageQuery(spec,getPageRequest());
setData(data);
}catch(Exceptione){
e.printStackTrace();
}
returnSUCCESS;
}
Service
dao
错误:
Causedby:
org.hibernate.LazyInitializationException:
couldnotinitializeproxy-noSession
排除定区
需要Region区域信息解决延迟加载问题!
解决方案1:
业务层立刻查询延迟对象
解决方案2:
OpenEntityManagerInViewFilter
3.分区数据导出功能
点击导出,服务器实现文件下载,下载条件查询结果数据(一个流+2个头excel文件)
注意:
导出功能,不只是导出本页的数据,应该导出条件对应所有数据
第一步:
使用分区查询form提交给下载服务器端路径
第二步:
点击导出,提交查询form
第三步:
编写服务器端程序,SubAreaAction抽取请求条件封装到Specification接口
按照快捷键shfit+alt+t抽取代码
Service代码
Action代码下载到poi
通用代码抽取
//抽取代码
privateSpecificationspecifecation2(){
Specificationspecifications=newSpecification(){
publicPredicatetoPredicate(Rootroot,CriteriaQuery
>query,CriteriaBuildercb){
//多表查询springdata
//root类似当前查询的实体类对象通过该对象获取对象属性连接多表操作对象querycb
//1:
客户端是否选择对应的条件
Listlist=newArrayList();
if(StringUtils.isNotBlank(model.getAddresskey())){
Predicatep1=cb.like(root.get("addresskey").as(String.class),"%"+model.getAddresskey()+"%");
list.add(p1);
}
if(model.getDecidedZone()!
=null&&StringUtils.isNotBlank(model.getDecidedZone().getId())){
Predicatep2=cb.equal(root.get("decidedZone").as(DecidedZone.class),model.getDecidedZone());
list.add(p2);
}
//查询region表数据select*fromsubareajoinonregion
if(model.getRegion()!
=null){
//客户端输入region相关参数查询
JoinregionJoin=root.join(root.getModel().getSingularAttribute("region",Region.class),JoinType.LEFT);
//判断用户输入哪些条件参数...
if(StringUtils.isNotBlank(model.getRegion().getProvince())){
Predicatep3=cb.like(regionJoin.get("province").as(String.class),"%"+model.getRegion().getProvince()+"%");
list.add(p3);
}
if(StringUtils.isNotBlank(model.getRegion().getCity())){
Predicatep4=cb.like(regionJoin.get("city").as(String.class),"%"+model.getRegion().getCity()+"%");
list.add(p4);
}
if(StringUtils.isNotBlank(model.getRegion().getDistrict())){
Predicatep5=cb.like(regionJoin.get("district").as(String.class),"%"+model.getRegion().getDistrict()+"%");
list.add(p5);
}
}
Predicate[]array=list.toArray(newPredicate[0]);//构造一个泛型数组
returncb.and(array);
}
};
returnspecifications;
}
工作簿数据注入
下载实现浏览器下载流response提供文件类型头附件头(附件名称)
代码明细
@Action(value="subAreaAction_download")
publicStringdownload(){
//下载-->excel抽取代码片段-->封装方法shif+alt+t
Specificationspec=getSpecification();
ListsubAreas=subAreaService.findSubAreaBySpecification(spec);
//下载到excel文件response.getOutputStream
//1:
内存将集合数据加载内存HSSFWORKBOOK工作簿对象中
//创建新的Excel工作簿
HSSFWorkbookworkbook=newHSSFWorkbook();
//HSSFSheetsheet=workbook.createSheet("效益指标");
HSSFSheetsheet=workbook.createSheet("分区信息一");
//在索引0的位置创建行(最顶端的行)
HSSFRowrow=sheet.createRow(0);
//在索引0的位置创建单元格(左上端)
row.createCell(0).setCellValue("分区编号");
row.createCell
(1).setCellValue("区域编码");
row.createCell
(2).setCellValue("分区关键字");
row.createCell(3).setCellValue("分区起始号");
row.createCell(4).setCellValue("分区位置信息");
if(subAreas!
=null&&subAreas.size()!
=0){
//sheet.getLastRowNum()获取当前sheet分区最后一行行号
for