Топ-100Redirect, forward, include в сервлетах - CodOrbits
LogoCodOrbits

Раздел: Servlets

Познакомьтесь с сервлетами Java: создание динамических веб-страниц и работа с HTTP-запросами и ответами.

Все разделы
Иконка Servlets

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

Last updated: 9 мая 2025 г.

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

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

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

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

1import java.io.IOException;
2import java.io.PrintWriter;
3
4import javax.servlet.ServletException;
5import javax.servlet.http.HttpServlet;
6import javax.servlet.http.HttpServletRequest;
7import javax.servlet.http.HttpServletResponse;
8import javax.servlet.annotation.*;
9
10@WebServlet("/redirservlet")
11public class MyServlet extends HttpServlet{
12    protected void doGet(HttpServletRequest req,
13                         HttpServletResponse resp)
14            throws ServletException, IOException{
15        //сервер указывает браузеру клиента перейти по ссылке
16        resp.sendRedirect("https://google.com");
17    }
18}

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

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


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

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

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

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

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

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

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

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

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

1import java.io.IOException;
2import java.io.PrintWriter;
3
4import javax.servlet.ServletException;
5import javax.servlet.http.HttpServlet;
6import javax.servlet.http.HttpServletRequest;
7import javax.servlet.http.HttpServletResponse;
8import javax.servlet.RequestDispatcher;
9import javax.servlet.annotation.*;
10
11@WebServlet("/forwardservlet")
12public class MyServlet extends HttpServlet{
13    protected void doGet(HttpServletRequest req,
14                         HttpServletResponse resp)
15                         throws ServletException, IOException{
16        //В getRequestDispatcher передаем адрес сервлета
17        //на этом сервере куда будет происходить переход
18        //из текущего сервлета.
19        RequestDispatcher rd = req.getRequestDispatcher("/myservlet");
20        //передаем в сервлет myservlet req и resp
21        //текущего сервлета и вызываем его.
22        rd.forward(req, resp);
23    }
24}

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

1import java.io.IOException;
2import java.io.PrintWriter;
3
4import javax.servlet.ServletException;
5import javax.servlet.http.HttpServlet;
6import javax.servlet.http.HttpServletRequest;
7import javax.servlet.http.HttpServletResponse;
8import javax.servlet.annotation.*;
9
10@WebServlet("/myservlet")
11public class MyServlet1 extends HttpServlet{
12    protected void doGet(HttpServletRequest req,
13                         HttpServletResponse resp)
14            throws ServletException, IOException{
15        PrintWriter pw = resp.getWriter();
16        pw.write("Hello World!!!");
17    }
18}

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

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

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


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

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

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

1import java.io.IOException;
2import java.io.PrintWriter;
3
4import javax.servlet.ServletException;
5import javax.servlet.http.HttpServlet;
6import javax.servlet.http.HttpServletRequest;
7import javax.servlet.http.HttpServletResponse;
8import javax.servlet.RequestDispatcher;
9import javax.servlet.annotation.*;
10
11@WebServlet("/includeservlet")
12public class MyServlet extends HttpServlet {
13    protected void doGet(HttpServletRequest req,
14                         HttpServletResponse resp)
15            throws ServletException, IOException {
16        PrintWriter pw = resp.getWriter();
17        pw.println("<html>" +
18                "<head></head>" +
19                "<body>" +
20                "<h1>Hello world form includeservlet</h1>" +
21                "</body>" +
22                "</html>");
23        RequestDispatcher rd = req.getRequestDispatcher("/myservlet");
24        //передаем в сервлет myservlet req и resp
25        //текущего сервлета и вставляем его в текущий сервлет
26        rd.include(req, resp);
27    }
28}

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

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


Следующие уроки

Работа с Cookies в Java

14
мин.

Similar Articles Icon
Divider

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

14
мин.

Similar Articles Icon
Divider

Интерфейс ServletContext

15
мин.

Similar Articles Icon