うまくいけば、例が問題を示すはずです。ページに表示されている 10 個のドキュメントがあり、そのうち 3 個には zip パッケージ内に追加情報が含まれています。最初のページの読み込み時には、どのドキュメントにこの追加情報が含まれているかしかわかりません。これらの zip ファイルへの URL はわかりません。次に、追加の zip ファイルを含む 3 つのドキュメントへのリンク (「Get Zip Package」) を表示します。ユーザーが [Get Zip Package] をクリックすると、バッキング 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 個のドキュメントが表示されると、(3 つのドキュメントの) [Get Zip Package] リンクは何も指さず、基本的にページと同じ URL を持ちます。クリックすると、GET 要求がサーバーに送信され、バッキング Bean 関数も呼び出されます。アプローチ 1 では、ブラウザはバッキング Bean メソッドが終了するのを待ってから応答のレンダリングを開始するように見えます。アプローチ 2 では、待ち時間がなく、ブラウザーはすぐにページをリロードします。「Get Zip Package」リンクがページ自体を指しているため、ブラウザーの GET 要求が最初に処理され、バッキング Bean メソッドの応答が単純に失われると思われます。
うまくいくと思われる 3 つ目のアプローチ (まだ試していません) は、zip パッケージを提供するサーブレットを呼び出すことです。しかし、私が zip パッケージへの直接 URL をどのように持っているかを見て、サーブレットを関与させずにそれをブラウザーに提供する方法があることを望んでいました。
サーブレットを呼び出さずに URL を使用できるようにする提案やアプローチは大歓迎です。もちろん、サーブレットがこれを行う唯一の「適切な」方法である場合、私は間違いなくそうします。
ありがとうございました。