一个例子应该有希望证明这个问题。我在页面上显示了10个文档,其中3个文档包含在zip包内的附加信息。在初始页面加载期间,我只知道哪些文件有这个附加信息,我做不是知道这些zip文件的URL。然后,我显示一个链接('Get Zip Package')到包含其他zip文件的3个文档。当用户点击“Get Zip Package”时,它会调用backing bean中的一个方法,该方法会转到数据库以找出zip包的URL。完成后,我想将压缩包提供给浏览器,然后弹出“另存为...”对话框,用户可以保存压缩包。JSF如何从backing bean重定向到在backing bean中动态构造的URL?
我尝试了两种方法,但都没有工作。
方法1
<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请求并调用backing bean函数。使用方法1,浏览器似乎在开始呈现响应之前似乎等待backing bean方法完成。通过方法2,不用等待,浏览器立即重新加载页面。我怀疑由于'Get Zip Package'链接指向页面本身,因此浏览器的GET请求会首先被处理,而支持bean方法的响应会丢失。
第三种方法(我还没有尝试过),我怀疑会工作得很好,就是调用一个Servlet,然后提供zip包。但是,看到我有一个直接链接到zip包的方式,我希望有一种方法可以在没有涉及Servlet的情况下为浏览器提供服务。
任何允许我使用URL而不用调用Servlet的建议或方法都是非常受欢迎的。当然,如果Servlet是这样做的唯一“正确”方式,我肯定会这样做。
谢谢。
我无法相信我竟然没给这个任何想法。谢谢:) ExternalContext context = FacesContext.getCurrentInstance()。getExternalContext(); context.redirect(packageLink); – Harinder
有时候我们太过分了! –