有希望通过一个例子来说明这个问题。我的页面上显示了 10 个文档,其中 3 个在 zip 包内包含附加信息。在初始页面加载期间,我只知道哪些文档具有此附加信息,我知道not知道这些 zip 文件的 URL。然后,我显示指向包含其他 zip 文件的 3 个文档的链接(“获取 Zip 包”)。当用户单击“获取 Zip 包”时,它会调用支持 bean 中的一个方法,该方法会访问数据库来找出 zip 包的 URL。完成此操作后,我想将 zip 包提供给浏览器,然后浏览器会弹出“另存为...”对话框,用户可以保存 zip 包。
我尝试了两种方法,但都不起作用。
方法一
<p:commandLink actionListener="#{myBackingBean.zipPackage(aDocument)}"
value="Get Zip Package"
ajax="false"
rendered="#{aDocument.packageAvailable}"/>
public String zipPackage(DocItem item){
//logic here to figure out the URL for this item's zip package
return packageLink;
}
方法2
<h:outputLink onclick="getPackageLink([{name:'product', value: '#{aResult.product}'}, {name:'version',value:'#{aResult.version}'}])"
<h:outputText value="Get Documentation Package"/>
</h:outputLink>
<p:remoteCommand name="getPackageLink" actionListener="#{kbBackingBean.zipPackage()}"/>
public String zipPackage() {
Map map = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String product = (String) map.get("product");
String version = (String) map.get("version");
//logic here to figure out the URL for this item's zip package
return packageLink;
}
当页面加载并显示 10 个文档时,“获取 Zip 包”链接(针对 3 个文档)没有指向任何内容,本质上与页面具有相同的 URL。当我单击它时,它会向服务器发送 GET 请求并调用支持 bean 函数。使用方法 1,浏览器似乎确实要等待辅助 bean 方法完成,然后才开始呈现响应。使用方法 2,无需等待,浏览器会立即重新加载页面。我怀疑,由于“获取 Zip 包”链接指向页面本身,浏览器的 GET 请求首先得到处理,而支持 bean 方法的响应就会丢失。
我怀疑第三种方法(我还没有尝试过)会很好地工作,那就是调用一个 Servlet,然后它会提供 zip 包。但是看到我如何获得 zip 包的直接 URL,我希望有一种方法可以将其提供给浏览器,而无需涉及 Servlet。
任何允许我在不调用 Servlet 的情况下使用 URL 的建议或方法都是非常受欢迎的。当然,如果 Servlet 是执行此操作的唯一“正确”方法,我肯定会这样做。
谢谢。