前言:
在做excel文件下载时 发现数据导出请求方法中response.getOutputStream().close(); 会关闭请求 从而得不到返回的标识来关闭进度条,故结合网上资料做了如下功能。
功能概要:
前端先隐藏一个div来做是否关闭的标识,点击下载后开启进度条显示,之后进入后台 后台开始时先移除上次的关闭进度条标识(request.getSession().removeAttribute("endflag");) 在导出逻辑最后在session中存放标识标识该关闭进度条了 (request.getSession().setAttribute("endflag", "1");); 前端在写一个定时任务来请求session中查看结束标识,当确认是结束标识是结束定时任务并关闭进度条。
<a href="javascript:void(0)" onclick="showMenu()" class="easyui-linkbutton" iconCls="icon-downtemplate" plain="true">导出</a>
<div id="menuid" class="easyui-menu" style="width:120px;">
<div data-options="iconCls:'icon-add'">
<a href="javascript:void(0)" style="text-decoration:none;out-line: none;color:#3C3C3C;" onclick='exportInfo("EXCEL")'>导出为.EXCEL</a>
</div>
<div class="menu-sep"></div>
<div data-options="iconCls:'icon-add'">
<a href="javascript:void(0)" style="text-decoration:none;out-line: none;color:#3C3C3C;" onclick='exportInfo("TXT")'>导出为.TXT</a>
</div>
</div>
<input type="hidden" id="divloads" name="bondname" value="0">
//导出菜单栏
function showMenu(){
$('#menuid').menu('show', {
//left: 200,
top: 30
});
}
function exportInfo(name){
$("#divloads").val("0")
$.messager.progress({
title: '提示',
msg: '请稍候……',
text: '债券信息下载中……'
});
if("EXCEL" === name){
var url="";
window.location.href=url;
}else if("TXT" === name){
var url="";
window.location.href=url;
}
listenEnd();
}
function listenEnd() {//定时监听
var loop = setInterval(function() {
if ($("#divloads").val() == "1") {
clearInterval(loop);//停止定时任务
$.messager.progress('close');//进度条关闭
} else {
getendflag();
}
}, 1000);//单位毫秒 注意:如果导出页面很慢时,建议循环时间段稍长一点
}
function getendflag() {//请求session标记位
$.ajax({
url: "",
type : 'POST',
dataType : 'json',
data : { "content" : '123' },
success : function(data) {
if("1"==data.obj.flag){
$("#divloads").val("1")
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) { // 设置表单提交出错
alert("操作失败,请联系系统管理员或稍后再试!" + XMLHttpRequest.status
+ " " + XMLHttpRequest.readyState + " " + textStatus + " "
+ errorThrown);
},
});
}
//导出逻辑时将标识放入session中
request.getSession().removeAttribute("endflag");
request.getSession().setAttribute("endflag", "1");
//获取结束标记
@RequestMapping("/getEndFlag")
@ResponseBody
public JSONObject getendflag(HttpServletRequest request, HttpServletResponse response) {
JsonResult result = new JsonResult(Response.SUCCESS);
JSONObject obj = new JSONObject();
Object flag = request.getSession().getAttribute("endflag"); //获取结束标记*/
obj.put("flag", flag);//返回状态值
result.putObject(obj);
return result.getResult();
}