Відповіді:
requestDispatcher - метод переходу ()
Коли ми використовуємо
forward
метод, запит переноситься на інший ресурс у межах того ж сервера для подальшої обробки.У випадку
forward
веб-контейнера обробляє всю обробку внутрішньо, і клієнт чи браузер не задіяні.Коли
forward
викликаєтьсяrequestDispatcher
об'єкт, ми передаємо об'єкти запиту та відповіді, тому наш старий об’єкт запиту присутній на новому ресурсі, який збирається обробити наш запит.Візуально ми не в змозі побачити перенаправлену адресу, вона прозора.
Використання
forward()
методу швидше, ніжsendRedirect
.Коли ми переспрямовуємо за допомогою переадресації та хочемо використовувати ті самі дані на новому ресурсі, ми можемо використовувати,
request.setAttribute()
оскільки у нас є об’єкт запиту.SendRedirect
У випадку
sendRedirect
запит передається на інший ресурс, на інший домен або на інший сервер для подальшої обробки.Під час використання
sendRedirect
контейнер передає запит клієнту чи браузеру, тому URL-адреса, вказана всерединіsendRedirect
методу, буде видно як новий запит для клієнта.У разі
sendRedirect
виклику старі об’єкти запиту та відповіді втрачаються, оскільки браузер трактує як новий запит.В адресному рядку ми можемо побачити нову перенаправлену адресу. Це не прозоро.
sendRedirect
повільніше, тому що потрібна одна додаткова поїздка, тому що створюється абсолютно новий запит і старий об’єкт запиту втрачається. Потрібно два запити браузера.Але в тому
sendRedirect
випадку, якщо ми хочемо використовувати ті самі дані для нового ресурсу, ми повинні зберігати їх у сеансі або передавати разом з URL-адресою.Який із них хороший?
Це залежить від сценарію, який метод є більш корисним.
Якщо ви хочете, щоб управління було перенесенням на новий сервер або контекст, і це трактується як абсолютно нове завдання, тоді ми переходимо до цього
sendRedirect
. Як правило, слід використовувати переадресацію, якщо операцію можна буде безпечно повторити після перезавантаження веб-сторінки веб-сторінкою і не вплине на результат.
У світі веб-розробок термін "переадресація" - це акт надсилання клієнту порожньої відповіді HTTP із лише Location
заголовком, що містить нову URL-адресу, на яку клієнт повинен надіслати абсолютно новий GET-запит. Так в основному:
some.jsp
.Location: other.jsp
заголовкомother.jsp
це (це відображається в адресному рядку браузера!)other.jsp
.Ви можете відстежувати це за допомогою вбудованого / допоміжного набору для розробників веб-браузера. Натисніть F12 у Chrome / IE9 / Firebug та перевірте розділ "Мережа", щоб побачити це.
Саме вищезазначене досягається шляхом sendRedirect("other.jsp")
. RequestDispatcher#forward()
Чи не посилає редирект. Натомість він використовує вміст цільової сторінки як відповідь HTTP.
some.jsp
.other.jsp
.Однак, як і було оригінальним запитом HTTP some.jsp
, URL-адреса в адресному рядку браузера залишається незмінною. Також будь-які атрибути запиту, встановлені в контролері позаду, some.jsp
будуть доступні в other.jsp
. Це не відбувається під час переадресації, оскільки ви змушуєте клієнта створювати новий HTTP-запит other.jsp
, тим самим викидаючи оригінальний запит, some.jsp
включаючи всі його атрибути.
Це RequestDispatcher
надзвичайно корисно в парадигмі MVC та / або коли ви хочете приховати JSP від прямого доступу. Ви можете помістити JSP в /WEB-INF
папку і використовувати a, Servlet
який контролює, попередньо обробляє та виконує запити. JSP в /WEB-INF
папці не доступні безпосередньо за URL-адресою, але Servlet
до них можна отримати доступ RequestDispatcher#forward()
.
Ви можете, наприклад , мати файл JSP в /WEB-INF/login.jsp
і , LoginServlet
який перетворюється за принципом url-pattern
з /login
. Коли ви викликаєте http://example.com/context/login
, тоді doGet()
буде викликано сервлет . Ви можете зробити будь-яку попередню обробку матеріалів там і, нарешті, переслати запит на зразок:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Надсилаючи форму, ви зазвичай хочете використовувати POST
:
<form action="login" method="post">
Таким чином doPost()
буде викликано сервлет, і ви можете виконувати будь-які матеріали після обробки даних (наприклад, перевірку, ділову логіку, вхід користувача тощо).
Якщо є якісь помилки, зазвичай ви хочете переслати запит назад на ту саму сторінку і відобразити там помилки поруч із полями введення тощо. Ви можете використовувати RequestDispatcher
для цього.
Якщо POST
успіх a , ви хочете перенаправити запит, щоб запит не був повторно поданий, коли користувач оновить запит (наприклад, натискаючи F5 або повертаючись назад в історію).
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.
}
Таким чином, переадресація вказує клієнту GET
надіслати новий запит за вказаною URL-адресою. Оновлення запиту тоді оновить лише перенаправлений запит, а не початковий. Це дозволить уникнути "подвійних подань" та плутанини та поганого досвіду користувача. Це також називається POST-Redirect-GET
візерунком .
RequestDispatcher
Інтерфейс дозволяє виконувати на стороні сервера вперед / включають в той час як sendRedirect()
робить на стороні клієнта перенаправлення. У випадку переадресації на стороні клієнта сервер відправить назад код статусу HTTP 302
(тимчасове переадресація), через який веб-браузер видає абсолютно новий HTTP- GET
запит на вміст у перенаправленому місці. На відміну від цього, при використанні RequestDispatcher
інтерфейсу включення / пересилання на новий ресурс обробляється повністю на стороні сервера.
forward
, а не перенаправлення.
Основна важлива відмінність між методом forward () та sendRedirect () полягає в тому, що у випадку forward () перенаправлення відбувається на кінці сервера і не видно клієнтові, але у випадку sendRedirect () перенаправлення відбувається на кінці клієнта, і це видно клієнту.
Будь-який із цих методів може бути "кращим", тобто більш підходящим, залежно від того, що ви хочете зробити.
Перенаправлення на сторону сервера відбувається швидше, наскільки ви отримуєте дані з іншої сторінки, не здійснюючи зворотну поїздку до браузера. Але URL-адреса, переглянута у веб-переглядачі, все ще є оригінальною адресою, тому ви створюєте там трохи непослідовність.
Перенаправлення на стороні клієнта є більш універсальним, оскільки воно може відправити вас на зовсім інший сервер, або змінити протокол (наприклад, з HTTP на HTTPS), або на обидва. І браузер знає про нову URL-адресу. Але це вимагає додаткового зворотного руху між сервером і клієнтом.
SendRedirect()
буде шукати вміст між серверами. це повільно, оскільки він повинен інтимувати браузер, надсилаючи URL-адресу вмісту. тоді браузер створить новий запит на вміст на тому ж сервері або на іншому.
RquestDispatcher
для пошуку вмісту на сервері, я думаю. його процес на стороні сервера, і він швидше порівняти з SendRedirect()
методом. але річ у тому, що він не інтимує браузер, на якому сервері він шукає потрібну дату чи вміст, а також не попросить браузера змінити URL-адресу на вкладці URL. тому це доставляє невеликі незручності користувачеві.
Технічно переадресацію слід використовувати, або якщо нам потрібно перенести управління в інший домен, або досягти розділення завдання.
Наприклад, у програмі платежів ми спочатку робимо PaymentProcess, а потім перенаправляємо на displayPaymentInfo. Якщо клієнт оновить веб-переглядач, знову буде виконано displayPaymentInfo, і PaymentProcess не повториться. Але якщо ми будемо використовувати в цьому сценарії вперед, і PaymentProcess, і displayPaymentInfo будуть повторно виконуються послідовно, що може призвести до невідповідних даних.
В інших сценаріях форвард ефективний для використання, оскільки він швидший, ніж sendRedirect
Диспетчер запитів - це інтерфейс, який використовується для відправки запиту чи відповіді з веб-ресурсу на інший веб-ресурс. Він містить в основному два способи.
request.forward(req,res)
: Цей метод використовується для пересилання запиту з одного веб-ресурсу на інший ресурс. тобто від одного сервлета до іншого сервлета або від однієї веб-програми до іншої веб-програми.
response.include(req,res)
: Цей метод використовується, включаючи відповідь одного сервлета на інший сервлет
ПРИМІТКА. Використовуючи диспетчер запитів, ми можемо пересилати або включати запит або відповіді на одному сервері.
request.sendRedirect()
: Використовуючи це, ми можемо пересилати або включати запит або відповіді на різних серверах. У цьому випадку клієнт отримує запит під час перенаправлення сторінки, але у вищеописаному процесі клієнт не отримає залякування
Просто різниця між Forward(ServletRequest request, ServletResponse response)
і sendRedirect(String url)
є
вперед ():
forward()
Метод виконується на стороні сервера.forward ()
метод надається контейнером сервлетів.forward()
Метод швидше , ніжsendRedirect()
метод.RequestDispatcher
інтерфейсі.sendRedirect ():
response.sendRedirect("..")
сторінку index.jsp веб-сайту. Але це пропускає файли css та деякий текст зі сторінки jsp, що призводить до часткового завантаження сторінки. Але коли я роблю, щоб привітальна сторінка веб-сайту була index.jsp, все працює нормально і завантаження сторінок завершено. що не так з перенаправленням?