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.pswp.cn/news/394064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394064.shtml
英文地址,請注明出處:http://en.pswp.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。現在將這些地毯按照編號從小到大的順序平行于坐標軸先后鋪設&…