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

在统计业务需求中,需要去实时的统计并下载Excel文件。当数据量特别大的时候,就需要给予用户提示。点击下载时界面禁止用户操作,当弹出下载窗口时允许操作。

由于后台业务逻辑,在获取数据和统计数据的过程中 耗时比较长,所以在excel文件导出的过程中加了一个 提示用户正在导出数据的等待页面 ,现在用的是jquery的插件jquery.blockUI.js 。

这个插件的主要用法就是在发送异步请求之前先 调用一下锁屏的方法:
$.blockUI({ message: ' 数据导出中...' });,使用户不能进行其他操作,同时还能提示用户正在导出数据;  在success回调方法中解锁: $.unblockUI(); 
原本现在文件直接通过超链接可以完成下载,但现在要在success回调方法中解锁: $.unblockUI(); 在url中附带几个参数,并且这些参数要是点击事件触发时的最新值,所以这里使用ajax的方式进行下载。

然而:

1.使用ajax,ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的发送,接受都只能是string字符串,不能流类型,所以无法实现文件下载,强用会出现response冲突。

如果非要使用ajax的话,只能通过返回值得到生成的文件相关url。然后在回调函数里通过创建一个iframe,并设置其src值为文件url,或者一个对文件生成流的处理url,这样操作来实现文件下载且页面无刷新。




以下是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 {
    ......
}



你可能感兴趣的:(jsp,ajax,jquery.blockUI)