Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3c92f2a

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /