Redirect, forward, include в Java-сервлетах

Рассмотрим переход на другую страницу с помощью sendRedirect()

sendRedirect()перенаправляет на любой указанный аргументом адрес.

Адрес в адресной строке браузера клиента меняется на тот, что указан аргументом у метода, так как сервер указывает клиенту, что нужно перейти по этому адресу и браузер переходит по нему.

Пример программы:

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.*; @WebServlet(“/redirservlet”) public class MyServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ //сервер указывает браузеру клиента перейти по ссылке resp.sendRedirect(“https://google.com”); } }

Скомпилируем файл и в адресной строке перейдем по адрусу /redirservlet.

Как видим сервлет сказал браузеру клиента перейти по ссылке https://google.com и он перешел.


Переход на другую страницу с помощью forward()

forward()вызывает любой другой ресурс (другой сервлет, jsp) на этом же сервере.

Адресная строка браузера клиента при таком переходе не меняется. У клиента может поменяться страница, но клиент понятия не имеет куда его перенаправило в плане адреса, так как перенаправление произошло на сервере.

Также этот метод полезен тем, что аргументами ему передаются req и resp ресурса, из которого происходит перенаправление forward(req, resp).

То есть между сервлетами сервера можно передавать одни и те же req и resp.

Также forward понятное дело быстрее чем sendRedirect, так как он не передает никаких адресов клиенту чтобы он по ним переходил.

Все переходы происходят на сервере.

Давайте создадим еще один простенький сервлет MyServlet1.java, к которому будет происходить переход.

Этот сервлет выглядит так:

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; import javax.servlet.annotation.*; @WebServlet(“/forwardservlet”) public class MyServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ //В getRequestDispatcher передаем адрес сервлета //на этом сервере куда будет происходить переход //из текущего сервлета. RequestDispatcher rd = req.getRequestDispatcher(“/myservlet”); //передаем в сервлет myservlet req и resp //текущего сервлета и вызываем его. rd.forward(req, resp); } }

Сервлет же, из которого будет совершаться переход, выглядит так:

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.*; @WebServlet(“/myservlet”) public class MyServlet1 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ PrintWriter pw = resp.getWriter(); pw.write(“Hello World!!!”); } }

Скомпилируем файлы сервлетов и в адресной строке перейдем по адрусу /forwardservlet.

Как видим, клиенту был отправлен текст Hello World!!!. И передал его клиенту очевидно сервлет MyServlet1.

Браузер клиента при этом не знает, что его куда-то перенаправили и даже адресная строка, как уже было сказано, не меняется (forwardservlet не измениться на myservlet).


Включение другой страницы в текущую с помощью include()

include – буквально просто включение кода другого сервлета на сервере в текущий сервлет с передачей req и resp текущего сервлета во включаемый сервлет.

Код сервлета MyServlet, в который будет включаться MyServlet1:

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; import javax.servlet.annotation.*; @WebServlet(“/includeservlet”) public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); pw.println(“” + “” + “” + “

Hello world form includeservlet

” + “” + ““); RequestDispatcher rd = req.getRequestDispatcher(“/myservlet”); //передаем в сервлет myservlet req и resp //текущего сервлета и вставляем его в текущий сервлет rd.include(req, resp); } }

Скомпилируем файлы сервлетов и в адресной строке перейдем по адресу /includeservlet.

На странице можно увидеть и “Hello world form includeservlet” из текущего сервлета и “Hello World!!!” из MyServlet1.

Работа с Cookies в Java

Cookies в Java: как сервер хранит данные в браузере клиента. Пример создания, отправки и чтения куков. Авторизация без повторного ввода логина и пароля. Методы getCookies, setPath.
Time to read: 14

Работа с сессиями (Session) в Java

Session в Java: как использовать сессии для хранения данных клиента. Пример работы с HttpSession, атрибутами и их применением в корзине интернет-магазина. Уникальный SESSIONID для каждого пользователя.
Time to read: 14

Интерфейс ServletContext

ServletContext — общий контекст для всего приложения. Узнайте, как хранить и получать данные через setAttribute/getAttribute, обмениваться атрибутами между сервлетами и работать с параметрами из web.xml.
Time to read: 15