我有一个带有表格的页面,其中有用户可以隐藏和显示的可选列。当用户选择通过表格底部的链接下载表格内容时,我想向他们发送当前显示列的内容。
为了做到这一点,我需要使用远程命令,因为常规的 commandLink 不会接受 js 参数来告诉服务器当前正在显示哪些列。
我的问题是文件没有被下载。当我调试时,我进入我的服务器方法并完全完成整个过程,当我返回浏览器时,我在 Chrome 的网络选项卡中看到文件的内容,但文件没有被下载,而是我的页面正在焕然一新。如果我在调用命令后将 return false 设置为 false,我会在 Chrome 的网络选项卡中看到该文件,并且页面不会刷新,但什么也不会发生。我尝试使用 onSuccess 或 onComplete 事件,但这些事件似乎没有按我的预期工作。
这可以使用 JSF 来完成还是我必须为此编写一个 servlet?
这是我的代码:链接
<h:commandLink value="Download data" onclick="invokeDownload();return false;" />
Run Code Online (Sandbox Code Playgroud)
调用js方法:
var invokeDownload = function() {
var columnLabels = getVisibleColumns().toString();
downloadTableData([{ "name": "columnLabels", "value": columnLabels }]);
}
Run Code Online (Sandbox Code Playgroud)
远程命令:
<p:remoteCommand name="downloadTableData" action="#{myBean.dataTable.download()}" process="@this"/>
Run Code Online (Sandbox Code Playgroud)
不会。它<p:remoteCommand>会触发 ajax 请求。但是您不能使用 ajax 下载文件。Ajax 由 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()}" />
Run Code Online (Sandbox Code Playgroud)
function populateDownloadData() {
var columnLabels = getVisibleColumns().toString();
document.getElementById("name").value = "columnLabels";
document.getElementById("value").value = columnLabels;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这些参数有点奇怪。也许您对示例感到困惑<p:remoteCommand>。我只是使用了一个名为 name 的请求参数columnLabels。
<input type="hidden" id="columnLabels" name="columnLabels" />
<h:commandLink value="Download data"
onclick="populateDownloadData()"
action="#{myBean.dataTable.download()}" />
Run Code Online (Sandbox Code Playgroud)
function populateDownloadData() {
var columnLabels = getVisibleColumns().toString();
document.getElementById("columnLabels").value = columnLabels;
}
Run Code Online (Sandbox Code Playgroud)