Java实现点击导出excel页面遮罩屏蔽,下载完成后解除遮罩

一、问题场景

  最近在做数据统计功能,需求是导出大数据量的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;}

 

转载于:https://www.cnblogs.com/edisoner/p/10773007.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pbs 支持 java_Linux下Java安装与配置

安装以JDK1.6.0_43为例下载jdk-6u43-linux-x64.bin,http://www.oracle.com/technetwork/java/javase/downloads/index.html增加可执行权限 chmod x jdk-6u43-linux-x64.bin,执行 ./jdk-6u43-linux-x64.bin 生成目录jdk1.6.0_43拷贝到/usr/share下&#x…

使用Chatkit构建Node.js命令行聊天应用程序

by Hugo雨果 使用Chatkit构建Node.js命令行聊天应用程序 (Build a Node.js command-line chat application with Chatkit) Building chat in your app can be pretty complex. Yet, with Chatkit, implementing fully-featured chat is nothing but a few lines of code.在您的…

java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒

Java程序将毫秒转换为分钟和秒在上面的程序中,您将学习如何在Java中将毫秒分别转换为分钟和秒。示例1:将毫秒分别转换为分钟和秒import java.util.concurrent.TimeUnit;public class Milliseconds {public static void main(String[] args) {long millis…

Andrew Ng机器学习之一 导论

监督学习与无监督学习 监督学习(Supervised Learning) Ng的原文是: We gave the algorithm a data set that the "right answers" were given. 即给定了一个正确结果的集合供算法学习,强调了需要实现准备好正负样本喂给机器。 无监…

leetcode994. 腐烂的橘子(bfs)

在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。 返回直…

ES6对象的扩展

1.属性简写表示 2.方法简写表示 属性与方法简写: 3.属性名表达式 ES6允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内。 4.Object.is()比较两个值是否严格相等 转载于:https://www.cnb…

Spring Cloud项目MVN编译 -- Non-resolvable import POM

最近利用闲余时间,打算搭建一套基于Spring Cloud G版的微服务架构(Spring boot 2.1.0),一顿操作之后,IDEA也没有提示什么错误,自认为微服务搭建完毕。启动项目前,习惯性的Maven -clean了一下,我去,IDEA里面的Maven Pro…

datax底层原理_Datax 插件加载原理

Datax 插件加载原理插件类型Datax有好几种类型的插件,每个插件都有不同的作用。reader, 读插件。Reader就是属于这种类型的writer, 写插件。Writer就是属于这种类型的transformer, 目前还未知handler, 主要用于任务执行…

mysql windows身份验证_SQL Server 2005 怎么就不能用Windows身份验证方式登录呢?

SQL Server 2005 自从装到我的电脑上始终无法使用Windows身份验证的方式登录,由于使用用户名和密码登录还算顺畅,所以一直忽略了这SQL Server 2005 自从装到我的电脑上始终无法使用Windows身份验证的方式登录,由于使用用户名和密码登录还算顺畅,所以一直忽略了这个问题,直到又有…

JavaScript正则表达式快速简单的指南

Interested in learning JavaScript? Get my ebook at jshandbook.com有兴趣学习JavaScript吗? 在jshandbook.com上获取我的电子书 正则表达式简介 (Introduction to Regular Expressions) A regular expression (also called regex for short) is a fast way to w…

leetcode104. 二叉树的最大深度(dfs)

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最大深度 3 。代码 class Soluti…

[解读REST] 3.基于网络应用的架构

链接上文[解读REST] 2.REST用来干什么的?,上文中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格)。本篇来介绍一组自洽的术语,用它来描述和解释软件架构;以及列举下对于基于网络的应用来…

js判断对象还是数组

1.对于Javascript 1.8.5(ECMAScript 5),变量名字.isArray( )可以实现这个目的 var a[]; var b{}; Array.isArray(a);//true Array.isArray(b)//false 2.如果你只是用typeof来检查该变量,不论是array还是object,都将返回…

mysql 除去列名打印_sql – 使用beeline时避免在列名中打印表名

在beeline中使用hive时使用简单的select查询我想在列名中返回没有表名的表作为默认值.例数据CREATE TABLE IF NOT EXISTS employee ( eid int, name String,salary String, destination String)COMMENT Employee detailsROW FORMAT DELIMITEDFIELDS TERMINATED BY \tLINES TERM…

移动应用程序和网页应用程序_如何开发感觉像本机移动应用程序的渐进式Web应用程序...

移动应用程序和网页应用程序by Samuele Dassatti通过萨穆尔达萨蒂 如何开发感觉像本机移动应用程序的渐进式Web应用程序 (How you can develop Progressive Web Apps that feel like native mobile apps) I’m currently developing a Progressive Web App that will also ser…

leetcode1162. 地图分析(bfs)

你现在手里有一份大小为 N x N 的「地图」(网格) grid,上面的每个「区域」(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋区域,这个海洋区域到离它最近…

mysql修改root密码的方法

在 Navicat for MySQL 下面直接执行 SET PASSWORD FOR rootlocalhost PASSWORD(newpass); 就可以 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR rootlocalhost PASSWORD(newpass); 方法2:用mysqladmin mysqladmin -u root …

android 上下偏差怎么写_详解 Android 热更新升级如何突破底层结构差异?

知道了 native 替换方式兼容性问题的原因,我们是否有办法寻求一种新的方式,不依赖于 ROM 底层方法结构的实现而达到替换效果呢?我们发现,这样 native 层面替换思路,其实就是替换 ArtMethod 的所有成员。那么&#xff0…

Python3 Flask+nginx+Gunicorn部署(上)

前言:一般在本地运行flask项目通常是直接python3 文件名.py,然后打开:http://127.0.0.1:5000 查看代码结果 这次主要是记录flask在python3 环境结合nginx gunicorn在服务器上进行项目的部署 (一)运行环境:虚…

NOIP2011 铺地毯

题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯,一共有n张地毯,编号从 1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设&…