是否可以使用PrimeFaces RemoteCommand下载文件?

时间:2015-04-22 14:26:15

标签: javascript jsf primefaces

我有一个页面,其中包含一个用户可以隐藏和显示的可选列。 当用户选择通过表格底部的链接下载表格内容时,我想向他们发送当前显示列的内容。

为了做到这一点,我需要使用远程命令,因为常规的commandLink不接受js参数来告诉服务器当前正在显示哪些列。

我的问题是该文件未被下载。当我调试时,我进入我的服务器方法并完全完成整个过程,当我返回浏览器时,我在Chrome的网络选项卡中看到该文件的内容,但该文件未被下载,而是我的页面是正在焕然一新。如果我在调用命令后将return false设置为false,则会在Chrome的网络选项卡中看到该文件,并且页面不会刷新但没有任何反应。 我试图使用onSuccess或onComplete事件,但这些事件似乎没有像我期望的那样工作。

这可以使用JSF完成,还是我必须为此编写一个servlet?

这是我的代码: 链接

<h:commandLink value="Download data" onclick="invokeDownload();return false;" />

调用js方法:

var invokeDownload = function() {
        var columnLabels = getVisibleColumns().toString();
        downloadTableData([{ "name": "columnLabels", "value": columnLabels     }]);
    }

远程命令:

<p:remoteCommand name="downloadTableData" action="#{myBean.dataTable.download()}" process="@this"/>

2 个答案:

答案 0 :(得分:4)

没有。 <p:remoteCommand>会触发ajax请求。但是,您无法使用ajax下载文件。 Ajax由JavaScript代码执行,出于明显的安全原因,没有任何设施可以强制另存为对话框,而某些JavaScript变量中包含一些数据。

只需触发同步请求即可。您可以让JS填充与您尝试通过的请求参数具有相同名称的隐藏输入字段。

<input type="hidden" id="name" name="name" />
<input type="hidden" id="value" name="value" />
<h:commandLink value="Download data" 
    onclick="populateDownloadData()"
    action="#{myBean.dataTable.download()}" />
function populateDownloadData() {
    var columnLabels = getVisibleColumns().toString();
    document.getElementById("name").value = "columnLabels";
    document.getElementById("value").value = columnLabels;
}

这些参数有点奇怪。也许你被<p:remoteCommand>例子搞糊涂了。我只使用了一个名为columnLabels的请求参数。

<input type="hidden" id="columnLabels" name="columnLabels" />
<h:commandLink value="Download data" 
    onclick="populateDownloadData()"
    action="#{myBean.dataTable.download()}" />
function populateDownloadData() {
    var columnLabels = getVisibleColumns().toString();
    document.getElementById("columnLabels").value = columnLabels;
}

答案 1 :(得分:-1)

您可以使用Primefaces的dataExporter标记,用于下载显示的表格的内容:Primefaces dataExporter