Навчальний проєкт на Java, який демонструє основні можливості Servlet API. Застосунок — простий CRUD для сутності Employee (працівник) з веб-інтерфейсом на JSP.
| Технологія | Де подивитися | Що робить |
|---|---|---|
| Servlets | servlet/ |
Обробляють HTTP-запити (GET, POST). Кожен сервлет — окрема сторінка або дія |
| Filters | filter/ |
Перехоплюють запити до того, як вони потраплять у сервлет. Використовуються для авторизації та логування |
| Listeners | listener/ |
Реагують на події: старт застосунку, створення/видалення сесії, вхідний запит |
| JSP + JSTL | webapp/WEB-INF/views/ |
Шаблони HTML-сторінок. JSTL (<c:forEach>, <c:if>) дозволяє використовувати цикли та умови прямо в HTML |
| RequestDispatcher | ViewServlet.java та ін. |
forward() — передає запит із сервлета в JSP для відмальовування. jsp:include — вставляє спільний header/footer |
| Error Pages | webapp/WEB-INF/error/ |
Кастомні сторінки помилок 404 та 500, налаштовані у web.xml |
| File Upload | FileUploadServlet.java |
Завантаження файлів через @MultipartConfig |
| web.xml | webapp/WEB-INF/web.xml |
Дескриптор розгортання — конфігурація застосунку (параметри, error pages) |
src/main/java/com/example/demo/
│
├── auth/ # Автентифікація
│ ├── LoginServlet.java # Сторінка входу (GET — форма, POST — перевірка логіна)
│ └── LogoutServlet.java # Вихід — видаляє сесію та cookie
│
├── filter/ # Фільтри (перехоплюють УСІ запити)
│ ├── AuthenticationFilter.java # Перевіряє, чи авторизований користувач
│ └── RequestLoggingFilter.java # Логує кожен запит у консоль
│
├── listener/ # Слухачі подій
│ ├── AppContextListener.java # Викликається при старті/зупинці застосунку
│ ├── SessionListener.java # Викликається при створенні/видаленні сесії
│ └── RequestListener.java # Викликається при кожному HTTP-запиті
│
├── model/
│ └── Employee.java # Модель даних (id, name, email, country)
│
├── repository/
│ └── EmployeeRepository.java # Робота з БД через JDBC (SQL-запити)
│
├── servlet/ # Основні сервлети
│ ├── ViewServlet.java # Список усіх працівників
│ ├── ViewByIDServlet.java # Деталі одного працівника
│ ├── SaveServlet.java # Створення нового працівника
│ ├── EditEmployeeServlet.java # Редагування працівника
│ ├── PutServlet.java # Збереження змін
│ ├── DeleteServlet.java # Видалення працівника
│ └── FileUploadServlet.java # Завантаження файлів
│
└── util/
└── DatabaseCheck.java # Перевірка підключення до БД
src/main/webapp/WEB-INF/
├── views/ # JSP-сторінки
│ ├── header.jsp # Спільна шапка (підключається через jsp:include)
│ ├── footer.jsp # Спільний підвал
│ ├── login.jsp # Форма входу
│ ├── employeeList.jsp # Таблиця всіх працівників
│ ├── employeeDetail.jsp # Картка працівника
│ ├── employeeForm.jsp # Форма створення/редагування
│ └── upload.jsp # Форма завантаження файлу
├── error/
│ ├── 404.jsp # Сторінка «Не знайдено»
│ └── 500.jsp # Сторінка «Помилка сервера»
└── web.xml # Конфігурація застосунку
Браузер → Filter → Servlet → Repository → БД
↓
RequestDispatcher.forward()
↓
JSP-сторінка → HTML → Браузер
- Користувач відкриває URL, наприклад
/demo/viewServlet - Filter перехоплює запит — перевіряє авторизацію, логує
- Servlet отримує запит, звертається до Repository за даними з БД
- Servlet кладе дані у
request.setAttribute()і викликаєforward()на JSP - JSP генерує HTML, використовуючи дані з request, і надсилає відповідь у браузер
- При спробі зайти на захищену сторінку без авторизації — редирект на
/demo/loginServlet - Публічні сторінки (перегляд списку та деталей працівника) доступні без входу
- Для редагування, створення, видалення та завантаження файлів потрібно увійти
| Сторінка | URL | Потрібен логін? |
|---|---|---|
| Список працівників | /demo/viewServlet |
Ні |
| Деталі працівника | /demo/viewByIDServlet?id=1 |
Ні |
| Створити працівника | /demo/saveServlet |
Так |
| Редагувати | /demo/editEmployee?id=1 |
Так |
| Видалити | /demo/deleteServlet?id=1 |
Так |
| Завантаження файлу | /demo/uploadServlet |
Так |
| Вхід | /demo/loginServlet |
Ні |
| Вихід | /demo/logoutServlet |
— |
Логін: admin Пароль: password
Облікові дані налаштовуються у файлі
web.xml(параметриapp.auth.userтаapp.auth.password).
Найпростіший спосіб — Docker піднімає і базу даних, і сервер автоматично.
- Java 17+ — завантажити
- Maven — завантажити
- Docker Desktop — завантажити
Крок 1. Клонуйте репозиторій:
git clone https://github.com/OKaluzny/servletApp.git
cd servletAppКрок 2. Зберіть проєкт (створить файл target/demo.war):
mvn clean packageКрок 3. Запустіть контейнери:
docker-compose up -dЦя команда підніме два контейнери:
- PostgreSQL — база даних на порту
5432 - WildFly — сервер застосунків на порту
8080
Крок 4. Зачекайте ~15 секунд і перевірте, що все запустилося:
docker-compose psОбидва контейнери мають бути у статусі Up.
Крок 5. Відкрийте у браузері:
http://localhost:8080/demo/viewServlet
Або скористайтеся скриптом, який виконає кроки 2-4 автоматично:
# Linux/Mac ./docker-build.sh # Windows docker-build.bat
# Переглянути логи сервера (Ctrl+C щоб вийти)
docker-compose logs -f wildfly
# Зупинити все
docker-compose down
# Перезібрати після змін у коді
mvn clean package && docker-compose restart wildflyЯкщо Docker не встановлено, можна налаштувати все вручну.
- Java 17+
- Maven
- PostgreSQL — завантажити
- WildFly 29 — завантажити
Відкрийте термінал PostgreSQL (psql) і виконайте:
CREATE DATABASE employee;
\c employee;
CREATE TABLE IF NOT EXISTS public.users
(
id SERIAL PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
country VARCHAR(255)
);mvn clean packageПерейдіть до теки WildFly та запустіть сервер:
cd wildfly-29.0.1.Final/bin
./standalone.sh # Linux/Mac
standalone.bat # WindowsВ іншому терміналі, з теки проєкту:
mvn org.wildfly.plugins:wildfly-maven-plugin:4.2.0.Final:deployhttp://localhost:8080/demo/viewServlet
Щоб IDE підказувала SQL-запити, підключіть її до PostgreSQL.
- View → Tool Windows → Database
- Натисніть + → Data Source → PostgreSQL
- Заповніть:
- Host:
localhost - Port:
5432 - Database:
employee - User:
postgres - Password:
postgres
- Host:
- Натисніть Test Connection, потім OK
Використовуйте JDBC URL:
jdbc:postgresql://localhost:5432/employee
Логін: postgres, пароль: postgres
- Java 17
- Jakarta Servlet API 6.0
- JSP 3.1 + JSTL 3.0
- PostgreSQL 15
- WildFly 29
- Maven
- Docker Compose
- JUnit 6