利用Ajax向Servlet发送请求下载统计后的Excel文件,利用jquery.blockUI.js给予用户等待提示

来源:互联网 发布:php 中英文企业网站 编辑:程序博客网 时间:2024/05/17 02:46

在统计业务需求中,需要去实时的统计并下载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 fondNum = $("#fondNum").val(); var startYear = $("#startYear").val(); var endYear = $("#endYear").val(); $.ajax({         url: "${ctx }/Stat",         type: "POST",         cache: false,         dataType : 'text',           data:{fondNum:fondNum,startYear:startYear,endYear:endYear,print:"打印"},         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 fondNum = request.getParameter("fondNum")int startYear = NumberUtil.getValue(request.getParameter("startYear"));int endYear = NumberUtil.getValue(request.getParameter("endYear"));String type = request.getParameter("print");if(type!= null && type.equals("打印")) {  try {      String path = StatPrinter.exportToExcelByYear2(...);//返回的是文件地址      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();  }}else {    ......}



阅读全文
0 0
原创粉丝点击