2012-11-27 7 views
11

Ein Beispiel soll das Problem hoffentlich demonstrieren. Ich habe 10 Dokumente, die auf der Seite angezeigt werden, 3 von ihnen haben zusätzliche Informationen in Zip-Paketen enthalten. Während des ersten Seitenladevorgangs weiß ich nur, welche Dokumente über diese zusätzlichen Informationen verfügen. Ich weiß nicht die URL zu diesen ZIP-Dateien. Dann zeige ich einen Link ('Get Zip Package') zu den 3 Dokumenten, die zusätzliche Zip-Dateien enthalten. Wenn der Benutzer auf 'Zip-Paket abrufen' klickt, ruft er eine Methode in der Backing-Bean auf, die an die Datenbank geht, um die URL des Zip-Pakets herauszufinden. Sobald dies erledigt ist, möchte ich das Zip-Paket dem Browser bereitstellen, der dann als Speichern unter ... angezeigt wird, und der Benutzer kann das Zip-Paket speichern.JSF Umleiten von Backing-Bean zu einer dynamisch in der Backing-Bean erstellten URL?

Ich habe zwei Ansätze versucht, aber keiner von ihnen funktioniert.

Ansatz 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; 
} 

Ansatz 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; 
} 

Wie die Seite geladen und die 10 Dokumente angezeigt werden, die 'Get Zip-Paket' Link (für die 3 Dokumente) deutet nichts an, e hat im Wesentlichen die gleiche URL wie die Seite. Wenn ich darauf klicke, sendet es eine GET-Anfrage an den Server und ruft auch die Backing-Bean-Funktion auf. Bei Ansatz 1 scheint der Browser darauf zu warten, dass die Backing-Bean-Methode beendet wird, bevor sie mit dem Rendern einer Antwort beginnt. Bei Ansatz 2 gibt es keine Wartezeit und der Browser lädt die Seite sofort neu. Ich vermute, dass, da der Link 'Get Zip Package' auf die Seite selbst zeigt, die GET-Anfrage des Browsers zuerst verarbeitet wird und die Antwort der Bean-Methode einfach verloren geht.

Ein dritter Ansatz (ich habe es noch nicht versucht), von dem ich vermute, dass es in Ordnung ist, ein Servlet aufzurufen, das dann das Zip-Paket bereitstellen würde. Aber da ich eine direkte URL zu dem Zip-Paket habe, hatte ich gehofft, dass es eine Möglichkeit geben würde, das dem Browser zur Verfügung zu stellen, ohne ein Servlet zu involvieren.

Alle Vorschläge oder Ansätze, die es mir ermöglichen würden, die URL ohne Aufruf eines Servlets zu verwenden, sind sehr willkommen. Natürlich, wenn Servlet der einzige "richtige" Weg ist, dies zu tun, werde ich das natürlich tun.

Vielen Dank.

Antwort

26

Sie können mit dieser Art von Logik versuchen:

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

ich nicht glauben kann ich nicht einmal diesen einen Gedanken gegeben hat. Danke :) ExternalContext context = FacesContext.getCurrentInstance(). GetExternalContext(); context.redirect (packageLink); – Harinder

+5

Manchmal sind wir zu sehr in das Projekt involviert! –

Verwandte Themen