Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Лабораторные работы по Java

Этот репозиторий содержит все лабораторные работы по курсу 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 — исходники всех лабораторных (lr1lr8) и общие исключения.
  • 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 оставлен пустым под единый стек для модулей базы данных.

Содержание

Инструменты и сборка

  • Требования: 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.

ЛР 1: Транспортные модели

Файлы

  • 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

ЛР 2: Сериализация и ввод-вывод

Файлы

  • Классы lr2/ повторяют интерфейсную модель, но реализуют Serializable.
  • lr2/TransportVehicleUtils.java — двоичная и текстовая сериализация.
  • lr2/Lab2Main.java — пример сохранения и восстановления из разных форматов.

Ключевые моменты

  • Motorcycle делает lastModified transient и восстанавливает значение в 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

ЛР 3: Паттерны многопоточности

Файлы

  • 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

ЛР 4: Сетевые серверы

Файлы

  • lr4/SequentialServer.java
  • lr4/ParallelServer.java
  • lr4/TransportClient.java
  • lr4/TransportSamples.java

Ключевые моменты

  • Последовательный сервер (порт 5000 по умолчанию) обслуживает по одному клиенту, принимает массив TransportVehicle[], вычисляет среднюю цену и отправляет Double.
  • Параллельный сервер (порт 5001) использует пул на четыре потока, разделяя вычисление со вспомогательным методом SequentialServer.computeAverage.
  • Клиент собирает тестовый автопарк через TransportSamples.createSampleFleet() и выводит ответ сервера.

Как запустить

  1. В одном терминале: mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr4.SequentialServer.
  2. В другом: mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr4.TransportClient -Dexec.args="127.0.0.1 5000".
  3. Для параллельной версии замените класс сервера.

ЛР 5: Калькулятор на JavaFX

Файлы

  • lr5/CalculatorApp.java
  • lr5/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

ЛР 6: JDBC и музыкальный магазин

Файлы

  • lr6/Lab6Main.java
  • lr6/DatabaseConfig.java
  • lr6/MusicStoreRepository.java
  • lr6/MusicStoreSql.java
  • lr6/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.

Как запустить

  1. docker compose up -d (корень).
  2. mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr6.Lab6Main.

ЛР 7: XML + HTML/CSS/JS

Файлы

  • 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.

ЛР 8: Hibernate + JSP + AJAX

Файлы

  • Сущности: 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.

Как запустить

  1. Настройте LR8_DB_URL/LR8_DB_USER/LR8_DB_PASSWORD или используйте контейнер из корня.
  2. CLI: mvn -q exec:java -Dexec.mainClass=org.example.java.application.development.lr8.Lab8HibernateDemo.
  3. Веб: mvn -q package, развернуть WAR и открыть /music и /reports.

Набор лабораторных по базам данных

Каждый каталог в database/ — отдельный Maven-проект. После запуска соответствующей СУБД выполните:

cd database/<db>
mvn -q exec:java

PostgreSQL

  • Точка входа: 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).

ClickHouse

  • Точка входа: database/clickhouse/.../ClickHouseCrudDemo.java.
  • MergeTree-таблица cities с сортировкой (country, name).
  • Сценарий: DROP/CREATE, вставки, ALTER ... UPDATE, ALTER ... DELETE, выборка и GROUP BY country.
  • Переменные: CH_URL, CH_USER, CH_PASSWORD.

MongoDB

  • Точка входа: database/mongodb/.../MongoCrudDemo.java.
  • Коллекция books в базе lr_mongo, _id = ISBN.
  • Сценарий: очистить коллекцию, вставить записи, прочитать, попытаться обновить год, удалить документ и выполнить агрегацию по годам.
  • Переменная: MONGO_URI (по умолчанию mongodb://localhost:27017).
  • Примечание: методы updateYear и runReports пока используют заглушки ""; замените их на реальные операторы ($set, $group, $sort) перед запуском на сервере.

Cassandra

  • Точка входа: database/cassandra/.../CassandraCrudDemo.java.
  • Кейспейс lr_cassandra, таблица sensors(id text PRIMARY KEY, location text, last_value double).
  • Сценарий: пересоздать кейспейс, добавить датчики, прочитать, обновить расположение, удалить запись, вывести список идентификаторов.
  • Переменные: CASSANDRA_HOST, CASSANDRA_PORT, CASSANDRA_DC.

Neo4j

  • Точка входа: database/neo4j/.../Neo4jCrudDemo.java.
  • Модель: вершины Person, ребра FRIEND.
  • Сценарий: очистить граф, создать людей, связать, вывести, обновить возраст, удалить связь и показать отчеты (старше 25, количество друзей).
  • Переменные: NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD.

Redis (заготовка)

  • В 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 с volume postgres-data.

Последнее обновление

Последнее обновление: 2026-01-14.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages