Struts2 利用AJAX 导出大数据设置遮罩层ajax
需求背景:服务器
每次咱们导出excel的时候 ,若是数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面,要么狂点导出。感知太差了~甚至用户误操做会致使服务器崩溃。
因此我么咱们须要经过进度条方式告知客户导出的进度。
经过在导出过程当中循环请求后台确认时候导出完毕来控制遮罩层在某个时候关闭。session
解决办法:post
以前反复用了N种方式都没有解决相似问题,大数据
一、iframe 方式 最终拜拜url
二、ajax 方式 ajax 没法弹出download下载流框 拜拜 spa
重点来了excel
思路!
一、JS 设置定时器 以1s 的访问去请求Action code
二、Action 设置一个检测session 是否有效的方法 orm
三、导出动做
// 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(); }
二、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(); } } }
三、
// 在导出结束 删除session
ActionUtil.getSession().removeAttribute("exportFlag");
四、页面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