一、问题场景

  最近在做数据统计功能,需求是导出大数据量的excel,时间间隔较长,大概需要十秒左右,点击导出后,页面没有做任何处理,用户也不知道是否正在导出;如果没有做交互上的限制,用户可以一直点击导出按钮,这样势必会造成服务器瘫痪。

二、尝试过程

  花了一天尝试了两种方案:

  2.1 纯前端添加遮罩

    单纯的前端是无法监听文件是否下载完成的,主要试了两种方案:

      1.由于导出是用form表单提交的,并将form的target设置到一个隐藏iframe来达到不刷新页面而导出。本来想利用隐藏iframe的onload事件来判断是否导出成功的,但是调试发现导出成功后不会触发,所以该条路无法走通了。

      2.用ajax来做导出,但是该方法无法实现自动下载导出文件,这条路也就无法走通了。

    本来想监听浏览器点击下载链接到弹出窗口完成的状态,查阅资料发现这些都是浏览器包办了的,没有任何方法可以获取到状态,可能浏览器是出于安全考虑,所以没有提供。

  2.2 前后端联动

    主体思路是这样:

    前端点击导出按钮加载事件并添加遮罩效果,设置定时器监听ajax从后端返回是否导出完成状态,后端状态设置初始session状态值,在导出事件后改变该session值,最后通过ajax返回前端。前端接收到状态值,如果已导出完成,解除遮罩;如不是,则继续定时监听直到返回导出完成为止。

    该方案可行。

三、具体方案

前端js代码:

//点击导出事件
function startexport(){
$("#divload").show();//打开加载中遮罩
listenEnd();
} function listenEnd() {//定时监听
var loop = setInterval(function() {
if ($("#txtendflag").val() == "1") {
clearInterval(loop);//停止定时任务
$("#divload").hide();//关闭加载中遮罩
} else {
getendflag();
}
}, 1000);//单位毫秒 注意:如果导出页面很慢时,建议循环时间段稍长一点
} function getendflag() {//请求session标记位
$.ajax({
type : 'post',
url : 'ajcxtjlistaction.action?cmd=getendflag',
dataType : 'json',
success : function(data) {
$("#txtendflag").val(data.custom.flag);
},
error : function(error) {
console.log('接口不通' + error);
}
})
}

后端Java代码:

public void export() {
request.getSession().removeAttribute("endflag");//每次导入前,清除结束标记
/******导出开始******/ //@#$%#^^^&&&&&&$$%$%$%##$@^^^$
/******导出结束*******/
request.getSession().setAttribute("endflag", "1");//设置结束标记
} //获取结束标记
public Object getendflag() { Object flag = request.getSession().getAttribute("endflag"); //获取结束标记*/
JSONObject obj = new JSONObject();
obj.put("flag", flag);//返回状态值
return obj;
}

Java实现点击导出excel页面遮罩屏蔽,下载完成后解除遮罩的更多相关文章

  1. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  2. Java中导入、导出Excel

    原文:Java中导入.导出Excel 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已 ...

  3. 我是陌生人 Java中导入、导出Excel

    我是陌生人 Java中导入.导出Excel 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是: ...

  4. java根据xml配置文件导出excel通用方法

    java web项目中时常会用到导出功能,而导出excel几乎是每个项目必备的功能之一.针对形形色色的导出方法及个人平时的工作经验,特将导出excel方法整理成通用的方法,根据xml配置来实现特定的导 ...

  5. JAVA导出excel 直接弹出下载框

    转自:https://blog.csdn.net/qq_38423105/article/details/80782283 效果展示: 1.首先准备jar包 <dependency>    ...

  6. [转]Java中导入、导出Excel

    原文地址:http://blog.csdn.net/jerehedu/article/details/45195359 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样 ...

  7. Java报表工具FineReport导出EXCEL的四种API

    在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出.分页分sheet导出和大数据量导出.对于excel 2003版,由于限制了每个sheet的最大行数和列数,大数据量导出 ...

  8. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  9. Java的导入与导出Excel

    使用Jakarta POI导入.导出Excel Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和 ...

随机推荐

  1. Elasticsearch笔记六之中文分词器及自定义分词器

    中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文"北京大学"来查询结果es将其分拆为"北","京","大" ...

  2. forwardport--源码笔记--注释

    failed:", err.Error())             }         }()     }     //     log.Println("forwardPort ...

  3. 关于extern的用法

    extern表示该变量或者函数时在另一个地方定义了. 在C++编程中,如果将程序分为多个文件,则需要有在文件间共享代码的方法,这时如果一个变量或者函数需要在多个文件中使用,则可以使用extern来声明 ...

  4. Java基础-方法重载和方法重写的区别

    什么是java方法重载 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)  ...

  5. Uiautomator--出现报错“urllib3.exceptions.ProtocolError:<'Connection aborted.',error<10054,''>>”的解决方式!

    在运行uiautomator时,出现报错"urllib3.exceptions.ProtocolError:<'Connection aborted.',error<10054, ...

  6. Java开发者必备的10大学习网站,送给入门学习java的你,请收下!

    作为开发者来说,必备的除了对编码的热情还要有自己的一套技巧,另外不可缺少的就是平时学习的网站.以下本人收集的 Java 开发者必备的网站,这些网站可以提供信息.以及一些很棒的讲座 , 还能解答一般问题 ...

  7. 一个C#程序员学习微信小程序路由的笔记

    路由大家应该都知道,在微信小程序也是有的,毕竟它是单页面应用程序.在WeChat中有五种跳转方式,分别是wx.switchTab.wx.reLaunch.wx.redirectTo.wx.naviga ...

  8. k8s实践 - 如何优雅地给kong网关配置证书和插件。

    前言 从去年上半年微服务项目上线以来,一直使用kong作为微服务API网关,整个项目完全部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准 ...

  9. Python练习:九九乘法表

    打印 n * n 的乘法表 #打印 9*9 乘法表 def Multiplication(n): # n - 定义打印的行数 max_len = len(str((n)**2)) #计算最大值的占位( ...

  10. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...