Struts2 利用AJAX 导出大数据设置遮罩层
Struts2 利用AJAX 导出大数据设置遮罩层
需求背景:
每次我们导出excel的时候 ,如果数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面,要么狂点导出。感知太差了~甚至用户误操作会导致服务器崩溃。
所以我么我们需要通过进度条方式告知客户导出的进度。
通过在导出过程中循环请求后台确认时候导出完毕来控制遮罩层在某个时候关闭。
解决办法:
之前反复用了N种方式都没有解决类似问题,
1、iframe 方式 最终拜拜
2、ajax 方式 ajax 无法弹出download下载流框 拜拜
重点来了
思路!
1、JS 设置定时器 以1s 的访问去请求Action
2、Action 设置一个检测session 是否有效的方法
3、导出动作
// show遮罩层 parent.Q.mask('数据正在导出中... '); // 检测后台session 是否有效 var isExportUrl = parent.Q.URL +'/cr/isExport.action?_='+new Date().getTime(); location.href = parent.Q.URL +'/cr/exportCopyrightEnd.action?form.queryInfo.copyrightStatus=0&_='+new Date().getTime(); }
2、isExportAction()
public void isExport() {
// 获取session 判断导出是否结束 String exportFlag = (String)ActionUtil.getSession().getAttribute("exportFlag"); if (StringUtils.isEmpty(exportFlag)) { try { ActionUtil.str2response("success"); } catch (IOException e) { DEBUGGER.error("Failed to isExport", e); e.printStackTrace(); } } }
3、
// 在导出结束 删除session
ActionUtil.getSession().removeAttribute("exportFlag");
4、页面JS 只需要设置timer 请求后台isExport() 即可
通过setInterval 方法循环请求后台获取exportedFlag, 一旦后台返回success(导出完毕),则关闭遮罩层
// 设置一个定时器 var timer = setInterval(function(){ $.ajax({ url: isExportUrl, type:'post', success: function(data){ if(data ==='success'){ clearInterval(timer); // 关闭遮罩层 parent.Q.unmask(); } }, error:function(e){ console.log(e.responseText); } }); }, 1000); //1s