2013-09-03 5 views
9

Questa domanda è strettamente correlata a this una (a cui è stata data una risposta).Invio di un reindirizzamento dall'interno di un metodo di ascolto Ajax

Durante il mio progetto, navigo tra le schermate usando i pulsanti di comando JSF, dove l'attributo action punta a una funzione che restituisce una stringa. La stringa è il nome della nuova schermata, ad es.

<h:commandButton value="Select" action="#{searchResultsBundledBean.selectFlight}"> 
</h:commandButton> 

selectFlight restituirebbe una stringa, ad esempio selected-flight-review che indirizza l'utente a selected-flight-review.xhtml

Per scopi mobili ho dovuto fare un clic su panelGrid utilizzando una chiamata ajax, ad es.

<h:panelGrid> 
    <f:ajax event="click" listener="#{searchResultsBundledBean.clickFlight(lowFareBundledSearchItem)}"/> 
</h:panelGrid 

Questo funziona, ho provato, e il risultato corretto viene restituito (testato con la registrazione nel modo giusto prima di essere restituito)

Tuttavia, nessun reindirizzamento avviene. La chiamata ajax non lo fa ancora. Come faccio a reindirizzare su un altro schermo? Non devo inviare alcuna variabile, ho solo bisogno che venga visualizzata la nuova schermata. Dovrei usare qualcosa di diverso da Ajax (preferirei non farlo), o c'è un modo per rendere questo lavoro così com'è adesso?

+0

Hai provato con '? Faces-redirect = true' aggiunto? Vedi http://stackoverflow.com/a/7928396/1199132 –

+0

Sì, già provato. Restituisce la stringa modificata (con il redirect aggiunto), ma in realtà non fa nulla con esso. Il problema con cui mi trovo qui è che l'ajax non è associato a un commandLink o commandButton – Skytiger

risposta

17

È possibile reindirizzare la risposta dal backing bean:

public void clickFlight(Item lowFareBundledSearchItem) throws IOException { 
    // ... 
    FacesContext.getCurrentInstance().getExternalContext().redirect("selected-flight-review.xhtml"); 
    FacesContext.getCurrentInstance().responseComplete(); 
} 
+0

È preferibile reindirizzare tramite NavigationHandler di JSF utilizzando i risultati, invece di utilizzare il reindirizzamento degli URL raw a livello di servlet. –

+0

In base alle specifiche JSF, è necessario chiamare FacesContext.getCurrentInstance(). ResponseComplete(); dopo il reindirizzamento usando il contesto esterno. –

+0

Il [ExternalContext javadoc] (http://docs.oracle.com/javaee/7/api/javax/faces/context/ExternalContext.html#redirect-java.lang.String-) dice: "Reindirizza una richiesta al URL specificato e causare il richiamo del metodo responseComplete() sull'istanza FacesContext per la richiesta corrente. " Questo mi fa pensare che la chiamata esplicita a 'responseComplete()' non sia necessaria. C'è qualche altro testo in quel link su come la chiamata a reindirizzare funziona sotto Ajax. – Pixelstix

-2

Basta aggiungere nel vostro supporto di fagioli ritorno "selezionato-volo-review"; Non è necessario aggiungere (.xhtml) Oppure se si desidera reindirizzare return "selected-flight-review? Faces-redirect = true";

+0

Questa risposta non è corretta. La domanda chiede chiaramente un metodo di ascolto ajax, non un metodo di azione di comando. È possibile restituire un caso di navigazione solo in un metodo di azione comandi. Anche il PO ha menzionato esplicitamente questo nella sua domanda. – BalusC

Problemi correlati