From 957338e676be401a8fd759cbc4ca7cec09c5c8cf Mon Sep 17 00:00:00 2001 From: Dell Date: Thu, 9 Apr 2026 09:05:18 +0300 Subject: [PATCH] init --- pom.xml | 73 ++++++ .../java/org/example/je/jdbc/JdbcRunner.java | 25 ++ .../java/org/example/je/jdbc/dao/Dao.java | 13 + .../org/example/je/jdbc/dao/FlightDao.java | 112 +++++++++ .../org/example/je/jdbc/dao/TicketDao.java | 238 ++++++++++++++++++ .../java/org/example/je/jdbc/dao/UserDao.java | 70 ++++++ .../example/je/jdbc/dto/CreateUserDto.java | 15 ++ .../org/example/je/jdbc/dto/FlightDto.java | 4 + .../org/example/je/jdbc/dto/TicketDto.java | 4 + .../org/example/je/jdbc/dto/TicketFilter.java | 5 + .../java/org/example/je/jdbc/dto/UserDto.java | 11 + .../org/example/je/jdbc/entity/Flight.java | 119 +++++++++ .../example/je/jdbc/entity/FlightStatus.java | 9 + .../org/example/je/jdbc/entity/Gender.java | 14 ++ .../java/org/example/je/jdbc/entity/Role.java | 14 ++ .../org/example/je/jdbc/entity/Ticket.java | 97 +++++++ .../java/org/example/je/jdbc/entity/User.java | 22 ++ .../je/jdbc/exeption/DaoException.java | 9 + .../je/jdbc/mapper/CreateUserMapper.java | 29 +++ .../org/example/je/jdbc/mapper/Mapper.java | 5 + .../je/jdbc/service/FlightService.java | 30 +++ .../je/jdbc/service/TicketService.java | 31 +++ .../example/je/jdbc/service/UserService.java | 27 ++ .../je/jdbc/servlet/ContentServlet.java | 24 ++ .../je/jdbc/servlet/CookiesServlet.java | 29 +++ .../je/jdbc/servlet/DispatcherServlet.java | 20 ++ .../je/jdbc/servlet/FlightServlet.java | 26 ++ .../je/jdbc/servlet/RegistrationServlet.java | 41 +++ .../je/jdbc/servlet/SessionServlet.java | 30 +++ .../je/jdbc/servlet/TicketServlet.java | 28 +++ src/main/java/utils/ConnectionManager.java | 70 ++++++ src/main/java/utils/JspHelper.java | 12 + .../java/utils/LocalDateTimeFormatter.java | 30 +++ src/main/java/utils/PropertiesUtil.java | 27 ++ src/main/resources/application.properties | 4 + src/main/webapp/WEB-INF/jsp/content.jsp | 18 ++ src/main/webapp/WEB-INF/jsp/flights.jsp | 22 ++ src/main/webapp/WEB-INF/jsp/registration.jsp | 46 ++++ src/main/webapp/WEB-INF/jsp/tickets.jsp | 21 ++ 39 files changed, 1424 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/org/example/je/jdbc/JdbcRunner.java create mode 100644 src/main/java/org/example/je/jdbc/dao/Dao.java create mode 100644 src/main/java/org/example/je/jdbc/dao/FlightDao.java create mode 100644 src/main/java/org/example/je/jdbc/dao/TicketDao.java create mode 100644 src/main/java/org/example/je/jdbc/dao/UserDao.java create mode 100644 src/main/java/org/example/je/jdbc/dto/CreateUserDto.java create mode 100644 src/main/java/org/example/je/jdbc/dto/FlightDto.java create mode 100644 src/main/java/org/example/je/jdbc/dto/TicketDto.java create mode 100644 src/main/java/org/example/je/jdbc/dto/TicketFilter.java create mode 100644 src/main/java/org/example/je/jdbc/dto/UserDto.java create mode 100644 src/main/java/org/example/je/jdbc/entity/Flight.java create mode 100644 src/main/java/org/example/je/jdbc/entity/FlightStatus.java create mode 100644 src/main/java/org/example/je/jdbc/entity/Gender.java create mode 100644 src/main/java/org/example/je/jdbc/entity/Role.java create mode 100644 src/main/java/org/example/je/jdbc/entity/Ticket.java create mode 100644 src/main/java/org/example/je/jdbc/entity/User.java create mode 100644 src/main/java/org/example/je/jdbc/exeption/DaoException.java create mode 100644 src/main/java/org/example/je/jdbc/mapper/CreateUserMapper.java create mode 100644 src/main/java/org/example/je/jdbc/mapper/Mapper.java create mode 100644 src/main/java/org/example/je/jdbc/service/FlightService.java create mode 100644 src/main/java/org/example/je/jdbc/service/TicketService.java create mode 100644 src/main/java/org/example/je/jdbc/service/UserService.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/ContentServlet.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/CookiesServlet.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/DispatcherServlet.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/FlightServlet.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/RegistrationServlet.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/SessionServlet.java create mode 100644 src/main/java/org/example/je/jdbc/servlet/TicketServlet.java create mode 100644 src/main/java/utils/ConnectionManager.java create mode 100644 src/main/java/utils/JspHelper.java create mode 100644 src/main/java/utils/LocalDateTimeFormatter.java create mode 100644 src/main/java/utils/PropertiesUtil.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/webapp/WEB-INF/jsp/content.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/flights.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/registration.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/tickets.jsp diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c3f5e9b --- /dev/null +++ b/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + org.example + flight-application + 1.0-SNAPSHOT + war + + + 25 + 25 + UTF-8 + + + + + + + + + jakarta.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + 3.0.0 + + + + + org.glassfish.web + jakarta.servlet.jsp.jstl + 3.0.1 + + + + org.postgresql + postgresql + 42.7.10 + compile + + + + org.projectlombok + lombok + 1.18.44 + compile + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.15.0 + + + + org.projectlombok + lombok + 1.18.44 + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/example/je/jdbc/JdbcRunner.java b/src/main/java/org/example/je/jdbc/JdbcRunner.java new file mode 100644 index 0000000..31720c8 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/JdbcRunner.java @@ -0,0 +1,25 @@ +package org.example.je.jdbc; + +import org.example.je.jdbc.dao.FlightDao; +import org.example.je.jdbc.dao.TicketDao; +import org.example.je.jdbc.dto.TicketFilter; +import org.example.je.jdbc.entity.Ticket; +import utils.ConnectionManager; + +import java.math.BigDecimal; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class JdbcRunner { + + static void main() throws SQLException { + var ticketDao = TicketDao.getInstance(); + var filter = new TicketFilter(null, null, 3, 1); + + System.out.println(ticketDao.findAll(filter)); + + // var flightDao = FlightDao.getInstance(); + + //System.out.println(flightDao.findAll()); + } +} diff --git a/src/main/java/org/example/je/jdbc/dao/Dao.java b/src/main/java/org/example/je/jdbc/dao/Dao.java new file mode 100644 index 0000000..0cf97df --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dao/Dao.java @@ -0,0 +1,13 @@ +package org.example.je.jdbc.dao; + +import java.sql.Connection; +import java.util.List; +import java.util.Optional; + +public interface Dao { + E save(E e); + boolean update(E e); + boolean delete(K id); + List findAll(); + Optional findById(Long id); +} diff --git a/src/main/java/org/example/je/jdbc/dao/FlightDao.java b/src/main/java/org/example/je/jdbc/dao/FlightDao.java new file mode 100644 index 0000000..8f44fde --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dao/FlightDao.java @@ -0,0 +1,112 @@ +package org.example.je.jdbc.dao; + +import org.example.je.jdbc.entity.Flight; +import org.example.je.jdbc.entity.FlightStatus; +import org.example.je.jdbc.exeption.DaoException; +import utils.ConnectionManager; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class FlightDao implements Dao { + private final static FlightDao INSTANCE = new FlightDao(); + + private final static String FIND_ALL_SQL = """ + SELECT + id, flight_no, departure_date, departure_airport_code, arrival_date, arrival_airport_code, aircraft_id, status + FROM public.flight + """; + private static final String FIND_BY_ID_SQL = """ + SELECT + id, flight_no, departure_date, departure_airport_code, arrival_date, arrival_airport_code, aircraft_id, status + FROM public.flight + WHERE id = ? + """; + + @Override + public Flight save(Flight flight) { + return null; + } + + @Override + public boolean update(Flight flight) { + return false; + } + + @Override + public boolean delete(Long id) { + return false; + } + + @Override + public List findAll() { + + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(FIND_ALL_SQL)) { + List flights = new ArrayList(); + var recordSet = statement.executeQuery(); + + while (recordSet.next()) { + flights.add( + buildFlight(recordSet) + ); + } + + return flights; + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + @Override + public Optional findById(Long id) { + try (var connection = ConnectionManager.get();) { + + return findById(id, connection); + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + private Flight buildFlight(ResultSet resultSet) throws SQLException { + return new Flight( + resultSet.getLong("id"), + resultSet.getString("flight_no"), + resultSet.getTimestamp("departure_date").toLocalDateTime(), + resultSet.getString("departure_airport_code"), + resultSet.getTimestamp("arrival_date").toLocalDateTime(), + resultSet.getString("arrival_airport_code"), + resultSet.getLong("aircraft_id"), + FlightStatus.valueOf(resultSet.getString("status")) + ); + } + + + public Optional findById(Long id, Connection connection) { + try (var statement = connection.prepareStatement(FIND_BY_ID_SQL)) { + Flight flight = null; + statement.setLong(1, id); + + var recordSet = statement.executeQuery(); + + if (recordSet.next()) { + flight = buildFlight(recordSet); + } + + return Optional.ofNullable(flight); + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + public static FlightDao getInstance() { + return INSTANCE; + } +} diff --git a/src/main/java/org/example/je/jdbc/dao/TicketDao.java b/src/main/java/org/example/je/jdbc/dao/TicketDao.java new file mode 100644 index 0000000..0150085 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dao/TicketDao.java @@ -0,0 +1,238 @@ +package org.example.je.jdbc.dao; + +import org.example.je.jdbc.dto.TicketFilter; +import org.example.je.jdbc.entity.Ticket; +import org.example.je.jdbc.exeption.DaoException; +import utils.ConnectionManager; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.*; +import java.util.stream.Collectors; + +public class TicketDao implements Dao{ + private final static FlightDao flightDao = FlightDao.getInstance(); + private final static TicketDao INSTANCE = new TicketDao(); + + private final static String SAVE_SQL = """ + INSERT INTO public.ticket( + passport_no, passanger_name, flight_id, seat_no, cost) + VALUES (?, ?, ?, ?, ?); + """; + + private final static String UPDATE_SQL = """ + UPDATE public.ticket SET + passport_no = ?, + passanger_name = ?, + flight_id = ?, + seat_no = ?, + cost = ? + WHERE id = ?; + """; + + private final static String DELETE_SQL = """ + DELETE from public.ticket WHERE id = ?; + """; + + private final static String FIND_ALL_BY_FLIGHT_ID_SQL = """ + SELECT id, passport_no, passanger_name, flight_id, seat_no, cost + FROM public.ticket + WHERE flight_id = ? + """; + + private final static String FIND_ALL_SQL = """ + SELECT id, passport_no, passanger_name, flight_id, seat_no, cost + FROM public.ticket + """; + + private final static String FIND_BY_ID_SQL = """ + SELECT id, passport_no, passanger_name, flight_id, seat_no, cost + FROM public.ticket + WHERE id = ?; + """; + + public Ticket save(Ticket ticket) { + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(SAVE_SQL, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, ticket.getPassportNo()); + statement.setString(2, ticket.getPassengerName()); + statement.setLong(3, ticket.getFlight().getId()); + statement.setString(4, ticket.getSeatNo()); + statement.setBigDecimal(5, ticket.getCost()); + + statement.executeUpdate(); + + var keys = statement.getGeneratedKeys(); + if (keys.next()) { + ticket.setId(keys.getLong("id")); + } + return ticket; + } catch (SQLException e) { + throw new DaoException(e); + } + } + + public boolean update(Ticket ticket) { + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(UPDATE_SQL)) { + statement.setString(1, ticket.getPassportNo()); + statement.setString(2, ticket.getPassengerName()); + statement.setLong(3, ticket.getFlight().getId()); + statement.setString(4, ticket.getSeatNo()); + statement.setBigDecimal(5, ticket.getCost()); + statement.setLong(6, ticket.getId()); + + return statement.execute(); + } catch (SQLException e) { + throw new DaoException(e); + } + } + + public boolean delete(Long id) { + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(DELETE_SQL)) { + + statement.setLong(1, id); + + return statement.execute(); + + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + public List findAll() { + + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(FIND_ALL_SQL)) { + List tickets = new ArrayList(); + var recordSet = statement.executeQuery(); + + while (recordSet.next()) { + tickets.add(buildTicket(recordSet)); + } + + return tickets; + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + private Ticket buildTicket(ResultSet recordSet) throws SQLException { + return new Ticket( + recordSet.getLong("id"), + recordSet.getString("passport_no"), + recordSet.getString("passanger_name"), + flightDao.findById(recordSet.getLong("flight_id"), recordSet.getStatement().getConnection()).get(), + recordSet.getString("seat_no"), + recordSet.getBigDecimal("cost") + ); + } + + public List findAll(TicketFilter filter) { + + List parameters = new ArrayList(); + List whereSql = new ArrayList<>(); + + if(filter.passangerName()!= null) { + parameters.add(filter.passangerName()); + whereSql.add("passanger_name= ?"); + } + + if(filter.seatNo()!= null) { + parameters.add("%" + filter.seatNo() + "%"); + whereSql.add("seat_no like ?"); + } + + parameters.add(filter.offset()); + parameters.add(filter.limit()); + + var where = whereSql.stream().collect(Collectors.joining( + " AND ", + parameters.size() > 2 ? " WHERE " : "", + " OFFSET ? LIMIT ? " + )); + + String sql = FIND_ALL_SQL + where; + + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(sql)) { + + for (int i = 0; i < parameters.size(); i++) { + statement.setObject(i+1, parameters.get(i)); + } + List tickets = new ArrayList(); + var recordSet = statement.executeQuery(); + + while (recordSet.next()) { + tickets.add(new Ticket( + recordSet.getLong("id"), + recordSet.getString("passport_no"), + recordSet.getString("passanger_name"), + flightDao.findById(recordSet.getLong("flight_id"), recordSet.getStatement().getConnection()).get(), + recordSet.getString("seat_no"), + recordSet.getBigDecimal("cost") + )); + } + + return tickets; + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + public List findAllByFlightId(Long id){ + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(FIND_ALL_BY_FLIGHT_ID_SQL)) { + statement.setLong(1, id); + + List tickets = new ArrayList(); + var recordSet = statement.executeQuery(); + + while (recordSet.next()) { + tickets.add(buildTicket(recordSet)); + } + + return tickets; + + } catch (SQLException e) { + throw new DaoException(e); + } + } + public Optional findById(Long id) { + + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(FIND_BY_ID_SQL)) { + Ticket ticket = null; + statement.setLong(1, id); + + var recordSet = statement.executeQuery(); + + if (recordSet.next()) { + ticket = new Ticket( + recordSet.getLong("id"), + recordSet.getString("passport_no"), + recordSet.getString("passanger_name"), + flightDao.findById(recordSet.getLong("flight_id"), recordSet.getStatement().getConnection()).get(), + recordSet.getString("seat_no"), + recordSet.getBigDecimal("cost")); + } + + return Optional.ofNullable(ticket); + + } catch (SQLException e) { + throw new DaoException(e); + } + } + + public static TicketDao getInstance() { + return INSTANCE; + } + + private TicketDao() { + } +} diff --git a/src/main/java/org/example/je/jdbc/dao/UserDao.java b/src/main/java/org/example/je/jdbc/dao/UserDao.java new file mode 100644 index 0000000..3bd75c2 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dao/UserDao.java @@ -0,0 +1,70 @@ +package org.example.je.jdbc.dao; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.example.je.jdbc.entity.User; +import org.example.je.jdbc.exeption.DaoException; +import utils.ConnectionManager; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; +import java.util.Optional; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class UserDao implements Dao { + + private final static UserDao INSTANCE = new UserDao(); + + private final static String SAVE_SQL = """ + INSERT INTO public.users( + name, birthdate, email, password, role, gender) + VALUES (?, ?, ?, ?, ?, ?); + """; + @Override + public User save(User user) { + try (var connection = ConnectionManager.get(); + var statement = connection.prepareStatement(SAVE_SQL, Statement.RETURN_GENERATED_KEYS)) { + statement.setObject(1, user.getName()); + statement.setObject(2, user.getBirthdate()); + statement.setObject(3, user.getEmail()); + statement.setObject(4, user.getPassword()); + statement.setObject(5, user.getRole().name()); + statement.setObject(6, user.getGender().name()); + + statement.executeUpdate(); + + var keys = statement.getGeneratedKeys(); + if (keys.next()) { + user.setId(keys.getLong("id")); + } + return user; + } catch (SQLException e) { + throw new DaoException(e); + } + } + + @Override + public boolean update(User user) { + return false; + } + + @Override + public boolean delete(Long id) { + return false; + } + + @Override + public List findAll() { + return List.of(); + } + + @Override + public Optional findById(Long id) { + return Optional.empty(); + } + + public static UserDao getInstance() { + return INSTANCE; + } +} diff --git a/src/main/java/org/example/je/jdbc/dto/CreateUserDto.java b/src/main/java/org/example/je/jdbc/dto/CreateUserDto.java new file mode 100644 index 0000000..d40f539 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dto/CreateUserDto.java @@ -0,0 +1,15 @@ +package org.example.je.jdbc.dto; + +import lombok.Builder; +import lombok.Value; + +@Value +@Builder +public class CreateUserDto { + String name; + String email; + String password; + String role; + String gender; + String birthdate; +} diff --git a/src/main/java/org/example/je/jdbc/dto/FlightDto.java b/src/main/java/org/example/je/jdbc/dto/FlightDto.java new file mode 100644 index 0000000..d309efb --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dto/FlightDto.java @@ -0,0 +1,4 @@ +package org.example.je.jdbc.dto; + +public record FlightDto(Long id, String description) { +} diff --git a/src/main/java/org/example/je/jdbc/dto/TicketDto.java b/src/main/java/org/example/je/jdbc/dto/TicketDto.java new file mode 100644 index 0000000..c0f3e96 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dto/TicketDto.java @@ -0,0 +1,4 @@ +package org.example.je.jdbc.dto; + +public record TicketDto(Long id, Long flightId, String seatNo) { +} diff --git a/src/main/java/org/example/je/jdbc/dto/TicketFilter.java b/src/main/java/org/example/je/jdbc/dto/TicketFilter.java new file mode 100644 index 0000000..6a5f09c --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dto/TicketFilter.java @@ -0,0 +1,5 @@ +package org.example.je.jdbc.dto; + +public record TicketFilter(String passangerName, String seatNo, int offset, int limit) { + +} diff --git a/src/main/java/org/example/je/jdbc/dto/UserDto.java b/src/main/java/org/example/je/jdbc/dto/UserDto.java new file mode 100644 index 0000000..a7cd382 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/dto/UserDto.java @@ -0,0 +1,11 @@ +package org.example.je.jdbc.dto; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class UserDto { + private Long id; + private String email; +} diff --git a/src/main/java/org/example/je/jdbc/entity/Flight.java b/src/main/java/org/example/je/jdbc/entity/Flight.java new file mode 100644 index 0000000..97af31b --- /dev/null +++ b/src/main/java/org/example/je/jdbc/entity/Flight.java @@ -0,0 +1,119 @@ +package org.example.je.jdbc.entity; + +import java.time.LocalDateTime; +import java.util.Objects; + +public class Flight { + private Long id; + private String flightNo; + private LocalDateTime departureDate; + private String departureAirportCode; + private LocalDateTime arrivalDate; + private String arrivalAirportCode; + private Long aircraftId; + private FlightStatus status; + + public Flight() { + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Flight flight = (Flight) o; + return Objects.equals(id, flight.id) && Objects.equals(flightNo, flight.flightNo) && Objects.equals(departureDate, flight.departureDate) && Objects.equals(departureAirportCode, flight.departureAirportCode) && Objects.equals(arrivalDate, flight.arrivalDate) && Objects.equals(arrivalAirportCode, flight.arrivalAirportCode) && Objects.equals(aircraftId, flight.aircraftId) && Objects.equals(status, flight.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, flightNo, departureDate, departureAirportCode, arrivalDate, arrivalAirportCode, aircraftId, status); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFlightNo() { + return flightNo; + } + + public void setFlightNo(String flightNo) { + this.flightNo = flightNo; + } + + public LocalDateTime getDepartureDate() { + return departureDate; + } + + public void setDepartureDate(LocalDateTime departureDate) { + this.departureDate = departureDate; + } + + public String getDepartureAirportCode() { + return departureAirportCode; + } + + public void setDepartureAirportCode(String departureAirportCode) { + this.departureAirportCode = departureAirportCode; + } + + public LocalDateTime getArrivalDate() { + return arrivalDate; + } + + public void setArrivalDate(LocalDateTime arrivalDate) { + this.arrivalDate = arrivalDate; + } + + public String getArrivalAirportCode() { + return arrivalAirportCode; + } + + public void setArrivalAirportCode(String arrivalAirportCode) { + this.arrivalAirportCode = arrivalAirportCode; + } + + public Long getAircraftId() { + return aircraftId; + } + + public void setAircraftId(Long aircraftId) { + this.aircraftId = aircraftId; + } + + public FlightStatus getStatus() { + return status; + } + + public void setStatus(FlightStatus status) { + this.status = status; + } + + public Flight(Long id, String flightNo, LocalDateTime departureDate, String departureAirportCode, LocalDateTime arrivalDate, String arrivalAirportCode, Long aircraftId, FlightStatus status) { + this.id = id; + this.flightNo = flightNo; + this.departureDate = departureDate; + this.departureAirportCode = departureAirportCode; + this.arrivalDate = arrivalDate; + this.arrivalAirportCode = arrivalAirportCode; + this.aircraftId = aircraftId; + this.status = status; + } + + @Override + public String toString() { + return "Flight{" + + "id=" + id + + ", flightNo='" + flightNo + '\'' + + ", departureDate=" + departureDate + + ", departureAirportCode='" + departureAirportCode + '\'' + + ", arrivalDate=" + arrivalDate + + ", arrivalAirportCode='" + arrivalAirportCode + '\'' + + ", aircraftId=" + aircraftId + + ", status=" + status + + '}'; + } +} diff --git a/src/main/java/org/example/je/jdbc/entity/FlightStatus.java b/src/main/java/org/example/je/jdbc/entity/FlightStatus.java new file mode 100644 index 0000000..485652e --- /dev/null +++ b/src/main/java/org/example/je/jdbc/entity/FlightStatus.java @@ -0,0 +1,9 @@ +package org.example.je.jdbc.entity; + +public enum FlightStatus { + SCHEDULED, + BOARDING, + DEPARTED, + ARRIVED, + CANCELLED +} diff --git a/src/main/java/org/example/je/jdbc/entity/Gender.java b/src/main/java/org/example/je/jdbc/entity/Gender.java new file mode 100644 index 0000000..a127404 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/entity/Gender.java @@ -0,0 +1,14 @@ +package org.example.je.jdbc.entity; + +import java.util.Arrays; +import java.util.Optional; + +public enum Gender { + MALE, FEMALE; + + public static Optional find(String gender){ + return Arrays.stream(values()) + .filter(it -> it.name().equals(gender)) + .findFirst(); + } +} diff --git a/src/main/java/org/example/je/jdbc/entity/Role.java b/src/main/java/org/example/je/jdbc/entity/Role.java new file mode 100644 index 0000000..f284bfb --- /dev/null +++ b/src/main/java/org/example/je/jdbc/entity/Role.java @@ -0,0 +1,14 @@ +package org.example.je.jdbc.entity; + +import java.util.Arrays; +import java.util.Optional; + +public enum Role { + ADMIN, USER; + + public static Optional find(String role){ + return Arrays.stream(values()) + .filter(it -> it.name().equals(role)) + .findFirst(); + } +} diff --git a/src/main/java/org/example/je/jdbc/entity/Ticket.java b/src/main/java/org/example/je/jdbc/entity/Ticket.java new file mode 100644 index 0000000..2a38d8d --- /dev/null +++ b/src/main/java/org/example/je/jdbc/entity/Ticket.java @@ -0,0 +1,97 @@ +package org.example.je.jdbc.entity; + +import java.math.BigDecimal; +import java.util.Objects; + +public class Ticket { + private Long id; + private String passportNo; + private String passengerName; + private Flight flight; + private String seatNo; + private BigDecimal cost; + + public Ticket() { + } + + public Ticket(Long id, String passportNo, String passengerName, Flight flight, String seatNo, BigDecimal cost) { + this.id = id; + this.passportNo = passportNo; + this.passengerName = passengerName; + this.flight = flight; + this.seatNo = seatNo; + this.cost = cost; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPassportNo() { + return passportNo; + } + + public void setPassportNo(String passportNo) { + this.passportNo = passportNo; + } + + public String getPassengerName() { + return passengerName; + } + + public void setPassengerName(String passengerName) { + this.passengerName = passengerName; + } + + public Flight getFlight() { + return flight; + } + + public void setFlightId(Flight flight) { + this.flight = flight; + } + + public String getSeatNo() { + return seatNo; + } + + public void setSeatNo(String seatNo) { + this.seatNo = seatNo; + } + + public BigDecimal getCost() { + return cost; + } + + public void setCost(BigDecimal cost) { + this.cost = cost; + } + + @Override + public String toString() { + return "Ticket{" + + "id=" + id + + ", passportNo='" + passportNo + '\'' + + ", passengerName='" + passengerName + '\'' + + ", flightId=" + flight + + ", seatNo='" + seatNo + '\'' + + ", cost=" + cost + + '}'; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Ticket ticket = (Ticket) o; + return Objects.equals(id, ticket.id) && Objects.equals(passportNo, ticket.passportNo) && Objects.equals(passengerName, ticket.passengerName) && Objects.equals(flight, ticket.flight) && Objects.equals(seatNo, ticket.seatNo) && Objects.equals(cost, ticket.cost); + } + + @Override + public int hashCode() { + return Objects.hash(id, passportNo, passengerName, flight, seatNo, cost); + } +} diff --git a/src/main/java/org/example/je/jdbc/entity/User.java b/src/main/java/org/example/je/jdbc/entity/User.java new file mode 100644 index 0000000..6a63323 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/entity/User.java @@ -0,0 +1,22 @@ +package org.example.je.jdbc.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDate; + +@Data +@AllArgsConstructor +@Builder +public class User { + private Long id; + private String name; + private String email; + private String password; + private Role role; + private Gender gender; + private LocalDate birthdate; + +} + diff --git a/src/main/java/org/example/je/jdbc/exeption/DaoException.java b/src/main/java/org/example/je/jdbc/exeption/DaoException.java new file mode 100644 index 0000000..acccdf6 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/exeption/DaoException.java @@ -0,0 +1,9 @@ +package org.example.je.jdbc.exeption; + +import java.sql.SQLException; + +public class DaoException extends RuntimeException { + public DaoException(Throwable e) { + super(e); + } +} diff --git a/src/main/java/org/example/je/jdbc/mapper/CreateUserMapper.java b/src/main/java/org/example/je/jdbc/mapper/CreateUserMapper.java new file mode 100644 index 0000000..81aac47 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/mapper/CreateUserMapper.java @@ -0,0 +1,29 @@ +package org.example.je.jdbc.mapper; + +import org.example.je.jdbc.dto.CreateUserDto; +import org.example.je.jdbc.entity.Gender; +import org.example.je.jdbc.entity.Role; +import org.example.je.jdbc.entity.User; +import utils.LocalDateTimeFormatter; + +public class CreateUserMapper implements Mapper { + private static final CreateUserMapper INSTANCE = new CreateUserMapper(); + + public static CreateUserMapper getInstance(){ + return INSTANCE; + } + + @Override + public User mapFrom(CreateUserDto createUserDto) { + return User.builder() + + .name(createUserDto.getName()) + .role(Role.valueOf(createUserDto.getRole())) + .gender(Gender.valueOf(createUserDto.getGender())) + .birthdate(LocalDateTimeFormatter.format(createUserDto.getBirthdate())) + .password(createUserDto.getPassword()) + .email(createUserDto.getEmail()) + + .build(); + } +} diff --git a/src/main/java/org/example/je/jdbc/mapper/Mapper.java b/src/main/java/org/example/je/jdbc/mapper/Mapper.java new file mode 100644 index 0000000..cf427ce --- /dev/null +++ b/src/main/java/org/example/je/jdbc/mapper/Mapper.java @@ -0,0 +1,5 @@ +package org.example.je.jdbc.mapper; + +public interface Mapper { + T mapFrom(F f); +} diff --git a/src/main/java/org/example/je/jdbc/service/FlightService.java b/src/main/java/org/example/je/jdbc/service/FlightService.java new file mode 100644 index 0000000..c615db1 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/service/FlightService.java @@ -0,0 +1,30 @@ +package org.example.je.jdbc.service; + +import org.example.je.jdbc.dao.FlightDao; +import org.example.je.jdbc.dto.FlightDto; + +import java.util.List; +import java.util.stream.Collectors; + +public class FlightService { + private static final FlightService INSTANCE = new FlightService(); + private static final FlightDao flightDao = FlightDao.getInstance(); + + public static FlightService getInstance(){ + return INSTANCE; + } + + private FlightService() { + } + + public List findAll(){ + return flightDao.findAll().stream().map(flight -> + new FlightDto( + flight.getId(), + "%s - %s - %s".formatted( + flight.getDepartureAirportCode(), + flight.getArrivalAirportCode(), + flight.getStatus() + ))).collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/example/je/jdbc/service/TicketService.java b/src/main/java/org/example/je/jdbc/service/TicketService.java new file mode 100644 index 0000000..01ad072 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/service/TicketService.java @@ -0,0 +1,31 @@ +package org.example.je.jdbc.service; + +import org.example.je.jdbc.dao.FlightDao; +import org.example.je.jdbc.dao.TicketDao; +import org.example.je.jdbc.dto.FlightDto; +import org.example.je.jdbc.dto.TicketDto; + +import java.util.List; +import java.util.stream.Collectors; + +public class TicketService { + private static final TicketService INSTANCE = new TicketService(); + private static final TicketDao ticketDao = TicketDao.getInstance(); + + public static TicketService getInstance(){ + return INSTANCE; + } + + private TicketService() { + } + + public List findAllByFlightId(Long id){ + return ticketDao.findAllByFlightId(id).stream().map(ticket -> + new TicketDto( + ticket.getId(), + ticket.getFlight().getId(), + ticket.getSeatNo() + + )).collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/example/je/jdbc/service/UserService.java b/src/main/java/org/example/je/jdbc/service/UserService.java new file mode 100644 index 0000000..b04c8fc --- /dev/null +++ b/src/main/java/org/example/je/jdbc/service/UserService.java @@ -0,0 +1,27 @@ +package org.example.je.jdbc.service; + +import org.example.je.jdbc.dao.TicketDao; +import org.example.je.jdbc.dao.UserDao; +import org.example.je.jdbc.dto.CreateUserDto; +import org.example.je.jdbc.mapper.CreateUserMapper; + +public class UserService { + private static final UserService INSTANCE = new UserService(); + private static final UserDao userDao = UserDao.getInstance(); + + private static final CreateUserMapper createUserMapper = CreateUserMapper.getInstance(); + + public static UserService getInstance(){ + return INSTANCE; + } + + public Long create(CreateUserDto createUserDto ){ + var user = createUserMapper.mapFrom(createUserDto); + userDao.save(user); + + return user.getId(); + } + + private UserService() { + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/ContentServlet.java b/src/main/java/org/example/je/jdbc/servlet/ContentServlet.java new file mode 100644 index 0000000..a218161 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/ContentServlet.java @@ -0,0 +1,24 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.example.je.jdbc.service.FlightService; +import utils.JspHelper; + +import java.io.IOException; + +@WebServlet("/content") +public class ContentServlet extends HttpServlet { + private final static FlightService flightService = FlightService.getInstance(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + var flights = flightService.findAll(); + + req.setAttribute("flights", flights); + req.getRequestDispatcher(JspHelper.getPath("content")).forward(req, resp); + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/CookiesServlet.java b/src/main/java/org/example/je/jdbc/servlet/CookiesServlet.java new file mode 100644 index 0000000..32ebd4e --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/CookiesServlet.java @@ -0,0 +1,29 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.util.Arrays; + +@WebServlet("/cookies") +public class CookiesServlet extends HttpServlet { + private final static String UNIQUE_USER="userId"; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + var cookies = req.getCookies(); + if(cookies == null || Arrays.stream(cookies).filter(cookie -> UNIQUE_USER.equals(cookie.getName())).findFirst().isEmpty()) + { + var cookie = new Cookie(UNIQUE_USER, "1"); + cookie.setMaxAge(60 * 60); + cookie.setPath("/cookies"); + + resp.addCookie(cookie); + } + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/DispatcherServlet.java b/src/main/java/org/example/je/jdbc/servlet/DispatcherServlet.java new file mode 100644 index 0000000..7cde5e5 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/DispatcherServlet.java @@ -0,0 +1,20 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/dispatcher") +public class DispatcherServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + var dispatcher = req.getRequestDispatcher("/flights"); + req.setAttribute("dispatcher", true); + + dispatcher.include(req, resp); + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/FlightServlet.java b/src/main/java/org/example/je/jdbc/servlet/FlightServlet.java new file mode 100644 index 0000000..8462909 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/FlightServlet.java @@ -0,0 +1,26 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.example.je.jdbc.service.FlightService; +import utils.JspHelper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@WebServlet("/flights") +public class FlightServlet extends HttpServlet { + private static final FlightService flightService = FlightService.getInstance(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("text/html"); + resp.setCharacterEncoding(StandardCharsets.UTF_8.name()); + + req.setAttribute("flights", flightService.findAll()); + req.getRequestDispatcher(JspHelper.getPath("flights")).forward(req, resp); + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/RegistrationServlet.java b/src/main/java/org/example/je/jdbc/servlet/RegistrationServlet.java new file mode 100644 index 0000000..b39769d --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/RegistrationServlet.java @@ -0,0 +1,41 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.example.je.jdbc.dto.CreateUserDto; +import org.example.je.jdbc.mapper.CreateUserMapper; +import org.example.je.jdbc.service.UserService; +import utils.JspHelper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@WebServlet("/registration") +public class RegistrationServlet extends HttpServlet { + private static UserService userService = UserService.getInstance(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.setAttribute("roles", List.of("ADMIN","USER")); + req.setAttribute("genders", List.of("MALE","FEMALE")); + req.getRequestDispatcher(JspHelper.getPath("registration")).forward(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + CreateUserDto userDto = CreateUserDto.builder() + .name(req.getParameter("name")) + .email(req.getParameter("email")) + .role(req.getParameter("role")) + .gender(req.getParameter("gender")) + .birthdate(req.getParameter("birthdate")) + .password(req.getParameter("password")) + .build(); + + userService.create(userDto); + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/SessionServlet.java b/src/main/java/org/example/je/jdbc/servlet/SessionServlet.java new file mode 100644 index 0000000..2ecaab0 --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/SessionServlet.java @@ -0,0 +1,30 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.example.je.jdbc.dto.UserDto; + +import java.io.IOException; + +@WebServlet("/session") +public class SessionServlet extends HttpServlet { + private static final String USER = "user"; + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + var session = req.getSession(); + var user = session.getAttribute(USER); + + if(user == null) { + user = UserDto.builder() + .id(5L) + .email("test@mail.com") + .build(); + //System.out.println(user.toString()); + } + + session.setAttribute(USER, user); + } +} diff --git a/src/main/java/org/example/je/jdbc/servlet/TicketServlet.java b/src/main/java/org/example/je/jdbc/servlet/TicketServlet.java new file mode 100644 index 0000000..2502b8a --- /dev/null +++ b/src/main/java/org/example/je/jdbc/servlet/TicketServlet.java @@ -0,0 +1,28 @@ +package org.example.je.jdbc.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.example.je.jdbc.service.TicketService; +import utils.JspHelper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@WebServlet("/tickets") +public class TicketServlet extends HttpServlet { + private static final TicketService ticketService= TicketService.getInstance(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Long flightId = Long.valueOf(req.getParameter("flight")); + + resp.setContentType("text/html"); + resp.setCharacterEncoding(StandardCharsets.UTF_8.name()); + + req.setAttribute("tickets", ticketService.findAllByFlightId(flightId)); + req.getRequestDispatcher(JspHelper.getPath("tickets")).forward(req, resp); + } +} diff --git a/src/main/java/utils/ConnectionManager.java b/src/main/java/utils/ConnectionManager.java new file mode 100644 index 0000000..de2d838 --- /dev/null +++ b/src/main/java/utils/ConnectionManager.java @@ -0,0 +1,70 @@ +package utils; + +import java.lang.reflect.Proxy; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +public final class ConnectionManager { + private static final String DB_URL_KEY = "db.url"; + private static final String DB_USER_KEY = "db.user"; + private static final String DB_PASSWORD_KEY = "db.password"; + private static final String DB_POOL_SIZE_KEY = "db.pool.size"; + private static final int DEFAULT_POOL_SIZE = 10; + private static BlockingQueue pool; + + static { + loadDriver(); + initConnectionPool(); + } + + private static void loadDriver() { + try { + Class.forName("org.postgresql.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private static void initConnectionPool() { + String poolSize = PropertiesUtil.get(DB_POOL_SIZE_KEY); + int size = poolSize == null ? DEFAULT_POOL_SIZE : Integer.parseInt(poolSize); + + pool = new ArrayBlockingQueue<>(size); + + for (int i = 0; i < size; i++) { + Connection connection = open(); + var proxyConnection = (Connection) Proxy.newProxyInstance(ConnectionManager.class.getClassLoader(), + new Class[]{Connection.class}, + (proxy, method, args) -> method.getName().equals("close") ? + pool.add((Connection) proxy) : + method.invoke(connection, args) + ); + pool.add(proxyConnection); + } + } + + public static Connection get() { + try { + return pool.take(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private static Connection open() { + try { + return DriverManager.getConnection(PropertiesUtil.get(DB_URL_KEY), + PropertiesUtil.get(DB_USER_KEY), + PropertiesUtil.get(DB_PASSWORD_KEY)); + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + private ConnectionManager() { + } +} diff --git a/src/main/java/utils/JspHelper.java b/src/main/java/utils/JspHelper.java new file mode 100644 index 0000000..3b427a0 --- /dev/null +++ b/src/main/java/utils/JspHelper.java @@ -0,0 +1,12 @@ +package utils; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class JspHelper { + private static final String JSP_FORMAT = "WEB-INF/jsp/%s.jsp"; + + public static String getPath(String jsp){ + return JSP_FORMAT.formatted(jsp); + } +} diff --git a/src/main/java/utils/LocalDateTimeFormatter.java b/src/main/java/utils/LocalDateTimeFormatter.java new file mode 100644 index 0000000..3f97935 --- /dev/null +++ b/src/main/java/utils/LocalDateTimeFormatter.java @@ -0,0 +1,30 @@ +package utils; + +import lombok.experimental.UtilityClass; + +import java.time.DateTimeException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Optional; + +@UtilityClass +public class LocalDateTimeFormatter { + private static final String PATTERN ="yyyy-MM-dd"; + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(PATTERN); + + public LocalDate format(String date) { + return LocalDate.parse(date, FORMATTER); + } + + public boolean isValid(String date){ + try { + return Optional.ofNullable(date) + .map(LocalDateTimeFormatter::format) + .isPresent(); + } + catch (DateTimeException exception){ + return false; + } + } +} + diff --git a/src/main/java/utils/PropertiesUtil.java b/src/main/java/utils/PropertiesUtil.java new file mode 100644 index 0000000..e94189b --- /dev/null +++ b/src/main/java/utils/PropertiesUtil.java @@ -0,0 +1,27 @@ +package utils; + +import java.io.IOException; +import java.util.Properties; + +public class PropertiesUtil { + private static final Properties PROPERTIES= new Properties(); + + static { + loadProperties(); + } + + private static void loadProperties() { + try (var inputStream = PropertiesUtil.class.getClassLoader().getResourceAsStream("application.properties")) { + PROPERTIES.load(inputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static String get(String key){ + return PROPERTIES.getProperty(key); + } + + private PropertiesUtil() { + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..d4466a6 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,4 @@ +db.url=jdbc:postgresql://localhost:5432/postgres +db.user=postgres +db.password=postgres +db.pool.size=5 \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/content.jsp b/src/main/webapp/WEB-INF/jsp/content.jsp new file mode 100644 index 0000000..dd7f4d0 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/content.jsp @@ -0,0 +1,18 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + title + + +

Проверка

+
+

Size: ${requestScope.flights.size()}

+

id: ${requestScope.flights[1].id()}

+

description: ${requestScope.flights[1].description()}

+

JSESSIONID: ${cookie.get("JSESSIONID")}

+

HEADER id: ${header["cookie"]}

+

PARAM id: ${param.id}

+

not empty: ${not empty flights}

+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/flights.jsp b/src/main/webapp/WEB-INF/jsp/flights.jsp new file mode 100644 index 0000000..065f4f1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/flights.jsp @@ -0,0 +1,22 @@ +<%@ page import="org.example.je.jdbc.service.TicketService"%> +<%@ page import="org.example.je.jdbc.dto.TicketDto"%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +<%@ taglib prefix="c" uri="jakarta.tags.core" %> +<%@ taglib prefix="fn" uri="jakarta.tags.functions" %> + + + + Полеты + + +

Полеты:

+
    + +
  1. ${flight.description()} +
  2. +
    +
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/registration.jsp b/src/main/webapp/WEB-INF/jsp/registration.jsp new file mode 100644 index 0000000..fa24e63 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/registration.jsp @@ -0,0 +1,46 @@ +<%@ page import="org.example.je.jdbc.service.TicketService"%> +<%@ page import="org.example.je.jdbc.dto.TicketDto"%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +<%@ taglib prefix="c" uri="jakarta.tags.core" %> +<%@ taglib prefix="fn" uri="jakarta.tags.functions" %> + + + + Регистрация + + +

Регистрация:

+
+
+

+ +
+

+ + +
+

+ +
+ + ${gender} + + +

+ +
+

+ +
+

+ + +
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/tickets.jsp b/src/main/webapp/WEB-INF/jsp/tickets.jsp new file mode 100644 index 0000000..c9805b3 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/tickets.jsp @@ -0,0 +1,21 @@ +<%@ page import="org.example.je.jdbc.service.TicketService"%> +<%@ page import="org.example.je.jdbc.dto.TicketDto"%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +<%@ taglib prefix="c" uri="jakarta.tags.core" %> +<%@ taglib prefix="fn" uri="jakarta.tags.functions" %> + + + + Билеты + + +

Билеты:

+
    + +
  1. ${ticket.seatNo()}
  2. +
    +
+ + + \ No newline at end of file