如何在Tapestry5中返回页面和Stream?

时间:2010-12-07 10:42:25

标签: javascript tapestry

我正在使用Tapestry 5 framework / javascript开发一个Web应用程序项目。此应用程序需要很少的输入并返回pdf文件。

我有一个新要求,即在用户点击它时禁用表单提交按钮。该按钮应保持禁用状态,直到生成报告为止。我打算编写javascript来禁用提交按钮。但是如何在返回pdf文件时重新启用按钮?

我已经阅读了Tapestry文档。根据文档,有效的返回类型是“Nothing,String,Class,Page,Link,Stream”。如果我返回页面,我可以重新启用提交按钮。如果我返回一个流,用户将能够下载pdf。但是我想两个都做。有什么方法可以返回多个对象(可能是另一个对象内的一个对象)。 (或)有人可以建议解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:2)

我猜你的工作流程是表单提交处理程序指向一个页面,该页面在onActivate方法中返回一个流(pdf)。我也猜测你设置响应标题,以便下载文件而不是浏览器打开。

如果您这样做,浏览器通常会创建一个“保存文件为”对话框,并且当前页面永远不会导航(不刷新)。您将永远不会收到任何回调,告诉您文件已被下载。

因此,通过上述工作流程,您将无法重新启用按钮作为对下载启动或完成的响应。这是因为流响应只是任意二进制数据而不是浏览器能够执行的html / javascript。你不能返回html / javascript +二进制文件数据的混合响应。

您可以实现的最佳效果是在一段时间内禁用该按钮,然后重新启用它以防止双击。如果您不想为应用程序添加太多复杂性,我推荐这种方法。

但是,您可以更改工作流程,在表单提交和下载之间插入额外的请求 - 响应。

即。而不是直接指向返回流的页面,您可以重新加载当前页面,然后请求下载:

  1. 您的表单提交将您的pdf生成参数保存到会话并返回响应(重新加载页面)
  2. 新页面加载元刷新或脚本指令以重定向到下载URL
  3. 调用下载URL返回流响应以及正确的标头集,以便用户将“保存文件另存为”对话框
  4. 可能还有其他方法可以实现您想要的功能,但是模式将是相同的,因为您需要在表单提交和文件下载之间进行额外的请求 - 响应。

    PS。这不是一个真正的挂毯问题,无论框架如何,你都会遇到同样的问题(除非框架做了一些特殊处理这种情况)。这就是http /浏览器技术的工作原理。