现在有个需求是这样的...在JSP页面有一个button...
点击之后会location.href到一个servlet
这个servlet会到数据库抽一批数据并生成EXCEL..然后通过ServletOutputStream返回到页面给用户下载这个文件..
因为在抽取数据这个过程需要消耗一定的时间(10秒以上,数据很多)
现在在这个button的onclick方法里面要加个判断..当servlet的文件没返回时要将这个按钮disabled...否则用户觉得没反应狂点的话服务器就被搞崩了.........然后文件返回并下载完成后(其实文件返回了就行,下载完成不完成无所谓)..要将这个按钮激活可以继续点....这个要怎么弄呢?

解决方案 »

  1.   

    - -这个很简单啊,如果用ajax 就在点击 onclick的时候  如果有用到 jquery就$(this).attr('disabled','disabled');
    在 返回数据后 $(this).removerAttr('disabled');  或 js时 this.disabled=true;  但是 建议你不这么做,最好 做一个遮罩层 进行处理, 在加载完数据后在撤销遮罩层, jquery 有这个插件,BlockUi 你可以参考下
      

  2.   

    但是我这没用jquery....用的是最基本的JSP+servlet...
    还有..现在已经是onclick的时候将按钮disabled了...但是没法自动恢复..因为我不知道这个文件是否已经生成并传到浏览器了...
    PS:我生成文件是用的一个单独的servlet..就是在onclick里有一个
    location.href="<%=request.getContextPath()%>/export?id=xxx";这个servlet里的doGet里就是
    ServletOutputStream aOutputStream = response.getOutputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    workbook.write(baos);
    baos.writeTo(aOutputStream);
    aOutputStream.flush();
    aOutputStream.close();不是通过ajax方式取得数据的....文件也是在服务器端就生成好了的...
      

  3.   


    ajax没有头绪..我试过..貌似没法将二进制数据文件直接传到浏览器..浏览器没弹出下载框这东东...
      

  4.   

    其实你也可以在 servlet里做判断, 也就是在 关闭数据流后返回个布尔 条件到页面, 页面判断这个布尔条件来区分是否 进行 打开按钮  不过类似这种东西  建议用 ajax 或做 遮罩层  你可以找找相关资料,其实这也是拓展思路   
      

  5.   

    location.href = XXX;
    应该不是原来的页面了..相当于跳转到另外一个页面了...但是这个页面的header是
    response.setContentType("application/ms-excel");
    response.addHeader("Content-Disposition", "attachment; filename=" + GridTurnpage.encode("OCNCommunity", "utf-8") + ".xls");
    所以这个页面不是打开一个新的页面..而是弹出下载框...你说的ajax那个有资料么?我找了一下..貌似都是通过打开一个新的页面提交到servlet做的...包括工程里的其他实现案例也是这么做的...
    遮罩层这个其实也有..但是都跳转到另外一个页面了..所以这个遮罩有没有都没区别..
    我的js是这么写的function exportCommFunc(){
    var rowset = getTable();
    var allcount = rowset.getTotalRowCount();
    if(allcount > 10000){
    alert("导出的数据超过最大限制(10000),请缩小导出范围!");
    return;
    }
    if(allcount < 1 ){
    alert("没有需要导出的数据!");
    return;
    }
    var areaId = getForm().getValue("areaId");
        if (areaId==null || areaId==""){
    alert("请选择行政区域!");
    return;
    }
    var communityName = getForm().getValue("cname");
    var regionalLocName = getForm().getValue("rl");
       var url = "<%=request.getContextPath()%>"
          + "/business/export?"
          + "areaid=" + areaId
          + "&communityname=" + communityName
          + "&regdes=" + regionalLocName;
       g_AIButtonManager.get("expCommBtn").setText("请稍候...重新导出请重新查询地址");
       document.all("expCommBtn").disabled = true;
    location.href = url;
    }
      

  6.   

    那你既然是跳转到另一个页面了 你怎么还要操作当前页面的 按钮呢? 你应该是跳转的时候就把按钮释放啊,还有就是 这个 下载这个完全也可以在当前页面做操作啊,可以通过弹出层里加载 新页面,或者一个 ifram 引入页 试试 ,还有按钮释放 的话 如果你想操作的话, 可以用 setTimeOut() 做 控制 在10秒后自动释放,或者在 当前页面从新刷新 后释放,怎么杨操作 就看你 是如何做页面了 我大概提供这个思路,你自己也 考虑下