Основное различие между ними заключается в том, что
метод 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 и даже сервлет в цепочку компонентов, которые генерируют разметку на основе клиента. Когда мы используем включение, выходной поток не закрывается после вызова.