Skip to content

Commit 0b0b8da

Browse files
committed
Added Servlet folder in the MVCPracticeAdvanced section of a small course on Java EE
1 parent 5164e0f commit 0b0b8da

File tree

3 files changed

+208
-0
lines changed

3 files changed

+208
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package AirportSimulatorTwo.Servlet;
2+
/*
3+
Данный сервлет "почти" повторяет работу FlightServlet сервлета
4+
с разницей в том, что тут происходит перенаправление запроса
5+
на WEB_INF/Jsp/flights.jsp, которая выполнит всю логику вывода
6+
информации, как это было сделано в FlightServlet.
7+
Для проверки использовать: http://localhost:8080/flights
8+
*/
9+
import AirportSimulatorTwo.Service.FlightService;
10+
import AirportSimulatorTwo.Util.JspPathHelper;
11+
import jakarta.servlet.ServletException;
12+
import jakarta.servlet.annotation.WebServlet;
13+
import jakarta.servlet.http.HttpServlet;
14+
import jakarta.servlet.http.HttpServletRequest;
15+
import jakarta.servlet.http.HttpServletResponse;
16+
17+
import java.io.IOException;
18+
19+
@WebServlet("/flights")
20+
public class FlightServletToJstl extends HttpServlet {
21+
private final FlightService flightService = FlightService.getInstance();
22+
23+
@Override
24+
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
25+
throws ServletException, IOException {
26+
27+
/*
28+
Задаем и передаем в req атрибут "flights" с массивом данных
29+
'список перелетов', далее задаем путь на наш *.jsp файл в
30+
директории WEB_INF/JstlDemo/getFlights.jsp и методом *.forward()
31+
перенаправляем на него наши (req, resp) (можно было и короче, но
32+
две строки кода введены для наглядности в консоли).
33+
*/
34+
req.setAttribute("flights", flightService.findAll());
35+
36+
String jspPath = JspPathHelper.getJspPath("flights");
37+
System.out.println(jspPath);
38+
req.getRequestDispatcher(jspPath).forward(req,resp);
39+
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package AirportSimulatorTwo.Servlet;
2+
/*
3+
Данный сервлет "почти" повторяет работу TicketServlet сервлета
4+
с разницей в том, что тут происходит перенаправление запроса
5+
на WEB_INF/JspDemo/tickets.jsp, которая выполнит всю логику вывода
6+
информации, как это было сделано в TicketServlet.
7+
Для проверки: http://localhost:8080/tickets?flightId=4
8+
*/
9+
import AirportSimulatorTwo.DTO.TicketDto;
10+
import AirportSimulatorTwo.Service.TicketService;
11+
import AirportSimulatorTwo.Util.JspPathHelper;
12+
import jakarta.servlet.ServletException;
13+
import jakarta.servlet.annotation.WebServlet;
14+
import jakarta.servlet.http.HttpServlet;
15+
import jakarta.servlet.http.HttpServletRequest;
16+
import jakarta.servlet.http.HttpServletResponse;
17+
18+
import java.io.IOException;
19+
import java.util.List;
20+
21+
@WebServlet("/tickets")
22+
public class TicketServletToJstl extends HttpServlet {
23+
private final TicketService ticketService = TicketService.getInstance();
24+
25+
@Override
26+
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
27+
throws ServletException, IOException {
28+
29+
Long flightId = Long.valueOf(req.getParameter("flightId"));
30+
/*
31+
Хотя можно было напрямую поместить объект полученный из ticketService
32+
однако при пошаговом прогоне программы становится видно, что в него
33+
помещено и какими именами обладают поля, чтобы их применить в
34+
getTickets.jsp с использованием JSTL, например ${tickets.seat_no} -
35+
извлечь из списка 'tickets' все данные с полями 'seat_no'
36+
*/
37+
List<TicketDto> allTicketsById = ticketService.findAllByFlightId(flightId);
38+
req.setAttribute("tickets", allTicketsById);
39+
40+
req.getRequestDispatcher(JspPathHelper.getJspPath("tickets")).forward(req,resp);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package AirportSimulatorTwo.Servlet.UserRegForm;
2+
3+
/* http://localhost:8080/registration
4+
5+
Логика нашего приложения была описана в первой части,
6+
см. DOC/MVC_Chart_with_comment.jpeg, три глобальных
7+
уровня связанных логически, и четыре технологических
8+
уровня (общающиеся между собой реализуя принципы MVC):
9+
- HTML/JSP - страницы (View) общается с сервлетами;
10+
- Servlets - страницы (Controller) общается с уровнем сервисов;
11+
- Services - java классы (Model) приемо-передатчики между уровнем
12+
DAO и Servlet, а фактически между Model и Controller;
13+
- DAO - java классы (Model)позволяющие максимально просто
14+
пользователю общаться с базой данных (реализуют CRUD принципы);
15+
16+
Для работы с пользователями создадим в базе данных
17+
таблицу пользователей: см. create_users_table.sql
18+
*/
19+
20+
import AirportSimulatorTwo.DTO.CreateUserDto;
21+
import AirportSimulatorTwo.Entity.EntityEnum.Gender;
22+
import AirportSimulatorTwo.Entity.EntityEnum.Role;
23+
import AirportSimulatorTwo.Exception.ValidationException;
24+
import AirportSimulatorTwo.Service.UserService;
25+
import AirportSimulatorTwo.Util.JspPathHelper;
26+
import jakarta.servlet.ServletException;
27+
import jakarta.servlet.annotation.MultipartConfig;
28+
import jakarta.servlet.annotation.WebServlet;
29+
import jakarta.servlet.http.HttpServlet;
30+
import jakarta.servlet.http.HttpServletRequest;
31+
import jakarta.servlet.http.HttpServletResponse;
32+
import jakarta.servlet.http.Part;
33+
34+
import java.io.IOException;
35+
36+
/*
37+
По умолчанию сервлеты не могут работать с элементами Part, поскольку мы в
38+
форме регистрации пользователя пытаемся загрузить бинарный файл, нам
39+
понадобится аннотация @MultipartConfig, которая позволяет реализовать
40+
необходимый функционал и принимает следующие параметры:
41+
42+
- location - Абсолютный путь к каталогу в файловой системе. Атрибут местоположения
43+
не поддерживает путь относительно контекста приложения. Это расположение
44+
используется для временного хранения файлов во время обработки частей
45+
или когда размер файла превышает указанный параметр fileSizeThreshold.
46+
Расположение по умолчанию - default "".
47+
- maxFileSize - Размер файла в байтах, после которого файл будет временно храниться
48+
на диске. Размер по умолчанию — 0 байт (default -1L).
49+
- maxRequestSize - Максимально допустимый размер загружаемых файлов в байтах. Если
50+
размер любого загруженного файла больше этого размера, веб-контейнер
51+
выдаст исключение (IllegalStateException). Размер по умолчанию не
52+
ограничен (default -1L). Фактически это размер всего request-а.
53+
- fileSizeThreshold - Максимальный размер, допустимый для запроса multipart/form-data,
54+
в байтах. Веб-контейнер выдаст исключение, если общий размер всех
55+
загруженных файлов превысит этот порог. Размер по умолчанию не
56+
ограничен (default 0).
57+
!!! Данный размер определяет файл какого размера будет висеть в
58+
памяти без загрузки на диск по пути указанному в параметре location !!!
59+
60+
Например, аннотация @MultipartConfig может быть построена следующим образом:
61+
@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
62+
maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
63+
64+
Более подробно: https://docs.oracle.com/javaee/6/tutorial/doc/gmhal.html
65+
*/
66+
@MultipartConfig(fileSizeThreshold=1024*1024)
67+
@WebServlet("/registration")
68+
public class UserRegForm extends HttpServlet {
69+
70+
private UserService userService = UserService.getInstance();
71+
/*
72+
На doGet возвращаем *.jsp страничку на которой мы
73+
введем данные нашего пользователя и передадим эти
74+
сведения в базу данных через POST запрос
75+
*/
76+
@Override
77+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
78+
ServletException,
79+
IOException {
80+
req.setAttribute("roles", Role.values()); // Role.values() подобен List.of("USER","ADMIN")
81+
req.setAttribute("genders", Gender.values()); // Gender.values() подобен List.of("MALE","FEMALE")
82+
83+
req.getRequestDispatcher(JspPathHelper.getJspPath("jstl_img_reg_form")).forward(req,resp);
84+
}
85+
/* На doPost возвращаем запрос */
86+
@Override
87+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
88+
ServletException, IOException {
89+
90+
/*
91+
Данная форма регистрации в отличие от формы в AirportSimulator
92+
имитирует сохранение некоего загружаемого пользователем файла
93+
(картинки) извне на сервер (необходимо понимать, что наш TomCat
94+
это, вроде как, некий сервер в интернете и мы общаемся с ним
95+
через браузер)
96+
*/
97+
Part loadImg = req.getPart("image");
98+
/*
99+
Извлекаем все необходимые параметры из нашей
100+
формы регистрации (уровень view), чтобы передать
101+
на уровень сервисов (уровень controller)
102+
*/
103+
CreateUserDto userDto = CreateUserDto.builder().
104+
name(req.getParameter("name")).
105+
birthday(req.getParameter("birthday")).
106+
email(req.getParameter("email")).
107+
image(loadImg).
108+
password(req.getParameter("password")).
109+
role(req.getParameter("role")).
110+
gender(req.getParameter("gender")).
111+
build();
112+
113+
try {
114+
/*
115+
Создаем пользователя на уровне Service и
116+
перенаправляем запрос на сервлет login
117+
*/
118+
userService.create(userDto);
119+
resp.sendRedirect("/registration");
120+
} catch (ValidationException exception) {
121+
req.setAttribute("errors", exception.getApp_errors());
122+
doGet(req, resp);
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)