Этот репозиторий содержит все лабораторные работы по курсу Java. Корневой Maven-проект (формат WAR) объединяет ЛР 1–8, калькулятор на JavaFX, задания по XML, JDBC и Hibernate. В каталоге database/ лежат шесть независимых Maven-модулей — по одному на каждую требуемую СУБД (PostgreSQL, ClickHouse, MongoDB, Cassandra, Neo4j и Redis).
pom.xml— настройка сборки (Java 22, JavaFX, JDBC, Hibernate, Servlet/JSP).src/main/java/org/example/java/application/development— исходники всех лабораторных (lr1…lr8) и общие исключения.src/main/resources— вспомогательные данные: DTD/XML для ЛР7,hibernate.cfg.xmlдля ЛР8 и т.д.src/main/webapp— JSP, CSS и JS для веб-части ЛР8.database/— отдельные Maven-проекты для CRUD-демонстраций в разных СУБД.- Корневой
docker-compose.ymlподнимает PostgreSQL 16 для ЛР6 и ЛР8. Файлdatabase/docker-compose.ymlоставлен пустым под единый стек для модулей базы данных.
- Инструменты и сборка
- ЛР 1: Транспортные модели
- ЛР 2: Сериализация и ввод-вывод
- ЛР 3: Паттерны многопоточности
- ЛР 4: Сетевые серверы
- ЛР 5: Калькулятор на JavaFX
- ЛР 6: JDBC и музыкальный магазин
- ЛР 7: XML + HTML/CSS/JS
- ЛР 8: Hibernate + JSP + AJAX
- Набор лабораторных по базам данных
- Вспомогательные материалы
- Последнее обновление
- Требования: JDK 22+, Maven 3.9+, Docker Desktop (для поднятия БД).
- Полная сборка:
mvn -q clean package. WAR и JavaFX плагины подключены автоматически. - Запуск консольной ЛР:
mvn -q exec:java -Dexec.mainClass=полное.имя.Класса. - Запуск калькулятора:
mvn -q javafx:run(используетсяLab5Main). - Деплой веб-приложения ЛР8:
mvn -q package, далее развернутьtarget/untitled1-1.0-SNAPSHOT.warв Tomcat 10+ или другом Jakarta EE 10 контейнере. - Для ЛР6/ЛР8 перед запуском поднимите PostgreSQL:
docker compose up -dв корне. Модульdatabase/можно запускать либо с собственным compose, либо через одиночныеdocker run.
Файлы
lr1/TransportVehicle.java— интерфейс для работы с брендом, списком моделей и их ценами.lr1/Automobile.java— реализация на массивеModel[].lr1/Motorcycle.java— реализация на двусвязном кольцевом списке с фиктивным узломHEAD.lr1/Lab1Main.java— демо-сценарий.exception/*— исключения (DuplicateModelNameException,NoSuchModelNameException,ModelPriceOutOfBoundsException) и утилиты для печати.
Ключевые моменты
Automobileувеличивает массив черезArrays.copyOf, удаляет элементыSystem.arraycopyи строго проверяет цены (нельзяNaNи< 0).Motorcycleхранитsize, обновляетlastModified, добавляет модели прямо передHEAD, а удаление выполняет через перепривязку ссылок.TransportVehicleUtils.averagePriceаккуратно суммирует цены и возвращает0, если моделей нет.- В
Lab1Mainпоследовательно демонстрируются связанные операции и обработка исключений.
Как запустить
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr1.Lab1Main
Файлы
- Классы
lr2/повторяют интерфейсную модель, но реализуютSerializable. lr2/TransportVehicleUtils.java— двоичная и текстовая сериализация.lr2/Lab2Main.java— пример сохранения и восстановления из разных форматов.
Ключевые моменты
MotorcycleделаетlastModifiedtransientи восстанавливает значение вreadObject.TransportVehicleUtils.outputTransportVehicleпишет строки в UTF-8 с длиной,inputTransportVehicleсобираетAutomobile, вызываяaddModel.- Текстовые методы используют табуляцию, экранируют
\tи детально сообщают об ошибках формата. Lab2Mainпишет файлы вtarget/lr2/(vehicle.bin,vehicle.txt,vehicles.ser), используетSystem.in/outи проверяет сериализацию черезObjectInputStream.
Как запустить
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr2.Lab2Main
Файлы
lr3/Lab3Main.javaи помощники:ModelPrintingThread,PricePrintingThread,TransportSynchronizer,SequentialModelRunnable,SequentialPriceRunnable,BatchPrintCoordinator,ModelsBatchPrinter,PricesBatchPrinter,BrandPrinterTask,VehicleFromFileProducer.
Ключевые моменты
- Базовые потоки выводят модели и цены, выставляют приоритеты и при прерывании повторно вызывают
interrupt(). TransportSynchronizerсинхронизируется на приватномlock, чередует вывод модели и цены черезwait/notifyAllи методыcanPrintModel/canPrintPrice.BatchPrintCoordinatorдемонстрирует работуReentrantLockиCondition.runExecutorDemoиспользуетExecutorServiceс пулом на 2 потока.VehicleFromFileProducerсоздает файлы вtarget/lr3/brands/и показывает разницу междуputиaddпри заполненной очередиArrayBlockingQueue.
Как запустить
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr3.Lab3Main
Файлы
lr4/SequentialServer.javalr4/ParallelServer.javalr4/TransportClient.javalr4/TransportSamples.java
Ключевые моменты
- Последовательный сервер (порт 5000 по умолчанию) обслуживает по одному клиенту, принимает массив
TransportVehicle[], вычисляет среднюю цену и отправляетDouble. - Параллельный сервер (порт 5001) использует пул на четыре потока, разделяя вычисление со вспомогательным методом
SequentialServer.computeAverage. - Клиент собирает тестовый автопарк через
TransportSamples.createSampleFleet()и выводит ответ сервера.
Как запустить
- В одном терминале:
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr4.SequentialServer. - В другом:
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr4.TransportClient -Dexec.args="127.0.0.1 5000". - Для параллельной версии замените класс сервера.
Файлы
lr5/CalculatorApp.javalr5/Lab5Main.java
Ключевые моменты
- Используется одно поле
TextField display, куда последовательно выводятся ввод и результат. - Состояние хранится в
storedValue,pendingOperator,startNewNumber,errorState. processOperatorсразу считает предыдущую операцию (пример3 + 5 *),processSqrtблокирует отрицательные аргументы,applyOperationсодержит проверки деления на ноль и0^x.registerKeyboardShortcutsподдерживает цифры, десятичный разделитель, арифметические клавиши, Enter, Escape/Delete,R(корень) иP/^(степень); при ошибке выводитсяAlert.
Как запустить
mvn -q javafx:run
Файлы
lr6/Lab6Main.javalr6/DatabaseConfig.javalr6/MusicStoreRepository.javalr6/MusicStoreSql.javalr6/AlbumShortestTrack.java
Ключевые моменты
DatabaseConfig.fromEnv()читаетLR6_DB_URL,LR6_DB_USER,LR6_DB_PASSWORD(по умолчаниюjdbc:postgresql://localhost:5432/music_store,postgres/postgres).MusicStoreSqlсодержит DDL/seed-скрипты: последовательностьmusic_store_id_seq, таблицыartist,album,trackс ограничениями.MusicStoreRepositoryинкапсулируетPreparedStatement,JOIN LATERALдля поиска самой короткой композиции, CRUD по трекам и поиск альбома.AlbumShortestTrackхранит данные отчета и форматирует длительностьмм:сс.Lab6Mainпересоздает схему в транзакции, печатает отчет для треков ≥ 5 минут и демонстрирует CRUD.
Как запустить
docker compose up -d(корень).mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr6.Lab6Main.
Файлы
- Backend:
lr7/Lab7Main.java,StudentAverageCorrector.java,resources/.../student.dtd,student-sample.xml. - Frontend:
resources/.../web/index.html,result.html,styles.css,app.js,favorite-photo.jpg.
Ключевые моменты
Lab7Mainпринимает два пути (вход/выход), сохраняет DOCTYPE, включаетnamespaceAware, ошибки приводят кexit(3).StudentAverageCorrectorсуммируетmarkв<subject>, округляет среднее до двух знаков (HALF_UP) и удаляет<average>, когда предметов нет.- Веб-часть реализует требуемые страницы:
index.htmlс полями, подсказками, радио-кнопками;app.jsпишет вsessionStorageи переходит наresult.html, где таблица строится динамически, добавлена фотография и ссылка с hover-эффектом. Стили — вstyles.css.
Как запустить
- XML:
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr7.Lab7Main -Dexec.args="input.xml output.xml". - HTML/CSS/JS: открыть
src/main/resources/org/example/java/application/development/lr7/web/index.html.
Файлы
- Сущности:
lr8/entity/Artist.java,Album.java,Track.java. - Сервисы:
lr8/MusicStoreService.java,MusicStoreSeeder.java,AutocompleteItem.java,HibernateUtil.java. - CLI:
lr8/Lab8HibernateDemo.java. - Веб:
lr8/web/BaseServlet.java,CatalogServlet.java,ReportsServlet.java,AutocompleteServlet.java. - JSP/CSS/JS:
webapp/WEB-INF/jsp/catalog.jsp,reports.jsp,index.jsp,static/app.css,static/app.js. - Конфигурация:
resources/.../lr8/hibernate.cfg.xml,webapp/WEB-INF/web.xml.
Ключевые моменты
HibernateUtilподставляетenv.LR8_DB_*, если переменных окружения нет, и создаетSessionFactory.- Сущности используют
@SequenceGenerator, деля последовательность с JDBC-версией. MusicStoreServiceумеет дропать/создавать таблицы, выполнять CRUD, отчеты (queryAlbumWithShortestTrack,queryGenreTrackCount) и автодополнение.MusicStoreSeederдобавляет тестовые данные (2 артиста, 2 альбома, 4 трека).Lab8HibernateDemoзапускает сидирование, выводит список артистов/альбомов, обновляет и удаляет трек, печатает отчеты.- Веб-часть:
CatalogServletобслуживает формы (создание артиста/альбома, CRUD по трекам),ReportsServletпоказывает отчеты,AutocompleteServletвозвращает JSON дляstatic/app.js.
Как запустить
- Настройте
LR8_DB_URL/LR8_DB_USER/LR8_DB_PASSWORDили используйте контейнер из корня. - CLI:
mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr8.Lab8HibernateDemo. - Веб:
mvn -q package, развернуть WAR и открыть/musicи/reports.
Каждый каталог в database/ — отдельный Maven-проект. После запуска соответствующей СУБД выполните:
cd database/<db>
mvn -q exec:java
- Точка входа:
database/postgresql/.../PostgresCrudDemo.java. - Схема:
purchase_orderиorder_line(FK,RETURNING id). - Сценарий: пересоздать таблицы, добавить заказ и позиции, вывести список, обновить количество, удалить позицию, показать отчеты (заказы по клиентам и суммы по товарам).
- Переменные:
PG_URL,PG_USER,PG_PASSWORD(дефолтjdbc:postgresql://localhost:5432/lr_postgres,postgres/postgres).
- Точка входа:
database/clickhouse/.../ClickHouseCrudDemo.java. - MergeTree-таблица
citiesс сортировкой(country, name). - Сценарий:
DROP/CREATE, вставки,ALTER ... UPDATE,ALTER ... DELETE, выборка иGROUP BY country. - Переменные:
CH_URL,CH_USER,CH_PASSWORD.
- Точка входа:
database/mongodb/.../MongoCrudDemo.java. - Коллекция
booksв базеlr_mongo,_id= ISBN. - Сценарий: очистить коллекцию, вставить записи, прочитать, попытаться обновить год, удалить документ и выполнить агрегацию по годам.
- Переменная:
MONGO_URI(по умолчаниюmongodb://localhost:27017). - Примечание: методы
updateYearиrunReportsпока используют заглушки""; замените их на реальные операторы ($set,$group,$sort) перед запуском на сервере.
- Точка входа:
database/cassandra/.../CassandraCrudDemo.java. - Кейспейс
lr_cassandra, таблицаsensors(id text PRIMARY KEY, location text, last_value double). - Сценарий: пересоздать кейспейс, добавить датчики, прочитать, обновить расположение, удалить запись, вывести список идентификаторов.
- Переменные:
CASSANDRA_HOST,CASSANDRA_PORT,CASSANDRA_DC.
- Точка входа:
database/neo4j/.../Neo4jCrudDemo.java. - Модель: вершины
Person, ребраFRIEND. - Сценарий: очистить граф, создать людей, связать, вывести, обновить возраст, удалить связь и показать отчеты (старше 25, количество друзей).
- Переменные:
NEO4J_URI,NEO4J_USER,NEO4J_PASSWORD.
- В
database/redisпока толькоpom.xmlс зависимостью Jedis иREADME.mdс планом (CRUD на HASH/SET/ZSET). РеализацииRedisCrudDemo.javaнет — добавьте по образцу других модулей.
- Пакет
exceptionсодержит общие исключения иTransportVehicleUtils. src/main/java/.../Main.java— отдельный скрипт Robot, нажимающий клавиши 1-2-3 (к лабораторным не относится).- ЛР2 и ЛР3 создают временные каталоги
target/lr2иtarget/lr3/brands. - Корневой
docker-compose.ymlразворачивает PostgreSQL 16 с volumepostgres-data.
Последнее обновление: 2026-01-14.