在统计业务需求中,需要去实时的统计并下载Excel文件。当数据量特别大的时候,就需要给予用户提示。点击下载时界面禁止用户操作,当弹出下载窗口时允许操作。
由于后台业务逻辑,在获取数据和统计数据的过程中 耗时比较长,所以在excel文件导出的过程中加了一个 提示用户正在导出数据的等待页面 ,现在用的是jquery的插件jquery.blockUI.js 。
这个插件的主要用法就是在发送异步请求之前先 调用一下锁屏的方法:
$.blockUI({ message: '<img src="././images/WaitProcess.gif" /> 数据导出中...' });,使用户不能进行其他操作,同时还能提示用户正在导出数据; 在success回调方法中解锁: $.unblockUI();
原本现在文件直接通过超链接可以完成下载,但现在要在success回调方法中解锁: $.unblockUI(); 在url中附带几个参数,并且这些参数要是点击事件触发时的最新值,所以这里使用ajax的方式进行下载。
然而:
1.使用ajax,ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的发送,接受都只能是string字符串,不能流类型,所以无法实现文件下载,强用会出现response冲突。
如果非要使用ajax的话,只能通过返回值得到生成的文件相关url。然后在回调函数里通过创建一个iframe,并设置其src值为文件url,或者一个对文件生成流的处理url,这样操作来实现文件下载且页面无刷新。
<input type="button" value="打印" name="print" onclick="download();" />
<script type="text/javascript" src="${ctx }/js/jquery.js"></script>
<script type="text/javascript" src="${ctx }/js/jquery.blockUI.js"></script>
<script type="text/javascript">
function download(){
$.blockUI({message: '<img alt="" src="${ctx }/pkg/loading.gif"> 数据导出中...' });
/* 在success回调方法中解锁: $.unblockUI(); */
var parameter1 = $("#parameter1").val();
var parameter2 = $("#parameter2").val();
var parameter3 = $("#parameter3").val();
$.ajax({
url: "${ctx }/Stat",
type: "POST",
cache: false,
dataType : 'text',
data:{parameter1:parameter1,parameter2:parameter2,parameter3:parameter3},
success: function(data) {
$.unblockUI();
var result = eval("(" + data + ")");
$(document.body).append("<iframe height='0' width='0' frameborder='0' src=" + result.path + "></iframe>")
},
error:function(a,b,c){
alert("error");
}
});
}
</script>
以下是servlet:
String parameter1= request.getParameter("parameter1")
int parameter2 = request.getParameter("parameter2");
int parameter3 = request.getParameter("parameter3");
try {
String path = StatPrinter.exportToExcel(...);//返回的是文件地址
PrintWriter out = response.getWriter();
out.print("{\"path\":\""+request.getContextPath() + "/file/down?file=" + path.replace("\\", "/")+"\"}");
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}