Was ist der konzeptionelle Unterschied zwischen forward()
und sendRedirect()
?
requestDispatcher - forward () -Methode
Wenn wir die
forward
Methode verwenden, wird die Anforderung zur weiteren Verarbeitung an eine andere Ressource auf demselben Server übertragen.Im Fall von
forward
übernimmt der Webcontainer die gesamte Verarbeitung intern und der Client oder Browser ist nicht beteiligt.Wenn
forward
dasrequestDispatcher
Objekt aufgerufen wird, übergeben wir die Anforderungs- und Antwortobjekte, sodass unser altes Anforderungsobjekt in der neuen Ressource vorhanden ist, die unsere Anforderung verarbeiten wird.Visuell können wir die weitergeleitete Adresse nicht sehen, sie ist transparent.
Die Verwendung der
forward()
Methode ist schneller alssendRedirect
.Wenn wir mit Forward umleiten und dieselben Daten in einer neuen Ressource verwenden möchten, können wir verwenden,
request.setAttribute()
da ein Anforderungsobjekt verfügbar ist.SendRedirect
In diesem Fall
sendRedirect
wird die Anforderung zur weiteren Verarbeitung an eine andere Ressource, an eine andere Domäne oder an einen anderen Server übertragen.Bei Verwendung
sendRedirect
überträgt der Container die Anforderung an den Client oder Browser, sodass die in dersendRedirect
Methode angegebene URL als neue Anforderung für den Client angezeigt wird .Bei einem
sendRedirect
Anruf gehen die alten Anforderungs- und Antwortobjekte verloren, da sie vom Browser als neue Anforderung behandelt werden.In der Adressleiste sehen wir die neue umgeleitete Adresse. Es ist nicht transparent.
sendRedirect
ist langsamer, weil ein zusätzlicher Roundtrip erforderlich ist, weil eine völlig neue Anforderung erstellt wird und das alte Anforderungsobjekt verloren geht. Es sind zwei Browseranfragen erforderlich.Aber
sendRedirect
, wenn wir die gleichen Daten für eine neue Ressource verwenden wollen , müssen wir die Daten in der Sitzung speichern oder mit der URL übergeben zusammen.Welches ist gut?
Dies hängt vom Szenario ab, für das die Methode nützlicher ist.
Wenn Sie möchten, dass die Steuerung auf einen neuen Server oder Kontext übertragen wird und als völlig neue Aufgabe behandelt wird, dann entscheiden wir uns für
sendRedirect
. Im Allgemeinen sollte eine Weiterleitung verwendet werden, wenn der Vorgang beim erneuten Laden der Webseite durch den Browser sicher wiederholt werden kann und das Ergebnis nicht beeinflusst.
In der Welt der Webentwicklung bedeutet der Begriff "Weiterleitung", dass dem Client eine leere HTTP-Antwort mit nur einem Location
Header gesendet wird, der die neue URL enthält, an die der Client eine brandneue GET-Anforderung senden muss. Also im Grunde genommen:
some.jsp
.Location: other.jsp
Header zurückother.jsp
(dies wird in der Adressleiste des Browsers angezeigt!)other.jsp
.Sie können es mit dem integrierten / Addon-Entwickler-Toolset des Webbrowsers verfolgen. Drücken Sie in Chrome / IE9 / Firebug F12 und überprüfen Sie den Abschnitt "Netzwerk", um ihn anzuzeigen.
Genau das oben Genannte wird erreicht durch sendRedirect("other.jsp")
. Der RequestDispatcher#forward()
sendet keine Weiterleitung. Stattdessen wird der Inhalt der Zielseite als HTTP-Antwort verwendet.
some.jsp
.other.jsp
.Wie bei der ursprünglichen HTTP-Anforderung some.jsp
bleibt die URL in der Adressleiste des Browsers jedoch unverändert. Außerdem sind alle im Controller dahinter festgelegten Anforderungsattribute in some.jsp
verfügbar other.jsp
. Dies geschieht nicht während einer Umleitung, da Sie den Client grundsätzlich dazu zwingen, eine neue HTTP-Anforderung zu erstellen, wodurch other.jsp
die ursprüngliche Anforderung some.jsp
verworfen wird, wenn alle seine Attribute eingeschlossen werden.
Dies RequestDispatcher
ist äußerst nützlich im MVC-Paradigma und / oder wenn Sie JSPs vor dem direkten Zugriff verbergen möchten. Sie können JSPs in den /WEB-INF
Ordner legen und eine verwenden, Servlet
die die Anforderungen steuert, vorverarbeitet und nachbearbeitet. Auf die JSPs im /WEB-INF
Ordner kann nicht direkt über die URL zugegriffen werden, sie können jedoch über die URL Servlet
auf sie zugreifen RequestDispatcher#forward()
.
Sie können beispielsweise eine JSP-Datei in haben /WEB-INF/login.jsp
und eine, LoginServlet
die einer url-pattern
von zugeordnet ist /login
. Wenn Sie aufrufen http://example.com/context/login
, werden die Servlets doGet()
aufgerufen. Sie können eine beliebige tun pre dort Verarbeitung Sachen und schließlich nach vorn die Anfrage wie:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Wenn Sie ein Formular senden, möchten Sie normalerweise Folgendes verwenden POST
:
<form action="login" method="post">
Auf diese Weise der Servlets doPost()
wird aufgerufen und Sie können jede tun Post dort (zB Validierung, Geschäftslogik, anmelden , um den Benutzer, usw.) Verarbeitung Zeug.
Wenn es irgendwelche Fehler gibt, dann wollen Sie in der Regel zu übermitteln die Anforderung wieder auf die gleiche Seite und die Fehler dort neben den Eingabefeldern angezeigt werden und so weiter. Sie können das RequestDispatcher
dafür verwenden.
Wenn a POST
erfolgreich ist, möchten Sie die Anforderung normalerweise umleiten , damit die Anforderung nicht erneut gesendet wird, wenn der Benutzer die Anforderung aktualisiert (z. B. Drücken von F5 oder Zurücknavigieren im Verlauf).
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
request.setAttribute("error", "Unknown login, please try again."); // Set error.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}
Eine Umleitung weist den Client daher an, eine neue GET
Anforderung unter der angegebenen URL auszulösen. Durch das Aktualisieren der Anforderung wird dann nur die umgeleitete Anforderung und nicht die ursprüngliche Anforderung aktualisiert. Dies vermeidet "doppelte Einreichungen" und Verwirrung sowie schlechte Benutzererfahrungen. Dies wird auch als POST-Redirect-GET
Muster bezeichnet .
response.sendRedirect("..")
auf die index.jsp-Seite der Website. Dadurch werden jedoch die CSS-Dateien und Text von der JSP-Seite übersehen, was zu einem teilweisen Laden der Seite führt. Aber wenn ich die Begrüßungsseite der Website zu index.jsp mache, funktioniert alles einwandfrei und das Laden der Seite ist abgeschlossen. Was ist los mit der Weiterleitung?Über die
RequestDispatcher
Schnittstelle können Sie eine serverseitige Weiterleitung / Einbeziehung durchführen, währendsendRedirect()
eine clientseitige Umleitung erfolgt. Bei einer clientseitigen Umleitung sendet der Server den HTTP-Statuscode302
(temporäre Umleitung) zurück, wodurch der Webbrowser eine brandneue HTTP-GET
Anforderung für den Inhalt am umgeleiteten Speicherort ausgibt. Im Gegensatz dazu wird bei Verwendung derRequestDispatcher
Schnittstelle das Einschließen / Weiterleiten an die neue Ressource vollständig auf der Serverseite behandelt.quelle
forward
keine Weiterleitung.Jede dieser Methoden ist möglicherweise "besser", dh besser geeignet, je nachdem, was Sie tun möchten.
Eine serverseitige Umleitung ist insofern schneller, als Sie die Daten von einer anderen Seite abrufen, ohne einen Roundtrip zum Browser durchzuführen. Die im Browser angezeigte URL ist jedoch immer noch die ursprüngliche Adresse, sodass Sie dort eine kleine Inkonsistenz erzeugen.
Eine clientseitige Umleitung ist insofern vielseitiger, als sie Sie an einen völlig anderen Server senden oder das Protokoll (z. B. von HTTP zu HTTPS) oder beides ändern kann. Und der Browser kennt die neue URL. Es ist jedoch ein zusätzliches Hin und Her zwischen Server und Client erforderlich.
quelle
quelle
SendRedirect()
durchsucht den Inhalt zwischen den Servern. Es ist langsam, weil es den Browser durch Senden der URL des Inhalts intimieren muss. Der Browser erstellt dann eine neue Anforderung für den Inhalt auf demselben oder einem anderen Server.RquestDispatcher
ist für die Suche nach Inhalten auf dem Server, denke ich. Es ist der serverseitige Prozess und im Vergleich zurSendRedirect()
Methode schneller . Die Sache ist jedoch, dass der Browser, auf dem der Server das erforderliche Datum oder den gewünschten Inhalt durchsucht, nicht informiert wird und der Browser auch nicht aufgefordert wird, die URL auf der Registerkarte URL zu ändern. Dies verursacht dem Benutzer nur geringe Unannehmlichkeiten.quelle
Die technische Umleitung sollte entweder verwendet werden, wenn die Kontrolle auf eine andere Domäne übertragen werden muss oder um eine Aufgabentrennung zu erreichen.
Zum Beispiel führen wir in der Zahlungsanwendung zuerst den PaymentProcess aus und leiten dann zu displayPaymentInfo um. Wenn der Client den Browser aktualisiert, wird nur die displayPaymentInfo erneut ausgeführt und PaymentProcess wird nicht wiederholt. Wenn wir in diesem Szenario jedoch Forward verwenden, werden sowohl PaymentProcess als auch displayPaymentInfo nacheinander erneut ausgeführt, was zu inkonsistenten Daten führen kann.
In anderen Szenarien ist die Weiterleitung effizient, da sie schneller als sendRedirect ist
quelle
Request Dispatcher ist eine Schnittstelle, über die die Anforderung oder Antwort von der Webressource an eine andere Webressource gesendet wird. Es enthält hauptsächlich zwei Methoden.
request.forward(req,res)
: Diese Methode wird verwendet, um die Anforderung von einer Webressource an eine andere Ressource weiterzuleiten. dh von einem Servlet zu einem anderen Servlet oder von einer Webanwendung zu einer anderen Webanwendung.response.include(req,res)
: Diese Methode umfasst die Antwort eines Servlets auf ein anderes ServletHINWEIS: Mit dem Request Dispatcher können wir die Anfrage oder die Antworten auf demselben Server weiterleiten oder einschließen.
request.sendRedirect()
: Auf diese Weise können wir die Anfrage oder Antworten auf den verschiedenen Servern weiterleiten oder einschließen. In diesem Fall erhält der Client eine Umleitung, während er die Seite umleitet. Im obigen Prozess erhält der Client jedoch keine Andeutungquelle
Einfach Unterschied zwischen
Forward(ServletRequest request, ServletResponse response)
undsendRedirect(String url)
istnach vorne():
forward()
Methode wird serverseitig ausgeführt.forward ()
Methode vom Servlet-Container bereitgestellt wird.forward()
Methode ist schneller als diesendRedirect()
Methode.RequestDispatcher
Schnittstelle deklariert .sendRedirect ():
quelle