Was ist der Unterschied zwischen Weiterleitung und Navigation / Weiterleiten und wann wann was?
Was ist der Unterschied zwischen einer navigation in JSF
FacesContext context = FacesContext.getCurrentInstance();
context.getApplication().getNavigationHandler().handleNavigation(context, null, url);
und eine Umleitung
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.sendRedirect(url);
und wie Sie entscheiden, Wann, was?
Das Problem mit der navigation ist, dass die Seiten-URL ändert sich nicht, es sei denn faces-redirect=true
wird Hinzugefügt, um den query-string des Navigations-URL. Allerdings, in meinem Fall anfügen faces-redirect=true
wirft Fehler, wenn ich will redirect auf eine nicht-JSF-Seite, wie eine einfache HTML-Seite.
Und eine andere option ist die als BalusC schlug bei JSF 2.0 redirect Fehler
InformationsquelleAutor der Frage ad-inf | 2012-06-30
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst der Begriff "redirect" ist in web-Entwicklung Welt-die Aktion des Sendens der client eine leere HTTP-Antwort mit nur einer
Location
header mit dort die neue URL ein, auf dem der client sendet eine Marke neue GET-Anforderung. Also im Grunde:somepage.xhtml
.Location: newpage.xhtml
headernewpage.xhtml
(diese erhalten Sie spiegelt sich in der browser-Adressleiste!)newpage.xhtml
.Können Sie verfolgen ihn mit dem webbrowser builtin/addon Entwickler-toolset. Drücken Sie F12 in Chrome/IE9/Firebug und überprüfen Sie die "Netzwerk" - Abschnitt, um es zu sehen.
Des JSF-navigationhandler, nicht senden eine Umleitung. Stattdessen verwendet es den Inhalt der Ziel-Seite als HTTP-Antwort.
somepage.xhtml
.newpage.xhtml
.Jedoch als die ursprüngliche HTTP-Anforderung war
somepage.xhtml
die URL in der browser-Adresszeile bleibt unverändert. Wenn Sie vertraut sind mit der grundlegende Servlet-API, dann sollten Sie verstehen, dass dies den gleichen Effekt hat wieRequestDispatcher#forward()
.Ob das ziehen der
HttpServletResponse
unter der JSF-Hauben und ruftsendRedirect()
auf es ist die richtige Verwendung; Nein, das ist nicht die richtige Verwendung. Ihre server-logs zu erhalten unübersichtlich mitIllegalStateException
s, denn auf diese Weise sind Sie nicht sagen, JSF, die Sie bereits absolviert haben, die Kontrolle über das response-handling und damit JSF nicht tun sollte Ihre Standard-Antwort, handling job. Sie sollten in der Tat ausführen,FacesContext#responseComplete()
danach.Auch, immer wenn, Wann immer Sie brauchen, um zu importieren etwas von
javax.servlet.*
Paket in einer JSF-Artefakt wie eine managed bean, sollten Sie unbedingt stop-code schreiben und sich zweimal überlegen, ob Sie wirklich die Dinge auf die richtige Art und Weise und Fragen Sie sich, ob es nicht bereits eine "standard-JSF-Weg" für das, was Sie zu erreichen versuchen, und/oder wenn die Aufgabe gehört wirklich in eine JSF managed bean (es gibt nämlich einige Fälle, worin eine einfache servlet-filter wäre ein besserer Ort).Die richtige Art und Weise der Durchführung einer Weiterleitung in JSF ist mit
faces-redirect=true
query-Strings im action-Ergebnis:Oder mit
ExternalContext#redirect()
, wenn Sie nicht innerhalb einer action-Methode wie ajax oder prerender-listener-Methode:(ja, das tun Sie nicht brauchen, um eine
try-catch
um es aufIOException
wollen, lassen Sie einfach die Ausnahme Durchlaufenthrows
, der servletcontainer behandeln)Oder mit
NavigationHandler#handleNavigation()
in bestimmten Fällen, wenn Sie mit XML navigation Fälle und/oder eine benutzerdefinierte navigation-handler mit einigen eingebauten Hörer:Warum der navigation-handler fehlschlägt, für "plain-HTML" - Dateien, dass ist einfach, weil die navigation-handler verarbeitet werden können JSF-views nur die, keine anderen Dateien. Sie sollten mit
ExternalContext#redirect()
dann.Siehe auch:
InformationsquelleAutor der Antwort BalusC