JSF如何从后端bean重定向到在后端bean中动态构建的URL?

11

一个例子有望说明这个问题。我有10个文档在页面上显示,其中3个包含在zip文件中的附加信息。在初始页面加载期间,我只知道哪些文档具有此附加信息,我不知道这些zip文件的URL。因此,我会显示一个链接(“获取Zip包”)到包含额外zip文件的3个文档。当用户单击“获取Zip包时”,它会调用支持bean中的方法来去数据库找出zip包的URL。完成后,我希望向浏览器提供zip包,然后会弹出“另存为...”对话框,用户可以保存zip包。

我尝试了两种方法,但都不起作用。

方法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个文档时,其中3个文档的“获取Zip包”链接指向空白,实际上与页面具有相同的URL。当我点击它时,它会向服务器发送GET请求并调用支持bean函数。通过第一种方法,浏览器似乎需要等待备份bean方法完成后才开始呈现响应。通过第二种方法,没有等待,浏览器立即重新加载页面。我怀疑由于“获取Zip包”链接指向页面本身,浏览器的GET请求首先被处理,而备份bean方法的响应就被忽略了。

第三种方法(我还没有尝试过)我认为也可以很好地工作,就是调用一个Servlet来提供Zip包。但是,考虑到我直接访问Zip包的URL,我希望有一种方式可以将其提供给浏览器而不涉及Servlet。

欢迎任何建议或方法,允许我使用URL而不调用Servlet。当然,如果Servlet是唯一的“正确”方法,我一定会这样做。

谢谢。

1个回答

33

您可以尝试使用这种逻辑:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接