Разница между механизмом включения и пересылки для концепции диспетчеризации запросов? - PullRequest
40 голосов
/ 24 февраля 2012

Forward (): это можно сделать двумя способами: Request & ServeletContext.Перенаправление запроса от сервлета на другой ресурс (сервлет, файл JSP или файл HTML) на сервере.Пересылка выполняется на стороне сервера, без ведома клиента.

Когда вы вызываете запрос пересылки, запрос отправляется на другой ресурс на сервере, при этом клиенту не сообщается, что другой ресурс будет обрабатыватьзапрос.Этот процесс полностью выполняется в веб-контейнере.

Просто

include: включит другой файл в текущий файл

forward: перенаправит текущий запрос на страницу пересылки

Ответы [ 4 ]

63 голосов
/ 14 декабря 2012

Разница между двумя тегами заключается в том, как они работают.Хорошо, я приведу пример, чтобы вы могли представить его лучше.

Предположим, у вас есть две страницы, pageA и pageB.На странице А вы написали тег включения.В этом случае элемент управления находился на странице, пока вы не назвали тег включения.В этот момент полный контроль переходит на страницу B.Когда все готово, управление возвращается на страницу A, начиная со следующей точки кодирования после тега include и продолжая до остальной части страницы A.

Что ж, чтобы все стало более понятным, скажем, что у нас одни и те же страницы, pageA и pageB, но на этот раз мы будем использовать тег forward в pageA, а не тег include.Опять же, элемент управления будет начинаться на странице A до тех пор, пока мы не вызовем тэг forward на странице A, в этот момент элемент управления передается на страницу B, как и тег include.Но разница в том, что происходит, когда завершается страница BВ случае тега пересылки элемент управления больше не возвращается на страницу A.

32 голосов
/ 24 февраля 2012

Основное отличие состоит в том, что когда вы используете forward , управление передается следующему сервлету / jsp, который вы вызываете, в то время как include сохраняет управление с текущим сервлетом, оно простовключает обработку, выполняемую вызывающим сервлетом / jsp (как, например, выполнение любой out.println или другой обработки).

26 голосов
/ 28 ноября 2013

include (запрос, ответ);

Если ресурс статический, метод include включает программные включения на стороне сервера.Если ресурс является веб-компонентом, эффект метода состоит в том, чтобы отправить запрос включенному веб-компоненту, выполнить веб-компонент, а затем включить результат выполнения в ответ от содержащего сервлета.

Включенный веб-компонент имеет доступ к объекту запроса, но ограничен в том, что он может делать с объектом ответа.

  • Он может записывать в тело ответаи зафиксируйте ответ.
  • Он не может устанавливать заголовки или вызывать какие-либо методы, например setCookie, которые влияют на заголовки ответа.

Часто полезно включить другой веб-ресурс(например, содержание баннера или информация об авторских правах) в ответе, возвращенном веб-компонентом.

forward (запрос, ответ);

В некоторых приложенияхВозможно, вы захотите, чтобы один веб-компонент выполнял предварительную обработку запроса, а другой компонент генерировал ответ.Например, вы можете захотеть частично обработать запрос, а затем перенести его в другой компонент, в зависимости от характера запроса.

Чтобы передать управление другому веб-компоненту, вы вызываете метод forward класса RequestDispatcher.Когда запрос пересылается, URL-адрес запроса устанавливается на путь перенаправленной страницы.Исходный URI и его составные части сохраняются как атрибуты запроса.

javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]  

Следует использовать метод пересылки, чтобы дать другому ресурсу ответственность за ответ пользователю.Если вы уже получили доступ к объекту ServletOutputStream или PrintWriter внутри сервлета, вы не можете использовать этот метод;при этом выдается IllegalStateException .

Ссылки по теме

8 голосов
/ 07 июня 2016

Основное различие между ними заключается в том, что метод forward () ЗАКРЫВАЕТ выходной поток после его вызова, в то время как метод include оставляет выходной поток ОТКРЫТЫМ.

отвечая на пример: давайте иметь страницу сервлета с именем xxx.java и страницу jsp с именем yy.jsp

В yy.jsp

WELCOME to yy.jsp

В xxx.java // используется forward ()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.forward(request,response); out.println("back to servlet"); //this wont b displayed

выход

WELCOME to yy.jsp 

В xxx.java // используется include ()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.include(request,response); out.println("back to servlet");

выход

WELCOME to yy.jsp back to servlet

НО БОЛЬШЕ ВАЖНО, О НЕ УПРАВЛЕНИИ, ПОТОМУ ЧТО, ЕСЛИ МЫ ПОСТАВЛЯЕМ

System.out.println("console output");

после любого из вызовов .forward() или .include() вывод консоли будет генерироваться в каждом случае. Это ответ клиента

Итак, основная часть если мы обрабатываем компонент на стороне сервера, а затем пересылаем его в JSP или сервлет, чтобы сгенерировать разметку для клиента, после того как JSP или сервлет завершил обработку, мы больше не можем вызывать какие-либо другие компоненты для генерации разметки, которая может быть отправлено клиенту. Как только мы выполнили пересылку, генерация разметки для текущего цикла запроса и ответа завершена.

В качестве альтернативы, при включении выходной поток остается открытым, поэтому мы можем вызвать столько разных файлов, чтобы сгенерировать разметку на стороне клиента, которая нам нужна. Таким образом, мы можем включить два или три файла JSP и даже сервлет в цепочку компонентов, которые генерируют разметку на основе клиента. Когда мы используем включение, выходной поток не закрывается после вызова.

...