2012-11-27 17 views
11

Un esempio dovrebbe dimostrare il problema. Ho 10 documenti che vengono visualizzati sulla pagina, 3 di loro hanno informazioni aggiuntive contenute nei pacchetti zip. Durante il caricamento iniziale della pagina, so solo quali documenti hanno queste informazioni aggiuntive, faccio non conoscere l'URL di questi file zip. Quindi, visualizzo un collegamento ("Ottieni pacchetto zip") ai 3 documenti che contengono file zip aggiuntivi. Quando l'utente fa clic su "Ottieni pacchetto Zip", chiama un metodo nel bean di supporto che va al database per capire l'URL del pacchetto zip. Una volta eseguita questa operazione, desidero pubblicare il pacchetto zip nel browser che verrà visualizzato come Salva con nome ... e l'utente può salvare il pacchetto zip.JSF Come reindirizzare dal bean di supporto a un URL costruito dinamicamente nel bean di supporto?

Ho provato due approcci ma nessuno di essi funziona.

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

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

Come viene caricata la pagina ei 10 documenti vengono visualizzati, il 'Get Zip pacchetto' di collegamento (per i 3 documenti) punta a nulla, e ha lo stesso URL della pagina. Quando faccio clic su di esso, invia una richiesta GET al server e chiama anche la funzione backing bean. Con l'approccio 1, il browser sembra attendere il completamento del metodo del bean backing prima di iniziare il rendering di una risposta. Con l'approccio 2, non c'è attesa e il browser ricarica immediatamente la pagina. Sospetto che dal momento che il collegamento "Get Zip Package" punta alla pagina stessa, la richiesta GET del browser viene elaborata per prima e la risposta del metodo del bean backing viene semplicemente persa.

Un terzo approccio (non ho ancora provato) che sospetto funzionerà bene è quello di richiamare un servlet che poi servirà il pacchetto zip. Ma vedendo come ho un URL diretto al pacchetto zip, speravo che ci sarebbe stato un modo per servirlo nel browser senza coinvolgere un servlet.

Qualsiasi suggerimento (i) o approccio (i) che mi consenta di utilizzare l'URL senza richiamare un servlet sono i benvenuti. Naturalmente, se Servlet è l'unico modo "corretto" per farlo, lo farò sicuramente.

Grazie.

risposta

26

Si può provare con questo tipo di logica:

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

Non posso credere che non ho nemmeno dato questo ogni pensiero. Grazie :) Contesto ExternalContext = FacesContext.getCurrentInstance(). GetExternalContext(); context.redirect (packageLink); – Harinder

+5

A volte siamo troppo coinvolti nel progetto! –

Problemi correlati