2012-11-27 52 views
11

一个例子应该有希望证明这个问题。我在页面上显示了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是这样做的唯一“正确”方式,我肯定会这样做。

谢谢。

回答

26

你可以用这样的逻辑的尝试:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
context.redirect(context.getRequestContextPath() + "download-page.jsf?product=" + product + "&version=" + version); 
+0

我无法相信我竟然没给这个任何想法。谢谢:) ExternalContext context = FacesContext.getCurrentInstance()。getExternalContext(); context.redirect(packageLink); – Harinder

+5

有时候我们太过分了! –

相关问题