web-dev-qa-db-ja.com

JSFバッキングBeanからバッキングBeanで動的に構築されたURLにリダイレクトする方法は?

例はうまくいけば問題を示すはずです。このページに表示されているドキュメントは10個あり、そのうち3個にはZipパッケージ内に追加情報が含まれています。最初のページの読み込み中に、この追加情報が含まれているドキュメントのみがわかります。これらのZipファイルのURLはわかりませんわかりません。次に、追加のZipファイルを含む3つのドキュメントへのリンク(「GetZipPackage」)を表示します。ユーザーが「GetZipPackage」をクリックすると、データベースに移動するバッキングBeanのメソッドを呼び出して、ZipパッケージのURLを把握します。これが完了したら、Zipパッケージをブラウザに提供します。ブラウザは[名前を付けて保存...]ダイアログとしてポップアップ表示され、ユーザーはZipパッケージを保存できます。

私は2つのアプローチを試しましたが、どちらも機能しません。

アプローチ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個のドキュメントが表示されると、[Get Zip Package]リンク(3個のドキュメント用)は何も指していません。基本的にはページと同じURLです。それをクリックすると、サーバーにGETリクエストが送信され、バッキングBean関数も呼び出されます。アプローチ1では、ブラウザーはバッキングBeanメソッドが終了するのを待ってから応答のレンダリングを開始するように見えます。アプローチ2では、待機はなく、ブラウザはすぐにページをリロードします。 「GetZipPackage」リンクはページ自体を指しているため、ブラウザのGETリクエストが最初に処理され、バッキングBeanメソッドの応答が失われるだけだと思います。

うまく機能すると思われる3番目のアプローチ(まだ試していません)は、サーブレットを呼び出してZipパッケージを提供することです。しかし、Zipパッケージへの直接URLがどのようにあるかを見て、サーブレットを使用せずにそれをブラウザーに提供する方法があることを望んでいました。

サーブレットを呼び出さずにURLを使用できるようにする提案やアプローチは大歓迎です。もちろん、サーブレットがこれを行う唯一の「適切な」方法である場合、私は確かにそれを行います。

ありがとうございました。

11
Harinder

この種のロジックを試すことができます:

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