Java 在Tapestry中等待下载准备就绪时显示throbber图像

Java 在Tapestry中等待下载准备就绪时显示throbber图像,java,javascript,download,tapestry,throbber,Java,Javascript,Download,Tapestry,Throbber,我的页面上有一个表单,可以生成一个大的PDF文件(最多需要20秒)。 有没有一种方法可以在创建下载文件时显示跳动器,并在出现下载提示时将其隐藏 我做了一些检查,最初认为我可以使用渐进式显示,但我认为这不是它的目的 我想我可以附加一个JS函数,当点击“下载”按钮时,它会触发我的心跳,但我不确定在下载窗口出现时如何隐藏它 在Tapestry中有这样做的方法吗?HTTP有一个限制,即不能返回包含PDF和一些json的单个响应 您可以做的是: 提交表单(具有区域参数) 启动生成PDF的异步作业 提交后立

我的页面上有一个表单,可以生成一个大的PDF文件(最多需要20秒)。 有没有一种方法可以在创建下载文件时显示跳动器,并在出现下载提示时将其隐藏

我做了一些检查,最初认为我可以使用渐进式显示,但我认为这不是它的目的

我想我可以附加一个JS函数,当点击“下载”按钮时,它会触发我的心跳,但我不确定在下载窗口出现时如何隐藏它


在Tapestry中有这样做的方法吗?

HTTP有一个限制,即不能返回包含PDF和一些json的单个响应

您可以做的是:

  • 提交表单(具有区域参数)
  • 启动生成PDF的异步作业
  • 提交后立即返回(生成PDF之前)
  • 启动一些javascript轮询作业,直到作业完成
  • 作业完成后,通过javascript下载PDF(
    document.location.href=/path/to/PDF

  • 您可以查看轮询异步任务的示例。您需要将PDF存储在异步任务(即会话、数据库或文件系统)的某个位置。

    更好的解决方案可能是不提交表单。您可以使用javascript构建GET url并使用iframe

    例如:

    
    点击我
    函数下载PDF(){
    var url=“/path/to/pdf?someText=“+encodeURIComponent($(“#someText”).val());
    startThrobber();
    $('')。附于('正文');
    }
    
    这看起来可能有用,但是,我没有PDF文件的实际链接,因为实际文件不存在。必须创建tapestry页面(或组件事件)来生成PDF并链接到它。您可以从页面的onActivate()返回StreamResponse。我不确定是否正确地理解了您的意思。你是说我应该有这样一个组件事件
    myContextRoot/myPage/customevent:customparam
    ,并让url指向它吗?我会创建一个页面,在它的
    onActivate(EventContext)
    中生成PDF。您可以通过请求参数或激活上下文将表单值传递给它。您可以通过
    Componentresources.createPageLink(…)
    .Thx获得该页面的URL,我将尝试:)
    <form>
        <input id="someText" />
        <button onclick="downloadPdf()">Click Me</button>
    </form>
    
    <script>
       function downloadPdf() {
          var url = "/path/to/pdf?someText=" + encodeURIComponent($("#someText").val());
          startThrobber();
          $('<iframe src="' + url + '" onLoad="stopThrobbber()">').appendTo('body');
       }
    </script>