我有一个页面,其中包含一个用户可以隐藏和显示的可选列。 当用户选择通过表格底部的链接下载表格内容时,我想向他们发送当前显示列的内容。
为了做到这一点,我需要使用远程命令,因为常规的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"/>
答案 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