Jaka jest koncepcyjna różnica między forward()
i sendRedirect()
?
requestDispatcher - metoda forward ()
Kiedy używamy tej
forward
metody, żądanie jest przesyłane do innego zasobu na tym samym serwerze w celu dalszego przetwarzania.W przypadku
forward
kontenera WWW całe przetwarzanie obsługuje wewnętrznie, a klient ani przeglądarka nie są zaangażowani.Kiedy
forward
jest wywoływany narequestDispatcher
obiekcie, przekazujemy obiekty żądania i odpowiedzi, więc nasz stary obiekt żądania jest obecny w nowym zasobie, który będzie przetwarzał nasze żądanie.Wizualnie nie widzimy przekierowanego adresu, jest przejrzysty.
Korzystanie z tej
forward()
metody jest szybsze niżsendRedirect
.Kiedy przekierowujemy za pomocą forward i chcemy użyć tych samych danych w nowym zasobie, możemy użyć
request.setAttribute()
dostępnego obiektu żądania.SendRedirect
W przypadku
sendRedirect
żądania przesyłane jest do innego zasobu, do innej domeny lub do innego serwera w celu dalszego przetwarzania.Kiedy używasz
sendRedirect
, kontener przekazuje żądanie do klienta lub przeglądarki, więc adres URL podany wsendRedirect
metodzie jest widoczny jako nowe żądanie dla klienta.W przypadku
sendRedirect
wywołania stare obiekty żądań i odpowiedzi są tracone, ponieważ są one traktowane przez przeglądarkę jako nowe żądanie.Na pasku adresu możemy zobaczyć nowy przekierowany adres. To nie jest przejrzyste.
sendRedirect
jest wolniejszy, ponieważ wymagana jest jedna dodatkowa podróż w obie strony, ponieważ tworzone jest zupełnie nowe żądanie, a stary obiekt żądania zostaje utracony. Wymagane są dwa żądania przeglądarki.Ale
sendRedirect
jeśli chcemy użyć tych samych danych dla nowego zasobu, musimy je przechowywać w sesji lub przekazać wraz z adresem URL.Który jest dobry?
Zależy to od scenariusza, w którym metoda jest bardziej użyteczna.
Jeśli chcesz, aby kontrola została przeniesiona na nowy serwer lub kontekst i jest traktowana jako zupełnie nowe zadanie, to idziemy
sendRedirect
. Ogólnie rzecz biorąc, należy użyć przekazywania dalej, jeśli operację można bezpiecznie powtórzyć po ponownym załadowaniu strony internetowej w przeglądarce i nie wpłynie to na wynik.
W świecie tworzenia stron internetowych termin „przekierowanie” oznacza wysłanie do klienta pustej odpowiedzi HTTP z tylko Location
nagłówkiem zawierającym nowy adres URL, do którego klient musi wysłać zupełnie nowe żądanie GET. Więc w zasadzie:
some.jsp
.Location: other.jsp
nagłówkiemother.jsp
(jest to odzwierciedlone w pasku adresu przeglądarki!)other.jsp
.Możesz go śledzić za pomocą wbudowanego / dodatkowego zestawu narzędzi programistycznych przeglądarki internetowej. Naciśnij klawisz F12 w przeglądarce Chrome / IE9 / Firebug i sprawdź sekcję „Sieć”, aby ją zobaczyć.
Dokładnie to osiąga sendRedirect("other.jsp")
. RequestDispatcher#forward()
Nie wysyła przekierowanie. Zamiast tego używa zawartości strony docelowej jako odpowiedzi HTTP.
some.jsp
.other.jsp
.Jednak zgodnie z pierwotnym żądaniem HTTP some.jsp
adres URL w pasku adresu przeglądarki pozostaje niezmieniony. Ponadto wszystkie atrybuty żądań ustawione w kontrolerze z tyłu some.jsp
będą dostępne w other.jsp
. Nie dzieje się tak podczas przekierowania, ponieważ w zasadzie zmuszasz klienta do utworzenia nowego żądania HTTP other.jsp
, w ten sposób wyrzucając pierwotne żądanie, some.jsp
włączając wszystkie jego atrybuty.
Jest RequestDispatcher
to niezwykle przydatne w paradygmacie MVC i / lub gdy chcesz ukryć strony JSP przed bezpośrednim dostępem. Możesz umieścić strony JSP w /WEB-INF
folderze i użyć Servlet
kontrolki, która kontroluje, wstępnie przetwarza i postprocesuje żądania. Strony JSP w /WEB-INF
folderze nie są bezpośrednio dostępne przez adres URL, ale Servlet
można uzyskać do nich dostęp za pomocą RequestDispatcher#forward()
.
Można na przykład mieć plik JSP w /WEB-INF/login.jsp
a LoginServlet
która jest odwzorowywane na url-pattern
od /login
. Po wywołaniu zostanie wywołany http://example.com/context/login
serwlet doGet()
. Możesz tam wykonać dowolne czynności wstępne i na koniec przesłać żądanie, takie jak:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Przesyłając formularz, zwykle chcesz użyć POST
:
<form action="login" method="post">
W ten sposób serwlet doPost()
zostanie wywołany i będziesz mógł tam wykonać dowolne czynności post- processingu (np. Walidacja, logika biznesowa, logowanie użytkownika itp.).
Jeśli są jakieś błędy, zwykle chcesz przekazać żądanie z powrotem na tę samą stronę i wyświetlić błędy tam obok pól wejściowych i tak dalej. Możesz użyć RequestDispatcher
do tego.
Jeśli operacja POST
się powiedzie, zwykle chcesz przekierować żądanie, aby żądanie nie zostało przesłane ponownie, gdy użytkownik odświeży żądanie (np. Naciskając klawisz F5 lub przechodząc z powrotem do historii).
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.
}
W ten sposób przekierowanie instruuje klienta, aby uruchomił nowe GET
żądanie pod podanym adresem URL. Odświeżenie żądania spowoduje wtedy tylko odświeżenie przekierowanego żądania, a nie pierwotnego żądania. Pozwoli to uniknąć „podwójnych zgłoszeń”, zamieszania i złych wrażeń użytkowników. Nazywa się to również POST-Redirect-GET
wzorem .
response.sendRedirect("..")
przechodzę do strony index.jsp serwisu WWW. Ale to pomija pliki css i część tekstu ze strony jsp, co prowadzi do częściowego załadowania strony. Ale kiedy ustawię stronę powitalną witryny jako index.jsp, wszystko działa dobrze i strona ładuje się zakończona. co jest nie tak z przekierowaniem?RequestDispatcher
Interfejs pozwala zrobić po stronie serwera do przodu / include natomiastsendRedirect()
robi przekierowanie po stronie klienta. W przypadku przekierowania po stronie klienta serwer odeśle kod statusu HTTP302
(przekierowanie tymczasowe), co powoduje, że przeglądarka internetowa wysyła zupełnie noweGET
żądanie HTTP dla treści w przekierowanej lokalizacji. Natomiast w przypadku korzystania zRequestDispatcher
interfejsu dołączanie / przesyłanie dalej do nowego zasobu jest obsługiwane całkowicie po stronie serwera.źródło
forward
nie jest przekierowaniem.źródło
Każda z tych metod może być „lepsza”, tj. Bardziej odpowiednia, w zależności od tego, co chcesz zrobić.
Przekierowanie po stronie serwera jest szybsze, o ile otrzymujesz dane z innej strony bez przechodzenia w obie strony do przeglądarki. Ale adres URL widoczny w przeglądarce jest nadal pierwotnym adresem, więc tworzysz tam małą niespójność.
Przekierowanie po stronie klienta jest bardziej wszechstronne, ponieważ może wysłać Cię na zupełnie inny serwer, zmienić protokół (np. Z HTTP na HTTPS) lub jedno i drugie. Przeglądarka rozpoznaje nowy adres URL. Jednak między serwerem a klientem wymagana jest dodatkowa operacja.
źródło
SendRedirect()
przeszuka zawartość między serwerami. jest powolny, ponieważ musi ingerować w przeglądarkę, wysyłając adres URL treści. przeglądarka utworzy nowe żądanie treści na tym samym lub innym serwerze.RquestDispatcher
jest do wyszukiwania treści na serwerze. jest to proces po stronie serwera i jest szybszy w porównaniu doSendRedirect()
metody. ale chodzi o to, że nie będzie intymne z przeglądarką, w której serwerze szuka wymaganej daty lub treści, ani nie poprosi przeglądarki o zmianę adresu URL w zakładce URL. więc powoduje niewielkie niedogodności dla użytkownika.źródło
Z technicznego punktu widzenia przekierowanie powinno być używane albo wtedy, gdy musimy przenieść kontrolę do innej domeny, albo w celu uzyskania rozdzielenia zadań.
Na przykład w aplikacji płatniczej najpierw wykonujemy PaymentProcess, a następnie przekierowujemy do displayPaymentInfo. Jeśli klient odświeży przeglądarkę, tylko wyświetlenie informacji o płatnościach zostanie wykonane ponownie, a proces płatności nie zostanie powtórzony. Ale jeśli w tym scenariuszu użyjemy forward, zarówno PaymentProcess, jak i displayPaymentInfo zostaną ponownie wykonane sekwencyjnie, co może spowodować niespójność danych.
W innych scenariuszach forward jest efektywny w użyciu, ponieważ jest szybszy niż sendRedirect
źródło
Dyspozytor żądań to interfejs używany do wysyłania żądania lub odpowiedzi z zasobu internetowego do innego zasobu sieciowego. Zawiera głównie dwie metody.
request.forward(req,res)
: Ta metoda służy do przekazywania żądania z jednego zasobu sieciowego do innego zasobu. tj. z jednego serwletu do innego serwletu lub z jednej aplikacji internetowej do innej aplikacji internetowej.response.include(req,res)
: Ta metoda jest używana do uwzględniania odpowiedzi jednego serwletu na inny apletUWAGA: Korzystając z Request Dispatcher, możemy przekazać lub dołączyć żądanie lub odpowiedzi na tym samym serwerze.
request.sendRedirect()
: Używając tego, możemy przekazać lub dołączyć żądanie lub odpowiedzi na różnych serwerach. W tym przypadku klient otrzymuje powiadomienie podczas przekierowywania strony, ale w powyższym procesie klient nie otrzyma powiadomieniaźródło
Po prostu różnica między
Forward(ServletRequest request, ServletResponse response)
isendRedirect(String url)
jestNaprzód():
forward()
Metoda jest wykonywany po stronie serwera.forward ()
metoda jest udostępniana przez kontener serwletów.forward()
Metoda jest szybsza niżsendRedirect()
metody.RequestDispatcher
interfejsie.sendRedirect ():
źródło