Skip to content

Commit 3c92f2a

Browse files
committed
Added DispatcherServlet folder in the MVCPractice section of a small course on Java EE
1 parent 5bb09dd commit 3c92f2a

File tree

4 files changed

+168
-0
lines changed

4 files changed

+168
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package PartTwo.DispatcherServlet;
2+
3+
/* Сервлет для демонстрации редиректа в сервлетах */
4+
5+
import AirportSimulator.Service.FlightService;
6+
import jakarta.servlet.ServletException;
7+
import jakarta.servlet.annotation.WebServlet;
8+
import jakarta.servlet.http.HttpServlet;
9+
import jakarta.servlet.http.HttpServletRequest;
10+
import jakarta.servlet.http.HttpServletResponse;
11+
12+
import java.io.IOException;
13+
import java.io.PrintWriter;
14+
import java.nio.charset.StandardCharsets;
15+
16+
@WebServlet("/flights-demo-include-redirect")
17+
public class FlightDemoRedirectServlet extends HttpServlet {
18+
private final FlightService flightService = FlightService.getInstance();
19+
@Override
20+
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
21+
throws ServletException, IOException {
22+
resp.setContentType("text/html");
23+
resp.setCharacterEncoding(StandardCharsets.UTF_8.name());
24+
25+
/*
26+
В отличие от FlightServlet, тут мы убрали блок try-with-resources,
27+
а значит не закрыли исходящий поток и не прекратили запись в него,
28+
что позволил нам продолжить запись в исходящий поток в IncludeRedirect
29+
сервлете.
30+
31+
Если же мы оставили блок try-with-resources, то клиент уже получил бы
32+
response, т.к. исходящий поток был бы уже закрыт, хотя мы бы еще
33+
находились на стороне сервера. Браузер бы все равно отразил бы
34+
"список перелетов".
35+
36+
Естественно данные рассуждения немного не работают если в сервлете
37+
IncludeRedirect мы пропишем некую логику, обращенную к исходящему
38+
потоку еще до применения метода *.include()
39+
*/
40+
PrintWriter respPrintWriter = resp.getWriter();
41+
respPrintWriter.write("<h1>Список перелетов (из /flights-demo-include-redirect):</h1>");
42+
respPrintWriter.write("<ul>");
43+
flightService.findAll().forEach(flightDto -> {
44+
respPrintWriter.write("""
45+
<li>
46+
<a href="tickets-by-id?flightId=%d">%s</a>
47+
</li>
48+
""".formatted(flightDto.getId(), flightDto.getDescription()));
49+
});
50+
respPrintWriter.write("</ul>");
51+
}
52+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package PartTwo.DispatcherServlet;
2+
/*
3+
В случае применении Forward перенаправления, клиент не видит
4+
что происходи перенаправление на другой сервлет. Т.е. сначала
5+
клиент делает запрос на сервер к /dispatcher, тот в свою
6+
очередь, перенаправляет на FlightServlet и уже данный сервлет,
7+
формирует ответ серверу. И сервер возвращает response клиенту.
8+
9+
Запуск текущего сервлета исходя из моих настроек:
10+
http://localhost:8080/dispatcher-forward
11+
*/
12+
import jakarta.servlet.RequestDispatcher;
13+
import jakarta.servlet.ServletException;
14+
import jakarta.servlet.annotation.WebServlet;
15+
import jakarta.servlet.http.HttpServlet;
16+
import jakarta.servlet.http.HttpServletRequest;
17+
import jakarta.servlet.http.HttpServletResponse;
18+
19+
import java.io.IOException;
20+
21+
@WebServlet("/dispatcher-forward")
22+
public class ForwardRedirect extends HttpServlet {
23+
24+
@Override
25+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
26+
27+
/*
28+
Сервлет контекст знает про все сервлеты и их map-инги, поэтому мы можем
29+
применить вариант перенаправления с его участием:
30+
getServletContext().getRequestDispatcher().forward("req","resp");
31+
Либо использовать метод примененный ниже.
32+
*/
33+
RequestDispatcher myRequestRedirect = req.getRequestDispatcher("/flights-demo-include-redirect");
34+
/*
35+
Запрос 'req' пришедший от клиента на текущий сервлет мы перенаправляем.
36+
До тех пор, пока не был применен метод *.forward() мы можем добавить
37+
некие необходимые нам атрибуты в Request:
38+
req.setAttribute("some param","some param");
39+
*/
40+
myRequestRedirect.forward(req,resp);
41+
/*
42+
!!! В данной ситуации мы отправляем запрос другому сервлету
43+
и далее продолжает работу логика именно того сервлета, на
44+
который было перенаправление, т.е. в текущий сервлет мы уже
45+
не возвращаемся см. DOC/PartTwo.DispatcherServlet.jpg !!!
46+
*/
47+
}
48+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package PartTwo.DispatcherServlet;
2+
/*
3+
Запуск текущего сервлета исходя из моих настроек:
4+
http://localhost:8080/dispatcher-full-redirect
5+
*/
6+
import jakarta.servlet.ServletException;
7+
import jakarta.servlet.annotation.WebServlet;
8+
import jakarta.servlet.http.HttpServlet;
9+
import jakarta.servlet.http.HttpServletRequest;
10+
import jakarta.servlet.http.HttpServletResponse;
11+
12+
import java.io.IOException;
13+
14+
@WebServlet("/dispatcher-full-redirect")
15+
public class FullRedirect extends HttpServlet {
16+
17+
@Override
18+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
19+
resp.sendRedirect("/flights-demo-include-redirect");
20+
}
21+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package PartTwo.DispatcherServlet;
2+
/*
3+
В случае применении Include перенаправления, клиент не видит
4+
что происходи перенаправление на другой сервлет. Т.е. сначала
5+
клиент делает запрос на сервер к /dispatcher, тот в свою
6+
очередь, перенаправляет на FlightServlet. Теперь данный сервлет,
7+
формирует ответ Dispatcher - у. Dispatcher возвращает результат
8+
серверу. А сервер возвращает response клиенту см.
9+
PartTwo.DispatcherServlet.jpg
10+
11+
Запуск текущего сервлета исходя из моих настроек:
12+
http://localhost:8080/dispatcher-include
13+
*/
14+
import jakarta.servlet.RequestDispatcher;
15+
import jakarta.servlet.ServletException;
16+
import jakarta.servlet.annotation.WebServlet;
17+
import jakarta.servlet.http.HttpServlet;
18+
import jakarta.servlet.http.HttpServletRequest;
19+
import jakarta.servlet.http.HttpServletResponse;
20+
21+
import java.io.IOException;
22+
import java.io.PrintWriter;
23+
import java.nio.charset.StandardCharsets;
24+
25+
@WebServlet("/dispatcher-include")
26+
public class IncludeRedirect extends HttpServlet {
27+
28+
@Override
29+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
30+
RequestDispatcher myRequestRedirect = req.getRequestDispatcher("/flights-demo-include-redirect");
31+
32+
myRequestRedirect.include(req,resp);
33+
/* Устанавливаем хедеры, для благообразного отображения кириллицы в браузере */
34+
resp.setContentType("text/html");
35+
resp.setCharacterEncoding(StandardCharsets.UTF_8.name());
36+
/* Отправляем сообщение из текущего сервлета */
37+
PrintWriter respPrintWriterInDispatcher = resp.getWriter();
38+
respPrintWriterInDispatcher.write("<H1>Hello from Dispatcher-Include!!!</H1>");
39+
/*
40+
!!! В данной ситуации мы отправляем запрос другому сервлету,
41+
тот в свою очередь делает некую работу, а затем возвращает
42+
ответ Dispatcher сервлету, который может добавить еще некой
43+
логики и только затем вернуть ответ серверу. И наконец сервер
44+
возвращает ответ клиенту см. PartTwo.DispatcherServlet.jpg !!!
45+
*/
46+
}
47+
}

0 commit comments

Comments
 (0)