2013-09-03 8 views
9

To pytanie jest ściśle związane z this jeden (który został odebrany).Wysyłanie przekierowania od wewnątrz metody ajax listener

W całym projekcie nawiguję pomiędzy ekranami za pomocą przycisków poleceń JSF, gdzie atrybut działania wskazuje na funkcję, która zwraca ciąg znaków. Ciąg to nazwa nowego ekranu, np.

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

selectFlight zwróci ciąg znaków, np. selected-flight-review, który skieruje użytkownika do: selected-flight-review.xhtml

Do celów mobilnych musiałem wykonać kliknięcie za pomocą wywołania ajaxowego, np. panelGrid.

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

To działa, Przetestowałem go i poprawny wynik jest zwracany (Testowane z zalogowaniu się tuż przed jej zwrócone)

Jednak nie przekierowanie odbywa. Wywołanie ajax jeszcze tego nie robi. Jak mogę przekierować na inny ekran? Nie muszę przesyłać żadnych zmiennych, potrzebuję tylko nowego ekranu do wyświetlenia. Czy powinienem używać czegoś innego niż ajax (wolałbym tego nie robić), czy jest jakiś sposób, aby uczynić tę pracę tak, jak jest teraz?

+0

Czy próbowałeś z dołączonym '? Faces-redirect = true'? Zobacz http://stackoverflow.com/a/7928396/1199132 –

+0

Tak, już to wypróbowałem. Zwraca zmodyfikowany ciąg znaków (z dołączonym przekierowaniem), ale w rzeczywistości nic z nim nie robi. Problem, który tu utknąłem, polega na tym, że ajax nie jest skojarzony z poleceniem CommandLink lub commandButton – Skytiger

Odpowiedz

17

można przekierować odpowiedzi z fasoli Podłoże:

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

. Lepiej przekierować za pomocą funkcji NavigationHandler JSF przy użyciu wyników, zamiast używać przekierowania nieprzetworzonego adresu URL na poziomie serwletu. –

+0

Zgodnie ze specyfikacją JSF, musisz wywołać FacesContext.getCurrentInstance(). ResponseComplete(); po przekierowaniu za pomocą kontekstu zewnętrznego. –

+0

[ExternalContext javadoc] (http://docs.oracle.com/javaee/7/api/javax/faces/context/ExternalContext.html#redirect-java.lang.String-) mówi: "Przekieruj żądanie do określony adres URL i spowodować wywołanie metody responseComplete() w instancji FacesContext dla bieżącego żądania. " To sprawia, że ​​myślę, że jawne wywołanie 'responseComplete()' nie jest konieczne. W tym linku znajduje się inny tekst o tym, jak przekierowanie działa w Ajaksie. – Pixelstix

-2

Wystarczy dodać w swoim podkładowej fasoli powrotnej „wybranym-lot-review”; Nie musisz dodawać (.xhtml) lub, jeśli chcesz przekierować , zwróć "zaznaczony przegląd lotów? Faces-redirect = true";

+0

Ta odpowiedź jest niepoprawna. Pytanie jasno pyta o metodę ajax listenener, a nie metodę akcji poleceń. Możesz zwrócić tylko przypadek nawigacji w metodzie akcji poleceń. PO nawet jednoznacznie o tym wspomniał w swoim pytaniu. – BalusC