2015-04-22 45 views
0

我有一个页面,里面有一个表格,用户可以隐藏和显示可选列。 当用户选择通过表格底部的链接下载表格的内容时,我想向他们发送当前显示列的内容。是否可以使用PrimeFaces RemoteCommand下载文件?

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

我的问题是该文件没有被下载。当我调试时,我得到了我的服务器方法,并完成整个过程,当我返回到浏览器时,我在Chrome的网络标签中看到文件的内容,但文件没有被下载,而是我的页面是正在刷新。如果我在调用命令后将返回值设为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"/> 
+0

你有什么理由在这里使用一个remoteCommand?我希望这可以通过一个servlet来简化。 –

+0

'p:fileDownload'呢? http://www.primefaces.org/showcase/ui/file/download.xhtml –

+0

@Xtreme,我相信p:fileDownload是针对现有文件的。有没有办法将参数发送到后台方法来构建带有相关数据的文件? – Talbam

回答

0

您可以使用dataExporter标签形式Primefaces,这是为了下载显示表的内容:Primefaces dataExporter

+0

该表格不是PrimeFaces表格,即使是这样,数据导出器也没有给我足够的灵活性来以所需的格式下载数据。 – Talbam

+0

@Talbam,dataExporter是可定制和可扩展的。它默认支持4种格式,添加对其他格式的支持并不是特别具有挑战性。如果你可以找到一个更简单的解决方案,太棒了,请发表一个答案,但dataExporter完全能够满足你的要求。 – DavidS

+0

我在页面上的表不是PrimeFaces表,并且根据dataExporter代码,不支持这样的表:http://grepcode.com/file/repository.primefaces.org/org.primefaces/primefaces/5.1 .RC1 /组织/ primefaces /组件/导出/ DataExporter.java / – Talbam

3

编号<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; 
} 

这些PARAMS是由方式有些奇怪。也许你很困惑<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; 
} 
相关问题