Разница между include и forward механизмом для концепции отправки запросов?
Forward (): это можно сделать двумя способами по запросу & ServeletContext. Пересылка запроса с сервлета на другой ресурс (сервлет, JSP файл или HTML-файл) на сервере. Форвард делается на на стороне сервера, без ведома клиента.
при вызове прямого запроса запрос отправляется в другой ресурс на сервере, без уведомления клиента что другой ресурс будет обрабатывать запрос. Этот процесс происходит полностью с web-контейнер.
просто
include: будет включать другой файл в наш текущий файл
forward: будет пересылать текущий запрос на страницу пересылки
4 ответов
основное отличие заключается в том, что при использовании вперед элемент управления передается на следующий вызываемый сервлет / jsp, в то время как включить сохраняет элемент управления с текущим сервлетом, он просто включает обработку, выполняемую вызывающим сервлетом / jsp(например, выполнение любого из них.println или другая обработка).
разница между двумя тегами заключается в том, как они работают. Ну, я приведите пример, чтобы лучше его представить.
Предположим, у вас есть две страницы, pageA и pageB. В pageA вы написали тег include. В этом случае элемент управления находился в pageA, пока вы не вызвали тег include. При этом момент полный контроль переходит к а. Когда это сделано, контроль возвращается к pageA начиная со следующей точки кодирования после тега include и продолжая остальные Пейджа.
ну, чтобы получить вещи гораздо яснее, скажем, что у нас есть те же страницы, pageA и pageB, но на этот раз мы будем использовать тег forward в pageA, а не include метка. Опять же, управление начнется в pageA, пока мы не вызовем передний тег в pageA, в этот момент, управление передается на pageB, так же, как тег include. Но разница в том, что происходит, когда а завершает. В случае прямого тэг, контроль больше не вернется в Пейджу.
включить(запрос, ответ);
если ресурс статический, метод include включает программное серверное включение. Если ресурс является веб-компонентом, эффект метода состоит в том, чтобы отправить запрос включенному веб-компоненту, выполнить веб-компонент, а затем включить результат выполнения в ответ от содержащего сервлета.
включить веб-компонент имеет доступ к объекту запроса, но ограничен в том, что он может сделать с объектом ответа.
- он может написать в тело ответа и зафиксировать ответ.
- он не может установить заголовки или вызвать какой-либо метод, например setCookie, который влияет на заголовки ответа.
часто бывает полезно включить другой веб-ресурс, например содержимое баннера или информацию об авторских правах) в ответ, возвращаемый веб-компонентом.
вперед(по запросу, ответ);
в некоторых приложениях может потребоваться, чтобы один веб-компонент выполнял предварительную обработку запроса, а другой компонент генерировал ответ. Например, может потребоваться частично обработать запрос, а затем перенести его на другой компонент в зависимости от характера запроса.
чтобы передать управление другому веб-компоненту, вызывается метод forward RequestDispatcher. Когда запрос пересылается, URL-адрес запроса устанавливается в путь пересылаемой страницы. Исходный URI и его составные части сохраняются как атрибуты запроса.
javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]
метод forward следует использовать, чтобы дать другому ресурсу ответственность за ответ пользователю. Если вы уже получили доступ к ServletOutputStream или PrintWriter объект в сервлете, вы не можете использовать этот метод, так как создает IllegalStateException.
ссылки по теме
ключевое различие между этими двумя является то, что метод forward () закроет выходной поток после его вызова, а включить способ оставляет поток открытым.
ответ с примером : давайте страницу сервлет имени xxx.java и страницы JSP имени гг.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()
invocation, выход консоли будет генерироваться в каждом случае.его об ответ клиенту
Итак, основная часть если мы обрабатываем в компоненте на стороне сервера, а затем пересылаем JSP или сервлет для генерации разметки для клиента, как только этот JSP или сервлет закончит обработку, мы больше не можем вызывать любые другие компоненты для генерации разметки, которая может быть отправлено клиенту. Как только мы выполнили переадресацию, генерация разметки для текущего цикла запроса и ответа законченный.
кроме того, с include выходной поток остается открытым, поэтому мы можем вызвать столько разных файлов для создания разметки на стороне клиента, которая нам нужна. Таким образом, мы можем включить два или три файла JSP и даже сервлет в цепочку компонентов, которые генерируют клиентскую разметку. Когда мы используем include, выходной поток не закрывается после вызова.