2013-09-03 5 views
9

Diese Frage steht in engem Zusammenhang mit this eine (die beantwortet wurde).Senden einer Weiterleitung von innerhalb einer Ajax-Listener-Methode

Während meines Projekts navigiere ich zwischen den Bildschirmen mit JSF-Befehlsschaltflächen, wobei das Aktionsattribut auf eine Funktion verweist, die eine Zeichenfolge zurückgibt. Die Zeichenfolge ist der Name des neuen Bildschirms, z.

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

selectFlight würde eine Zeichenkette zurück, z.B. selected-flight-review, die den Benutzer zu selected-flight-review.xhtml

leiten würde Für mobile Zwecke musste ich eine panelGrid klickbar mit einem Ajax Anruf, z.

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

Dies funktioniert, ich habe es ausprobiert, und das richtige Ergebnis zurückgegeben wird (getestet mit der Anmeldung direkt bevor es zurückgegeben wird)

jedoch keine Umleitung stattfindet. Der Ajax-Aufruf macht es noch nicht. Wie kann ich es auf einen anderen Bildschirm umleiten? Ich muss keine Variablen senden, ich brauche nur den neuen Bildschirm, der angezeigt werden soll. Sollte ich etwas anderes als Ajax verwenden (würde ich lieber nicht), oder gibt es einen Weg, dies so zu machen, wie es jetzt ist?

+0

Haben Sie versucht mit '? Faces-redirect = true' angehängt? Siehe http://StackOverflow.com/a/7928396/1199132 –

+0

Ja, habe das schon versucht. Sie gibt die geänderte Zeichenfolge (mit der angehängten Umleitung) zurück, tut aber nichts damit. Das Problem, mit dem ich hier festhalte, ist, dass der Ajax nicht mit einem commandLink oder commandButton verknüpft ist. – Skytiger

Antwort

17

Sie können die Antwort von dem Backing Bean umleiten:

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

Es ist besser, über JSFs NavigationHandler mit Ergebnissen umzuleiten, anstatt die rohe URL-Umleitung der Servlet-Ebene zu verwenden. –

+0

Gemäß den JSF-Spezifikationen müssen Sie FacesContext.getCurrentInstance() aufrufen. ResponseComplete(); nach Umleitung mit externem Kontext. –

+0

Der [ExternalContext javadoc] (http://docs.oracle.com/javaee/7/api/javax/faces/context/ExternalContext.html#redirect-java.lang.String-) sagt: "Leiten Sie eine Anfrage an die angegebene URL, und bewirken, dass die Methode responseComplete() für die aktuelle Anforderung in der FacesContext-Instanz aufgerufen wird. " Das lässt mich denken, dass der explizite Aufruf von "responseComplete()" nicht notwendig ist. Es gibt einen anderen Text in diesem Link darüber, wie der Anruf zum Weiterleiten unter Ajax funktioniert. – Pixelstix

-2

Fügen Sie einfach in Ihrem Backing Bean return "selected-flight-Bewertung"; Sie müssen nicht hinzufügen (.xhtml) Oder wenn Sie umleiten möchten zurück "ausgewählte Flug-Review? Faces-Redirect = True";

+0

Diese Antwort ist falsch. Die Frage fragt klar nach einer Ajax-Listener-Methode, nicht nach einer Befehlsaktionsmethode. Sie können einen Navigationsvorgang nur in einer Befehlsaktionsmethode zurückgeben. Das OP hat dies in seiner Frage sogar ausdrücklich erwähnt. – BalusC

Verwandte Themen