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 0b0b8da

Browse files
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
Lines changed: 41 additions & 0 deletions
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+
}
Lines changed: 42 additions & 0 deletions
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+
}
Lines changed: 125 additions & 0 deletions
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)

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