ВВЕДЕНИЕ
На сегодняшний день активно развивается направление информационных технологий, благодаря чему расширяются стороны её применения в человеческой деятельности. С развитием сетевых технологий и всеобщим проникновением Интернета значительная часть программного обеспечения стала доступна через онлайн-сервисы. Теперь пользователи не обязаны устанавливать приложения на свои локальные компьютеры или портативные устройства, так как для пользования ими достаточно иметь доступ в Интернет. Этот подход позволяет использовать широкий спектр ресурсов, предоставляемых сетью, без необходимости загружать и устанавливать программы локально. Все нужно лишь подключение к Интернету, чтобы получить доступ к разнообразным сервисам и использовать их функциональность.
На данный момент современные технологии позволяют людям по всему миру свободно обмениваться различными видами информации, будь то текстовые сообщения, мультимедийные файлы или звонки. Историческим прародителем этих средств коммуникации можно считать телефон, который стал настоящей революцией в области дистанционного общения. В отличие от телеграфа и почты, которые требовали времени для передачи сообщений, телефон позволил людям общаться мгновенно и в реальном времени. Это открыло новые возможности для общения и связи, сократило расстояния и сделало удаленное общение более близким. Теперь люди могут легко устанавливать контакт с собеседниками на противоположном конце земного шара и обмениваться информацией в режиме, близком к прямому общению. Технологии продолжают развиваться, и с каждым днем возможности для коммуникации становятся еще более широкими и доступными.
Прогресс в области информационных технологий и баз данных привел к созданию сложных систем, способных обрабатывать и анализировать огромные объемы информации, хранящейся на внешних устройствах. Такие системы основаны на использовании таблиц в качестве структур данных для хранения и организации информации. Таблицы предоставляют удобный способ организации и доступа к данным, позволяя эффективно обрабатывать большие объемы информации. Автоматизация практически всех видов деятельности основывается по типу реляционной базы данных, что разрешает укоротить экономические и ресурсоемкие затраты, что, безусловно, представляется актуальной проблемой в сегодняшнее время.
Java – это язык программирования общего назначения, предназначенный с целью, чтобы программисты могли писать один раз и запускать где угодно созданный код. Это означает, что скомпилированный Java-код может быть выполнен на любой платформе, поддерживающей Java, без необходимости повторной компиляции. Язык Java является фундаментом для разработки широкого спектра сетевых приложений и стандартом для создания интегрированных приложений, мобильных приложений, веб-контента, видеоигр и корпоративного программного обеспечения.
Основным фокусом данного исследования является разработка клиент-серверных приложений с использованием сетевых технологий.
Цель работы: создание кроссплатформенной сетевой системы для хранения персонифицированных данных о клиентах, основанной на клиент-серверном взаимодействии.
Для достижения поставленной цели необходимо решить ряд задач:
1. Провести анализ различных подходов к разработке клиент-серверных приложений на языке Java, чтобы определить наиболее эффективные и подходящие под требования данного проекта
2. Выявить критерии для выбора инструментов разработки и обосновать выбранную технологию разработки клиент-серверных приложений
3. Реализовать клиентскую и серверную части приложения «Сетевая система хранения персонифицированных данных о клиентах», обеспечивая надежное взаимодействие и передачу данных по сети на языке Java
4. Протестировать разработанное приложение, через практическую визуализацию (Интерфейс)
5. Провести итоговую оценку разработанного приложения, обосновать вывод
Архитектура «Клиент-Сервер» (также известная как «сеть Клиент-Сервер» или «модель Клиент-Сервер») обеспечивает разделение процессов, предоставление услуг и отправку запросов на различные компьютеры в сети. Каждый компьютер выполняет свои задачи независимо от других.
В рамках архитектуры «Клиент-Сервер» несколько компьютеров-клиентов (удаленные системы) отправляют запросы и получают услуги от специализированного компьютера – сервера (server – англ. «обслуживание»), который также может называться хостом (host system, от host – англ. «хозяин»).
Клиентская машина предоставляет пользователю интуитивно понятный интерфейс, облегчающий взаимодействие с сервером.
Рисунок 1.1 Архитектура "Клиент-Сервер"
Когда речь заходит о клиент-серверных приложениях, их архитектура обычно состоит из трех ключевых компонентов. Эти компоненты тесно взаимодействуют между собой, обеспечивая эффективное взаимодействие между клиентом и сервером:
• Первым компонентом является клиент, который представляет собой интерфейс пользователя. Клиентский компонент обычно отвечает за ввод данных пользователем, отображение информации и взаимодействие с сервером. Он может быть представлен в виде десктопного приложения, мобильного приложения или веб-интерфейса.
• Вторым компонентом является сервер, который отвечает за обработку запросов от клиента и предоставление необходимых данных и услуг. Серверный компонент может включать в себя базу данных для хранения информации, бизнес-логику для обработки запросов и другие служебные функции.
• Третий компонент, который является основой клиент-серверной архитектуры, называется сеть. Сеть обеспечивает связь между клиентом и сервером, позволяя передавать данные и команды между ними. Сетевой компонент может быть реализован с использованием различных протоколов и технологий, таких как TCP/IP, HTTP, REST и других.
Перед тем, как приступить к разработке серверной архитектуры приложения, необходимо провести анализ и определить требования, которым должна отвечать данная архитектура. Эти требования могут быть разделены на функциональные и нефункциональные.
Функциональные требования определяют возможности программного интерфейса приложения и описывают сценарии взаимодействия пользователя с системой. Это включает функции, которые приложение должно выполнять, операции, которые пользователь может выполнять, и результаты, которые приложение должно предоставлять. Например, функциональные требования могут определять возможность регистрации пользователя, аутентификации, выполнения определенных операций и прочее.
Нефункциональные требования, с другой стороны, накладывают ограничения на систему, которые не связаны с ее поведением. Это могут быть требования к производительности, безопасности, масштабируемости, надежности и другим аспектам системы. Нефункциональные требования определяют ограничения, которым должна соответствовать архитектура приложения, чтобы обеспечить эффективность и надежность работы системы. Например, нефункциональные требования могут определять максимальное время ответа сервера, требования к защите данных и пропускную способность сети.
Анализ и установление этих требований перед разработкой серверной архитектуры позволяет создать систему, которая соответствует ожиданиям пользователей и обеспечивает требуемый уровень производительности и безопасности. Такой подход позволяет создать эффективную и надежную архитектуру приложения, которая успешно справляется с поставленными задачами и удовлетворяет потребности пользователей [1].
Было проведено исследование важной составляющей приложения - API (Application Programming Interface). Результаты этого исследования представлены в таблице 1.1, где приведены основные характеристики и возможности API.
Также был определен ряд нефункциональных требований к системе, которые приведены в (таблице 1.2).
Таблица 1.1 Функциональные требования к системе [2].
№ |
Требование |
Описание |
1 |
Регистрация и автоматизация пользователей |
Это процесс, который позволяет пользователям создавать учетные записи и использовать автоматические системы для управления их аккаунтами. Эта функциональность обеспечивает удобство и эффективность взаимодействия пользователей с приложением или веб-сервисом. При регистрации пользователь предоставляет необходимую информацию, такую как имя, адрес электронной почты и пароль. Затем система проверяет эти данные и создает уникальную учетную запись для пользователя. Регистрация может быть дополнена дополнительными шагами, такими как подтверждение по электронной почте или проверка идентификационных документов |
2 |
Группировка файлов в папки |
Это процесс организации и структурирования файловой системы, позволяющий пользователям упорядочить и хранить свои файлы в логически связанных группах. При группировке файлов в папки пользователь создает новую папку и присваивает ей имя, отражающее содержимое файлов, которые будут помещены внутрь. Это может быть похоже на создание разделов или категорий для удобства организации информации |
3 |
Просмотр и изменение метаданных |
Просмотр и изменение метаданных представляет собой процесс, позволяющий пользователям получать информацию о файлах или ресурсах, а также вносить изменения в эти данные. Метаданные — это информация о файле, которая несет в себе дополнительные сведения о его характеристиках, свойствах или содержании. К ним могут относиться информация о размере файла, дате создания или последней модификации, авторе, разрешениях доступа и другие атрибуты. Просмотр и изменение метаданных позволяют пользователям получать полноту информации о файле и вносить корректировки, если необходимо |
4 |
Удаление файлов и папок |
Удаление файлов и папок является неотъемлемой частью управления файловой системой и позволяет пользователям освободить пространство, обеспечить порядок и безопасность данных. Правильное использование этой функции помогает поддерживать эффективное управление файлами и облегчает работу с информацией на компьютере или других устройствах хранения данных |
5 |
Организация корзины |
Это функциональность, предоставляемая операционными системами и некоторыми программами, для временного хранения удаленных файлов и папок перед их окончательным удалением из файловой системы. Когда пользователь удаляет файлы или папки, они обычно перемещаются в специальную папку, называемую корзиной. Корзина действует как промежуточное хранилище для удаленных объектов, позволяя пользователю восстановить их, если удаление было совершено по ошибке или если позже возникла необходимость в восстановлении |
6 |
Поиск данных |
Это процесс нахождения и извлечения конкретной информации из большого объема данных, который может быть хранен в файловых системах, базах данных, сетевых ресурсах и других источниках. Он является неотъемлемой частью многих приложений и систем, позволяя пользователям быстро находить нужные данные и получать актуальные результаты |
7 |
Обмен файлами |
Это процесс передачи и обмена файлов между различными участниками или системами. Он играет важную роль в современной информационной среде, позволяя пользователям передавать, получать и синхронизировать файлы с другими людьми или устройствами |
Таблица 1.2 Нефункциональные требования к системе
№ |
Требование |
Описание |
1 |
Удобство использования |
Удобство использования API в значительной степени зависит от его понятности и простоты. Хорошо спроектированный API должен быть легко понятным и интуитивно понятным для разработчиков, которые будут его использовать. Он должен предоставлять понятные и логичные названия методов, параметров и структур данных |
2 |
Разграничение доступа |
Это процесс установления и контроля уровней доступа различных пользователей или приложений к функциям и данным, предоставляемым через API. Оно позволяет ограничить доступ к конфиденциальной информации, управлять правами доступа и обеспечить безопасность взаимодействия с API |
3 |
Ограничение на объем хранимых и передаваемых файлов |
Этот процесс является важным аспектом, который позволяет контролировать размер и количество файлов, которые могут быть сохранены или переданы через API. Это позволяет оптимизировать использование ресурсов сервера, обеспечить эффективность работы и предотвратить возможные проблемы, связанные с превышением лимитов хранения и передачи данных |
4 |
Шифрование данных при их передаче |
Этот процесс является важным механизмом для обеспечения безопасности и конфиденциальности информации. Шифрование позволяет защитить данные от несанкционированного доступа и предотвратить возможность их перехвата и раскрытия в процессе передачи по сети |
5 |
Надёжность |
Система должна быть надежной и способной продолжать функционирование даже при возникновении внештатных ситуаций. Разработанное приложение должно быть устойчивым к сбоям и обеспечивать корректное восстановление после сбоев |
6 |
Простота тестирования |
Это качество является ключевым аспектом, которое оценивается в контексте его функционирования и предоставления доступа к функциям и данным. Надежное API должно быть стабильным, устойчивым к сбоям и обеспечивать непрерывное и надежное взаимодействие между клиентскими приложениями и сервером. |
7 |
Открытый программный код |
Открытый программный код API (Application Programming Interface) представляет собой концепцию, в которой исходный код API доступен для общественности, обеспечивая прозрачность и возможность участия сообщества разработчиков. Открытый код API открывает двери для совместной работы, инноваций и улучшений функциональности. |
На компьютере пользователя установлена специальная клиентская программа, которая выполняет функцию отображения информации на экране и обработки пользовательского ввода. Серверное программное обеспечение, работающее на сервере, отвечает за обработку входящих данных и предоставление доступа к необходимой информации. Например, пользователь может создать запрос к базе данных на своем компьютере, а клиентское приложение отправит этот запрос по сети на сервер. Затем сервер базы данных выполнит поиск и вернет соответствующую запрошенную информацию обратно клиентскому приложению [3].
В расширенной версии такая система предполагает использование компьютерной сети и распределенной базы данных. Распределенная система управления (РСУ) — это программный комплекс, предназначенный для управления распределенными базами данных и обеспечения координации между различными узлами или устройствами в сети. Основная идея РСУ заключается в том, чтобы объединить несколько автономных баз данных в единую систему, позволяющую эффективно хранить, обрабатывать и обмениваться данными.
Сервер – это высокопроизводительный компьютер или программное обеспечение, которое предоставляет доступ к определенным ресурсам или услугам другим компьютерам, называемым клиентами. Основная функция сервера заключается в обработке запросов, предоставлении данных или выполнении задач, запрашиваемых клиентами. Серверы играют важную роль в компьютерных сетях, обеспечивая централизованное управление и координацию различных ресурсов. Они могут быть специализированными для конкретных задач, например, серверы баз данных, серверы веб-сайтов, серверы файлового доступа или серверы электронной почты. Каждый тип сервера выполняет свои уникальные функции, связанные с обработкой и предоставлением соответствующих данных или услуг [4].
В традиционной клиент-серверной архитектуре основные компоненты приложения разделены между клиентской и серверной сторонами, которые представляют собой отдельные физические программные сущности.
Компания Gartner Group, международный лидер в области исследований и консультаций в сфере информационных технологий, выделяет пять ключевых типов взаимодействий клиент-серверных систем:
Запрос-ответ (Request-Response): это самый распространенный и простой тип взаимодействия, где клиент отправляет запрос серверу, а сервер отвечает на этот запрос, предоставляя необходимую информацию или выполняя запрошенную операцию.
Пуш-уведомление (Push-Notification): В этом типе взаимодействия сервер активно отправляет уведомления клиентам без предварительного запроса. Это может быть полезно для мгновенной доставки важных данных или обновлений.
Подписка-уведомление (Subscribe-Notification): здесь клиент подписывается на определенные события или изменения на сервере, и сервер отправляет уведомления клиенту, когда эти события происходят. Это позволяет клиенту быть в курсе последних обновлений без необходимости постоянного опроса сервера.
Отправка-обработка (Send-Process): В этом типе взаимодействия клиент отправляет данные или запрос на сервер, а сервер принимает эти данные и обрабатывает их в фоновом режиме, без необходимости немедленного ответа клиенту.
Событийно-ориентированное (Event-Driven): В данном случае сервер и клиент взаимодействуют на основе возникновения определенных событий или изменений. Когда такое событие происходит на сервере, сервер оповещает клиента, и тот может выполнить соответствующие действия [5].
Рисунок 1.2 Модели взаимодействия двухзвенной (двухуровневой) архитектуры клиент-сервер
Преимущества двухуровневой архитектуры:
Масштабируемость и гибкость: Двухуровневая архитектура обеспечивает гибкость и масштабируемость системы. Клиенты и серверы могут разрабатываться и масштабироваться независимо друг от друга. Это позволяет легко добавлять новых клиентов или серверы, распределять нагрузку и управлять ресурсами системы в зависимости от потребностей;
Разделение ответственности: Клиенты и серверы выполняют разные роли в системе, что позволяет четко определить ответственности каждой стороны. Клиенты отвечают за представление данных и взаимодействие с пользователем, в то время как серверы обеспечивают обработку запросов и предоставление данных или услуг. Это способствует лучшей организации кода, облегчает сопровождение и разработку приложения;
Легкая интеграция: Двухуровневая архитектура позволяет легко интегрировать различные клиентские и серверные компоненты. Клиенты могут быть разработаны для разных платформ или устройств, а серверы могут предоставлять данные или услуги через различные протоколы или API. Это упрощает интеграцию с другими системами и создание гибких и расширяемых приложений;
Улучшенная безопасность: Двухуровневая архитектура способствует улучшению безопасности системы. Серверы могут реализовывать механизмы аутентификации и авторизации, контролируя доступ клиентов к данным или услугам. Это позволяет защитить конфиденциальность и целостность данных, а также предотвратить несанкционированный доступ;
Недостатки двухуровневой архитектуры:
Одно точка отказа: В двухуровневой архитектуре сервер является центральной точкой обработки и предоставления данных или услуг клиентам. Если сервер испытывает сбой или неспособен обрабатывать запросы, то это может привести к проблемам доступности и производительности для всех клиентов. Единственная точка отказа может оказаться критическим фактором для систем с высокими требованиями к доступности и надежности;
Пропускная способность: В двухуровневой архитектуре процесс передачи данных происходит между клиентами и сервером. Это может создавать узкие места и ограничивать пропускную способность системы. При обработке большого количества запросов или передаче больших объемов данных, может возникать проблема с производительностью и задержками в ответах;
Зависимость от сети: В двухуровневой архитектуре клиенты и серверы общаются по сети, и стабильное соединение требуется для эффективного функционирования системы. Проблемы с сетью, такие как отсутствие связи, низкая пропускная способность или задержки, могут негативно сказаться на производительности и доступности системы;
Многоуровневая архитектура, также известная как N-tier или трехзвенная архитектура, представляет собой развитие концепции клиент-серверной архитектуры. В отличие от двухуровневой архитектуры, где клиенты и серверы являются основными компонентами, многоуровневая архитектура включает дополнительные уровни обработки данных, которые помогают улучшить масштабируемость, производительность и сопровождаемость системы [6].
Рисунок 1.3 Многоуровневая архитектура клиент-сервер
Преимущества многоуровневой архитектуры:
Разделение обязанностей: Многоуровневая архитектура позволяет четко разделить обязанности между различными уровнями. Каждый уровень отвечает за определенные задачи и функции, что облегчает организацию кода, улучшает его читаемость и понятность. Разделение обязанностей также способствует повторному использованию кода и облегчает сопровождение системы;
Масштабируемость и производительность: Многоуровневая архитектура обеспечивает возможность горизонтального масштабирования каждого уровня независимо. Это позволяет управлять нагрузкой, добавлять новые экземпляры каждого уровня и распределять запросы между ними. Такой подход повышает производительность системы и позволяет ей эффективно масштабироваться с ростом требований и нагрузки;
Гибкость и модульность: Многоуровневая архитектура способствует гибкости и модульности системы. Каждый уровень может быть разработан, тестирован и обновлен независимо от других. Это позволяет легко вносить изменения в отдельные компоненты без воздействия на всю систему. Например, можно обновить сервер приложений, не затрагивая клиентскую часть. Гибкость и модульность способствуют более эффективной разработке и сопровождению системы;
Улучшенная безопасность: Многоуровневая архитектура способствует улучшению безопасности системы. Каждый уровень может быть защищен собственными механизмами безопасности, такими как аутентификация, авторизация и шифрование. Это позволяет создавать более надежные системы и уменьшает риск несанкционированного доступа к данным или функциональности;
Недостатки многоуровневой архитектуры:
Сложность: Многоуровневая архитектура может быть более сложной в проектировании и разработке по сравнению с более простыми моделями. Разделение функций и ответственности между различными уровнями требует дополнительной проработки и понимания взаимодействия между ними. Это может повлечь за собой увеличение сложности архитектурного процесса и затрат времени на разработку;
Затраты на инфраструктуру: Многоуровневая архитектура может потребовать наличия и поддержки дополнительных компонентов, таких как серверы приложений и базы данных, на каждом уровне. Это может повлечь за собой дополнительные затраты на инфраструктуру и поддержку системы. Более высокие затраты могут быть особенно заметны в масштабных проектах или в случае использования специализированных решений
Клиент-серверная система, в которой информация передается и хранится между уровнями, требует высокого уровня безопасности для обеспечения конфиденциальности, целостности и доступности данных. Важно принимать меры для защиты информации на каждом этапе передачи и хранения данных в системе [7].
В настоящее время технология клиент-сервер становится все более популярной. Она предоставляет общую концепцию для организации современных распределенных информационных систем, но реализация этой технологии может значительно различаться в различных программах и типах программного обеспечения.
Одним из ключевых преимуществ клиент-серверных информационных систем является распределение функций и ответственности между клиентской и серверной сторонами. В такой системе клиент – это компьютер или устройство, использующее приложение или сервис, в то время как сервер – это специализированный компьютер или программное обеспечение, предоставляющее ресурсы или услуги клиентам.
Уникальность клиент-серверных информационных систем заключается в том, что клиентская сторона отвечает за интерфейс пользователя, обработку ввода и представление данных, в то время как серверная сторона отвечает за обработку запросов, хранение данных и выполнение бизнес-логики. Такое разделение функций позволяет создавать масштабируемые и гибкие системы, где клиенты и серверы могут взаимодействовать и обмениваться информацией.
Клиент-серверная архитектура также обеспечивает возможность централизованного управления и контроля данных, что облегчает обновление, масштабирование и обслуживание системы. Клиенты могут обращаться к серверам для получения доступа к общим ресурсам, таким как базы данных, файлы или услуги.
Кроме того, клиент-серверные информационные системы позволяют достичь высокой эффективности и надежности, так как обработка запросов и выполнение операций распределены между клиентами и серверами. Это позволяет оптимизировать производительность системы и обеспечить отказоустойчивость.
Кроме перечисленных способов, современные серверные системы управления базами данных (СУБД) обладают широким спектром возможностей, включая поддержку структурированных и неструктурированных данных, возможность выполнения сложных запросов и аналитических операций, механизмы транзакций и контроля целостности данных, индексирование и оптимизацию запросов, резервное копирование и восстановление данных, а также защиту данных с помощью механизмов аутентификации и авторизации. [8].
Взаимодействие клиента с программным интерфейсом приложения основано на применении архитектурного стиля Representational State Transfer (REST). Фактически, REST API представляет собой набор конечных точек (веб-адресов), к которым клиент обращается с использованием HTTP-запросов и получает от сервера информацию в различных форматах, таких как XML, HTML, JSON и другие. Сервер предоставляет информацию в виде ресурсов и подресурсов, таких как пользователи, загруженные файлы, директории и т. д. Каждый ресурс имеет уникальный идентификатор, состояние и клиент может получать или изменять состояние ресурса с помощью представлений (XML, JSON, текст в определенном формате или другие форматы, позволяющие понять текущее состояние ресурса). При этом серверная часть не зависит от конкретного клиента, клиентом веб-сервиса может быть веб-браузер пользователя, другой сервер, мобильное приложение и другие.
Взаимодействие компонентов в архитектуре REST можно представить схематически. В программном интерфейсе REST для взаимодействия с ресурсами используются стандартные методы HTTP в соответствии с протоколом [9]:
GET используется для получения текущего представления ресурсов;
POST используется для создания новых ресурсов;
PATCH используется для полного или частичного обновления существующих ресурсов;
PUT используется для создания нового ресурса или обновления существующего на данный момент. Если ресурс с заданным идентификатором найден, информация л нём должна быть перезаписана, в ином случае будет создан новый ресурс;
DELETE используется для удаления существующих ресурсов.
Запросы в представленной архитектуре являются самодостаточным, серверу при их обработке нет необходимости извлекать контекст приложения, поскольку клиент включает в запрос все необходимые данные, используя для этого заголовки и тело запроса [9]. Подобный подход повышает производительность, упрощает дизайн и реализацию серверных компонентов системы.
Если резюмировать вышесказанное, можно выделить несколько основных принципов, которым должна руководствоваться разрабатываемая архитектура:
Использование клиент-серверной модели;
Использование стандартных методов протокола HTTP;
Использование уникальных идентификаторов ресурсов;
Взаимодействие данными через представление в формате JSON;
Отсутствие состояния на стороне сервера
Соблюдение перечисленных принципов повышает надёжность и работоспособность приложения. Разработанное программное обеспечение обладает такими плюсами, как простота и единообразие интерфейсов, портативность программных компонентов, лёгкость внесения изменений, а также способность эволюционировать и приспосабливаться к новым требованиям [10].
Java предлагает различные способы взаимодействия с сетью, предоставляя программистам мощные инструменты для создания сетевых приложений.
Уникальность взаимодействия Java с сетью заключается в том, что язык предоставляет множество высокоуровневых классов и API, которые облегчают разработку сетевых приложений. Один из таких способов взаимодействия - использование классов java.net, которые позволяют создавать клиент-серверные приложения, обмениваться данными через протоколы TCP/IP и UDP, устанавливать соединения и обрабатывать сетевые события.
Еще один уникальный способ взаимодействия с сетью в Java - использование класса java.nio, включающего в себя пакеты java.nio.channels и java.nio.channels. Пакет java.nio.channels предоставляет возможности для неблокирующего ввода-вывода и мультиплексирования каналов, что позволяет эффективно управлять множеством сетевых соединений в одном потоке.
Для создания сетевых приложений в Java также можно использовать платформу Java EE (Enterprise Edition), которая предоставляет мощные инструменты и фреймворки для разработки распределенных приложений, веб-сервисов и серверных компонентов. Java EE включает в себя спецификации и API для работы с сетевыми протоколами, управления соединениями, безопасности и транзакциями.
Таким образом, уникальность взаимодействия Java с сетью заключается в обширной библиотеке классов и API, предоставляющих разнообразные инструменты для создания сетевых приложений, поддержку различных протоколов и возможность эффективного управления сетевыми соединениями [11].
Java - это высокоуровневый объектно-ориентированный язык программирования со строгой типизацией. Одним из ключевых преимуществ этого языка является его кроссплатформенность. Код программ на Java компилируется в байт-код, который затем выполняется виртуальной машиной JVM (Java Virtual Machine). Одним из основных преимуществ такого подхода является то, что байт-код не зависит от операционной системы, что позволяет запускать программы на различных платформах, поддерживающих виртуальную машину Java.
Еще одним преимуществом Java является обширная коллекция библиотек с открытым исходным кодом, которые предоставляют решения для широкого спектра задач. В работе с Java мы можем использовать различные фреймворки и библиотеки, которые обеспечивают функциональность для создания веб-сервисов REST, реализации аутентификации пользователей через протокол OAuth, управления доступом, внедрения зависимостей, взаимодействия с базами данных с помощью технологии объектно-реляционного отображения (ORM), аспектно-ориентированного программирования, генерации и проверки токенов JWT, обработки данных в формате JSON и многое другое. Это дает разработчикам широкие возможности при создании программных решений.
Из выше сказанного можно добавить, что язык Java достаточно прост в использовании. В нем находится автоматическое управление памятью за счёт использования механизма сборки мусора – уборщик, а также строгая типизация, которая делает Java удобным инструментом для написания огромных проектов. Еще можно выделить богатый инструментарий. Интегрированные среды разработки (IDE), написанные на Java, такие как NetBeans, Eclipse и продукты компании JetBrains, давно вышли за рамки экосистемы языка, став стандартизированным средством разработки ПО на многих современных языка программирования.
Разрабатываемый проект «автоматизированной системы хранения персонифицированных данных о клиентах» будет основан на использовании фреймворка с открытым исходным кодом Spring. Функционал фреймворка сгруппирован в несколько модулей: AOP and Instrumentation, Core Container,
Messaging, Web, Data Access, Test ит.д.
Рисунок 2.1 Модули Spring Framework
Spring MVC – это фреймворк, в основе которого лежит технология Java Servlets, Spring MVC используется для разработки веб-приложений, и именно с его помощью разрабатывается REST API сервиса. Данный модуль предоставляет возможность обработки клиентских запросов, их валидации, генерации HTML – страниц и т.д. Другими словами, Spring MVC отвечает за всё, что связано с сетевой частью приложения [12].
JavaFX - это мощный инструмент для разработки графических пользовательских интерфейсов и мультимедийных приложений на языке Java. С помощью JavaFX вы можете создавать приложения с богатым набором функций, включая анимацию, 3D-графику, мультимедийные эффекты и многое другое.
Одной из главных преимуществ JavaFX является его интеграция с Java SE. Это означает, что JavaFX может использоваться вместе с другими Java-технологиями, такими как JDBC, JPA и многими другими. Это делает JavaFX удобным инструментом для разработки приложений на Java, поскольку он позволяет разработчикам использовать уже знакомые им инструменты и библиотеки.
Кроме того, JavaFX имеет богатый набор функций для создания пользовательских интерфейсов. Это включает в себя мощный набор компонентов пользовательского интерфейса, таких как кнопки, поля ввода, таблицы и т.д., а также возможности для настройки стилей и внешнего вида приложения.
JavaFX также обладает мощными возможностями для работы с мультимедиа. Это включает в себя возможность воспроизведения видео и звука, а также возможность создания интерактивных приложений с использованием 3D-графики.
В целом, JavaFX является мощным инструментом для разработки графических приложений на Java. Он обладает богатым набором функций и интегрируется с другими Java-технологиями, что делает его удобным для использования разработчиками, знакомыми с Java. Если вы ищете инструмент для создания богатого по функциям пользовательского интерфейса на Java, то JavaFX - отличный выбор.
Apache POI - это библиотека Java, которая позволяет разработчикам создавать и редактировать файлы Microsoft Office, такие как документы Word, таблицы Excel и презентации PowerPoint. С помощью Apache POI вы можете автоматизировать процессы создания и редактирования этих типов файлов, что может быть особенно полезно в бизнес-приложениях, где работа с такими файлами является частой задачей.
Apache POI предоставляет набор Java-интерфейсов, которые облегчают работу с файлами Microsoft Office. Эти интерфейсы позволяют создавать новые файлы, открывать существующие файлы, редактировать и сохранять изменения. Apache POI также предоставляет API для работы с содержимым файлов Microsoft Office, такими как текст, таблицы, графики и многое другое.
Кроме того, Apache POI обладает мощным набором функций для работы с форматированием текста, стилями и макетами. Это позволяет создавать профессионально выглядящие документы, таблицы и презентации.
Apache POI также обладает открытым исходным кодом и активно развивается сообществом разработчиков. Это означает, что вы можете использовать Apache POI бесплатно и получить доступ к множеству примеров и документации, чтобы улучшить свой проект.
В целом, Apache POI является мощной и гибкой библиотекой для работы с файлами Microsoft Office в Java-приложениях. С помощью Apache POI вы можете автоматизировать процессы создания и редактирования файлов Office, ускорить разработку и улучшить эффективность вашего проекта.
MySQL Connector - это библиотека Java, которая предоставляет разработчикам доступ к базам данных MySQL. С помощью MySQL Connector вы можете создавать приложения на Java, которые могут общаться с базами данных MySQL, выполнять запросы и получать результаты.
MySQL Connector обладает мощным набором функций, который облегчает работу с базами данных MySQL. Это включает в себя возможность установления соединения с базой данных, выполнение запросов на выборку и обновление данных, транзакционную обработку и многое другое.
Кроме того, MySQL Connector обладает хорошей производительностью и надежностью. Он использует оптимизированный протокол для обмена данными с базой данных MySQL, что обеспечивает быструю скорость передачи данных и минимальную задержку.
MySQL Connector также обладает открытым исходным кодом и поддерживается сообществом разработчиков. Это означает, что вы можете использовать MySQL Connector бесплатно и получить доступ к множеству примеров и документации, чтобы улучшить свой проект.
В целом, MySQL Connector является мощным инструментом для работы с базами данных MySQL в Java-приложениях. Он обладает богатым набором функций, хорошей производительностью и надежностью, а также доступен бесплатно и поддерживается сообществом разработчиков. Если вы ищете инструмент для работы с базами данных MySQL на Java, то MySQL Connector - отличный выбор [13].
Spring Boot – это проект, определенный на упрощение разработки приложений с помощью фреймворка Spring. Он позволяет в очень маленькие сроки создать полностью функциональное приложение, требуя при разработке минимум усилий от разработчика.
Преимущества Spring Boot:
Встроенный веб-сервер (Tomcat, Undertow или Jetty), который автоматически запускается вместе с приложением;
Набор готовых библиотек зависимостей (starter dependencies);
Автоматическая конфигурация как самого Spring, так и некоторых сторонних библиотек;
Возможность следить за состоянием приложения в реальном времени с помощью Spring Boot Actuator
Полностью избавляет разработчика от необходимости применять XML-конфигурацию
Log4j - это библиотека Java, которая предоставляет разработчикам гибкую систему логирования для приложений на Java. С помощью Log4j вы можете записывать сообщения логирования в файлы, базы данных или на другие устройства вывода, что облегчает отслеживание работы приложения и поиск ошибок.
Log4j предоставляет разработчикам мощные инструменты для настройки и управления системой логирования. Это включает в себя возможность настройки уровней логирования, фильтрации сообщений, установки форматирования вывода и многое другое. Благодаря этому, разработчики могут настраивать логирование в соответствии с требованиями и спецификацией проекта.
Кроме того, Log4j обладает высокой производительностью и надежностью. Он использует многопоточную обработку логирования, что обеспечивает высокую скорость записи и минимальные задержки. Log4j также предоставляет механизмы ротации и сжатия файлов логирования, что позволяет управлять объемом лог-файлов и сократить использование дискового пространства.
Log4j также обладает открытым исходным кодом и активно развивается сообществом разработчиков. Это означает, что вы можете использовать Log4j бесплатно и получить доступ к множеству примеров и документации, чтобы улучшить свой проект.
В целом, Log4j является мощным инструментом для управления логированием в Java-приложениях. Он обладает множеством функций для настройки и управления логированием, высокой производительностью и надежностью, а также доступен бесплатно и поддерживается сообществом разработчиков. Если вы ищете инструмент для управления логированием в Java-приложениях, то Log4j - отличный выбор [14].
PlantUml Integration - это плагин для среды разработки Java, который позволяет разработчикам создавать диаграммы UML внутри исходного кода Java с помощью текстовой нотации.
С помощью плагина PlantUml Integration разработчики могут быстро создавать диаграммы классов, последовательностей, диаграммы состояний и многое другое, прямо внутри исходного кода Java. Это позволяет разработчикам быстро описывать структуру и взаимодействие компонентов приложения, что упрощает работу в команде и повышает качество кода.
Плагин PlantUml Integration также предоставляет разработчикам гибкие возможности настройки диаграмм. С помощью него вы можете выбирать различные стили отображения диаграмм, настраивать цвета, размеры, шрифты и другие параметры. Это позволяет создавать диаграммы, которые соответствуют требованиям проекта и могут быть легко поняты всеми членами команды.
Кроме того, PlantUml Integration имеет простой и интуитивно понятный интерфейс, что делает его легко освоить для новичков в разработке. Это также позволяет быстро внедрить его в проект и начать использовать его преимущества без длительного обучения.
В целом, PlantUml Integration — это мощный инструмент для разработчиков Java, который позволяет создавать диаграммы UML прямо внутри исходного кода. Он предоставляет разработчикам гибкие настройки диаграмм, имеет простой и интуитивно понятный интерфейс и помогает улучшить качество кода и работу в команде. Если вы ищете инструмент для создания диаграмм UML в Java-проектах, то PlantUml Integration - отличный выбор.
REST – это один из самых полярных на сегодня способов взаимодействия между клиентом и сервером в веб-приложениях. Но проблема в том, что REST – это не стандарт или протокол, а всего лишь архитектурный стиль, набор требований к программному интерфейсу. Клиенту же необходимо точно знать, какие данные ожидает получить сервер, в каком формате должны быть эти данные, значение каждого возможного кода состояния и т.д. Таким образом, разрабатываемый API приложения должен быть подробно задокументирован.
Swagger – это проект с открытым исходным кодом, предназначенный для документирования программного интерфейса REST. Он даёт возможность сгенерировать документацию и визуализировать её, используя Swagger UI. Кроме того, с помощью Swagger UI также можно отправлять запросы для проверки и тестирования разработанного API.
Спецификация Swagger, также известная как OpenAPI, имеет несколько реализаций. Одной них является библиотека SpringFox, позволяющая интегрировать Swagger с приложениями, разработанными с помощью Spring Framework.
Рисунок 2.2 Пример интерфейса Swagger UI
SceneBuilder - это графический редактор для .fxml файлов, используемых в JavaFX для создания пользовательского интерфейса приложения. Это мощный инструмент для разработчиков Java, который позволяет быстро и легко создавать сложные пользовательские интерфейсы для своих приложений.
SceneBuilder предоставляет разработчикам богатый набор инструментов для создания и редактирования элементов пользовательского интерфейса, таких как кнопки, текстовые поля, таблицы, графики и многое другое. С помощью SceneBuilder вы можете легко перетаскивать и размещать элементы на экране, изменять их размеры и настраивать их свойства.
Одной из главных преимуществ SceneBuilder является его интеграция с JavaFX. SceneBuilder автоматически генерирует соответствующий код .fxml при редактировании пользовательского интерфейса, что упрощает работу разработчиков и позволяет им быстро создавать и изменять свой пользовательский интерфейс.
Кроме того, SceneBuilder предоставляет разработчикам возможность настраивать стили элементов пользовательского интерфейса, что позволяет им легко создавать красивые и современные интерфейсы, соответствующие последним трендам дизайна.
В целом, SceneBuilder - это мощный инструмент для разработчиков Java, который позволяет создавать сложные пользовательские интерфейсы для своих приложений. Он обладает богатым набором инструментов для создания и редактирования элементов пользовательского интерфейса, интегрируется с JavaFX и позволяет быстро и легко создавать и изменять пользовательский интерфейс. Если вы разрабатываете приложения на JavaFX, то SceneBuilder - отличный выбор для создания пользовательского интерфейса.
Maven — это фреймворк с открытым исходным кодом, который существенно упрощает и автоматизирует процесс сборки проектов. Maven позволяет добавлять внешние зависимости в проект, используя для этого центральный репозиторий, предоставляет богатый набор плагинов, расширяющих функционал, позволяет создавать дистрибутивы программ в виде архивов jar/war и многое другое. Кроме того, эта система сборки поддерживается всеми популярными средами разработки, которые позволяют импортировать проект Maven без необходимости его дополнительной конфигурации. Центральным компонентом Maven является специальный XML-файл Project Object Model (pom.xml). POM используется для описания проекта и конфигурирования процесса сборки. Этот файл содержит информацию об имени и версии проекта, его авторе, используемой версии Java, внешних зависимостях, плагинах и т. д. Все проекты, использующие Maven, имеют единую унифицированную структуру каталогов:
/src/main/java содержит исходный код программы;
/src/main/resources содержит дополнительные ресурсы приложения (SQL-скрипты, файлы конфигурации и т. д.);
/src/test/java содержит исходный код тестовых классов;
/src/test/resources содержит дополнительные ресурсы приложения, необходимые для тестирования;
/target содержит результаты сборки, которые включают в себя дистрибутив программы, скомпилированные классы, результаты тестирования и т. д [15].
На начальном этапе создания клиент-серверного приложения, была использована платформа на основе Java для создания приложений с насыщенным графическим интерфейсом (JavaFX). При создании пустого проекта на основе JavaFX получаем проект сразу с несколькими папками и файлами в них.
Рисунок 3.1 Создание проекта через JavaFX
Файлы приложения распределены по каталогам согласно структуре проекта Maven: основные классы находятся в /src/main/java, а каталог /src/main/resources содержит файлы, необходимые для запуска и настройки приложения. Для запуска приложения используется метод main из класса сервера - ServerMain и класса клиента – ClientApplication.
Далее будет рассмотрена реализация основных компонентов программы, описаны их структура и задачи.
Для гибкости разработки программы было взаимодействие с объектно-ориентированным программированием. Далее будет продемонстрированы UML диаграммы классов на стороне клиента и сервера.
Рисунок 3.2 UML диаграмма классов
Для конфигурации приложения используются классы из пакета config и файлы из директории /src/main/resources.
Директория resources содержит следующие файлы:
app.fxml. Файл FXML хранит исходный код приветствующего пользователя окна (My First App), написанного на языке FXML.
Authorization.png картинка которая появляется на signUp.fxml окне.
signUp.fxml. Файл FXML хранит исходный код окна, написанного на языке FXML, когда пользователь авторизовывается в приветствующем окне (My First App).
Style.css. Файл CSS хранит исходный код для анимации прожатия кнопок пользователем.
User.png картинка которая появляется на view.fxml окне.
view.fxml. Файл FXML хранит исходный код окна, написанного на языке FXML, когда пользователь нажимает на кнопку зарегистрироваться в приветствующем окне (My First App).
Log4j.properties служит для конфигурирования записи в консоль сообщений после выполнения определенных взаимодействий между клиентом и сервером.
Директория src/main/java/com/example/application/configs содержитследующиеклассы:
Configs: Класс Configs служит для хранения данных для соединения с сервером.
Const: Класс Const служит для связи с конкретной таблицей, полями этой таблицы и т.д.
Operation: Класс Operation служит для конкретных операции с БД.
User: Класс User хранит поля данных зарегистрированного пользователя.
Для выполнения функций при прожатии кнопок в приложении используются классы из пакета controllers.
Директория src/main/java/com/example/application/controllers содержитследующиеклассы:
AppController: Класс AppController служит для реализации функций при прожатии кнопок “Назад” и “Скачать данные на пк”.
Controller: Класс Controller служит для реализации функций при прожатии кнопок “Зарегистрироваться”, “Войти” и полей ввода текста “Логин”, “Пароль”.
SignUpController: Класс SignUpController служит для реализации функций при прожатии кнопок: “Зарегистрироваться”, “Назад”. Полей ввода текста: “Имя”, “Отчество”, “Фамилия”, “Логин”, “Пароль”, “Телефон”, “Серия и номер паспорта”, “СНИЛС”, “ИНН”, “Страна”. Двух флажков “Мужчина” и “Женщина” и текстовые поля, которые будут вылезать над полями ввода, если данные были не введены.
Для выполнения анимации при прожатии кнопок в приложении используется класс из пакета animations.
Директория src/main/java/com/example/application/animations содержитследующийкласс:
ShakeAnimation: Класс ShakeAnimation выполняет функцию анимации оконного приложения.
Для соединения с базой данных и выполнения SQL-запросов в приложении используется класс из пакета DB.
Директория src/main/java/com/example/application/DB содержитследующий класс:
DataBaseHandler: Класс DataBaseHandler выполняет работу с БД.
Для работы с сервером при отправке объектов при прожатии кнопок в приложении используется класс из пакета Client и main-класс из общего пакета application.
Директория src/main/java/com/example/application/Client содержитследующийкласс:
CRUDClient: Класс CRUDClient выполняет функцию соединения, отправки и принятия объектов с сервером.
Директория src/main/java/com/example/application содержитследующийкласс:
ClientApplication: Класс ClientApplication который содержит main-метод для запуска программы от лица клиента.
Для работы с клиентом при отправке объектов после прожатия кнопок в приложении используется классы из пакета Server.
Директория src/main/java/com/example/application/Server содержитследующийкласс:
ServerDataBase: Класс ServerDataBase сервера, который будет получать и отправлять информацию клиенту.
ServerMain: Класс ServerMain который содержит main-метод для запуска программы от лица сервера.
Рассматриваемые здесь исключения генерируются исключительно классами логического уровня. Всего представлено шесть классов исключений:
IOException. Исключение, которое выдается при возникновении ошибки ввода-вывода.
ClassNotFoundException. Возникает, когда приложение пытается загрузить класс через его строковое имя, используя:
Через метод forName в классе Class;
Через метод findSystemClass в классе ClassLoader;
Черезметод loadClass method вклассе ClassLoader.
но определение класса с указанным именем не найдено.
SQLException. Исключение, предоставляющее информацию об ошибке доступа к базе данных или других ошибках.
Для работы с базой данных была использована локально созданная БД под названием RayCorparation, в которой была создана таблица users с полями idUsers, firstName, middleName, lastName, userName, password, location, gender, telephone, seriesNumberPassport, SNILS, INN, telephone, telephone
Рисунок 3.3 Таблица users
Для установления связи между клиентом и сервером необходимо знать адрес сервера, к которому клиент хочет подключиться. В данном случае мы используем локальную вычислительную машину в качестве сервера. С помощью сокета, который является своеобразной точкой соединения, мы устанавливаем связь между двумя программами в сети.
Концепция сокета реализуется классом Socket. Этот класс обеспечивает каналы ввода/вывода, которые позволяют клиенту и серверу взаимодействовать друг с другом:
Рисунок 3.4 Реализация сокета между клиентом и сервером
В клиентском приложении (в нашем случае класс CRUDClient) создается экземпляр класса Socket для установки связи с сервером. С другой стороны, серверное приложение (класс ServerDataBase) создает свой экземпляр Socket и ожидает сигнала о подключении клиента. Таким образом, устанавливается связь и начинается взаимодействие между клиентом и сервером.
Особое значение имеет код, который обеспечивает взаимодействие между клиентом и сервером. Этот код определяет, какие данные передаются между клиентом и сервером, и как они обрабатываются.
Листинг кода класса CRUDClient:
Процесс создания сокета в данном коде осуществляется с помощью конструктора класса Socket. При создании сокета необходимо указать "hostName" - имя или IP-адрес конкретного узла в сети. В случае, если сокет не может преобразовать указанный адрес в действительный существующий адрес, будет сгенерировано исключение UnknownHostException.
Кроме того, необходимо указать "port" - номер порта, на котором будет установлено соединение. Если указать 0 в качестве номера порта, система автоматически назначит свободный порт. Однако возможна ситуация, когда происходит потеря соединения, и в этом случае может быть сгенерировано исключение IOException.
При инициализации объекта Socket, клиент, которому этот сокет принадлежит, объявляет в сети свою намеренность установить соединение с сервером по указанному адресу и номеру порта. Например, в методе resultUser() класса CRUDClient создается экземпляр сокета clientSocket с использованием следующего кода: Socket clientSocket = new Socket("127.0.0.1", 8080). Затем этот сокет передается в качестве параметра методу runGetUser(clientSocket, user), который в свою очередь использует этот сокет при создании потоков ввода и вывода для объектов обмена информацией:
ObjectOutputStream objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(clientSocket.getInputStream());
Для обеспечения взаимодействия клиента и сервера и передачи объектов, необходимо осуществлять операции с потоками ввода и вывода на обеих сторонах. Класс Socket играет ключевую роль в этом процессе. После установки соединения между клиентом и сервером, данные могут быть отправлены с использованием objectOutputStream, а затем приняты с помощью objectInputStream, и наоборот. Фактически, это одна из основных функций класса Socket.
При отправке объекта на сервер, необходимо вызвать метод flush() для objectOutputStream, чтобы убедиться, что данные будут вытолкнуты из буфера и переданы. Если этого не сделать, информация не будет успешно передана и не будет получена на сервере. Кроме того, приемный поток ожидает указатель конца строки "\n", чтобы определить окончание сообщения. Если этот указатель отсутствует, сообщение будет неполным и не будет принято.
После создания экземпляра класса Socket на стороне клиента для установки соединения, сервер должен создать объект класса ServerSocket и использовать метод accept() для принятия входящих подключений от клиентов.
Листинг кода класса ServerDataBase:
Для создания серверного сокета используется конструктор ServerSocket с указанием порта:
ServerSocket serverSocket = new ServerSocket(int port). При создании ServerSocket не требуется указывать адрес соединения, поскольку взаимодействие происходит на самом сервере. В случае использования многоканального хоста может потребоваться указать конкретный IP-адрес, к которому привязан серверный сокет. Кроме того, важно помнить о методе flush(), который выполняет выталкивание данных из буфера.
Таким образом, при объявлении серверного сокета через ServerSocket и указании порта, сервер готов принимать входящие соединения от клиентов на указанном порту.
Класс DataBaseHandler наследует класс Configs, который содержит параметры подключения к базе данных.
Этот класс может использоваться в контексте разработки приложения для работы с базой данных, где пользователи могут регистрироваться, авторизовываться и получать свои данные. Он обеспечивает взаимодействие с базой данных и выполнение операций CRUD (создание, чтение, обновление, удаление) для пользователей.
Листинг кода класса DataBaseHandler:
В представленном коде представлен класс DataBaseHandler, который выполняет работу с базой данных. Онсодержитследующиеметоды:
Метод getDbConnection() устанавливает соединение с базой данных, используя параметры подключения из класса Configs. Онвозвращаетобъект Connection.
Метод signUpUser(User user) добавляет нового пользователя в базу данных. Он формирует SQL-запрос для вставки данных в таблицу Users и использует подготовленное выражение для выполнения запроса с параметрами пользователя.
Метод getUser(User user) возвращает авторизованного пользователя из базы данных. Он формирует SQL-запрос для поиска пользователей по введенным данным логина и пароля, используя подготовленное выражение.
Метод getFullUser(User user) возвращает дополнительные данные авторизованного пользователя из базы данных. Он формирует SQL-запрос для получения полной информации о пользователе по введенным данным логина и пароля, используя подготовленное выражение.
Ниже представлена реализация классов контроллеров, которые выполняют функции при прожатии кнопок:
Листинг кода класса AppController:
В представленном коде представлен класс AppController, который является контроллером для пользовательского интерфейса. Онвыполняетследующуюработупринажатиинакнопки:
Метод initialize() инициализирует контроллер. В нем определены действия, выполняемые при нажатии на кнопки.
Метод openNewScene(String window) открывает новое окно при нажатии кнопки "Назад". Он скрывает текущее окно, загружает FXML-файл для нового окна и отображает его.
Метод downloadUserData() скачивает данные пользователя в формате .xls при нажатии кнопки "Скачать данные на пк". Сначала он получает данные пользователя с помощью объекта CRUDClient. Затем создает списки constData и userData, содержащие заголовки и значения данных пользователя соответственно. Далее создается экземпляр Workbook из библиотеки Apache POI, и создается лист и строки для записи данных. Данные записываются в ячейки и сохраняются в файл в формате .xls.
Метод setParent(Controller controller) устанавливает ссылку на предыдущий контроллер.
Таким образом, AppController выполняет функциональность навигации между окнами и скачивания данных пользователя в формате .xls при нажатии на соответствующие кнопки в пользовательском интерфейсе. Этот код может использоваться в контексте приложения для работы с данными пользователя.
Листинг кода класса Controller:
В представленном коде представлен класс Controller, который является контроллером для пользовательского интерфейса авторизации. Он выполняет следующую работу при нажатии на кнопки:
Метод initialize() инициализирует контроллер. В нем определены действия, выполняемые при нажатии на кнопки.
Метод loginUser(String loginText, String loginPassword) осуществляет авторизацию пользователя при вводе данных в поля "Логин" и "Пароль". Он создает объект User с указанными данными, передает его на сервер с помощью объекта CRUDClient и получает результат авторизации. Если авторизация прошла успешно (количество польщователей >= 1), вызывается метод openAppController(), который открывает главное окно приложения.
Метод openNewScene(String window) открывает новое окно при нажатии кнопки "Зарегистрироваться". Он скрывает текущее окно, загружает FXML-файл для нового окна и отображает его.
Метод openAppController(String window) открывает главное окно приложения после успешной авторизации. Он скрывает текущее окно, загружает FXML-файл для нового окна и отображает его. Также устанавливает ссылку на предыдущий контроллер (this) для дальнейшего взаимодействия между контроллерами.
Методы-геттеры getLogin_field() и getPassword_field() возвращают ссылки на текстовое поле "Логин" и поле ввода пароля соответственно.
Таким образом, Controller выполняет функциональность авторизации пользователя при вводе данных в соответствующие поля и перехода к главному окну приложения после успешной авторизации. Также предусмотрена возможность открытия окна регистрации при нажатии на соответствующую кнопку в пользовательском интерфейсе. Этот код может использоваться в контексте приложения для работы с авторизацией и регистрацией пользователей.
Листингкодакласса SingUpController:
В представленном коде представлен класс SingUpController, который является контроллером для пользовательского интерфейса регистрации нового пользователя. Он выполняет следующую работу при заполнении данными полей пользователем и нажатии на кнопки:
Метод initialize() инициализирует контроллер. В нем определены действия, выполняемые при нажатии на кнопки.
Метод signNewUser() регистрирует нового пользователя в базе данных. Он извлекает данные, введенные пользователем в соответствующие текстовые поля, создает объект User с указанными данными и вызывает метод dataChecking() для проверки корректности введенных данных. Если данные заполнены корректно, используется объект CRUDClient для добавления пользователя на сервер и выводится соответствующее сообщение. Если данные заполнены некорректно, выводятся сообщения об ошибках и необходимости заполнить соответствующие поля.
Метод openNewScene(String window) открывает главное окно авторизации при нажатии кнопки "Назад". Он скрывает текущее окно, загружает FXML-файл для главного окна авторизации и отображает его.
Метод resetLabel() обнуляет все метки в окне регистрации. Он устанавливает пустые значения для меток, которые используются для вывода сообщений об ошибках.
Таким образом, SingUpController выполняет функциональность регистрации нового пользователя при заполнении соответствующих полей и нажатии кнопки "Зарегистрироваться". При нажатии кнопки "Назад" происходит переход к главному окну авторизации. Этот код может использоваться в контексте приложения для работы с регистрацией новых пользователей.
Алгоритм работы системы программы представляет собой следующую последовательность действий:
Сервер устанавливает соединение с определенным портом на хосте и ожидает подключения клиента.
Клиент создает сокет и пытается установить соединение с портом на хосте.
Если создание сокета прошло успешно, сервер переходит в режим ожидания команд от клиента.
Клиент формирует объект User и передает его серверу, после чего переходит в режим ожидания ответа.
Сервер принимает объект User, выполняет соответствующие операции в зависимости от значения поля User, а затем отправляет ответ клиенту.
Клиент обрабатывает полученную информацию и выводит ее в удобном для пользователя формате, чтобы он мог ее воспринять.
Процесс продолжается, пока клиент или сервер не разорвет соединение. Затемпереходимкпункту 4 иповторяемоперации.
Таким образом, система программы работает по принципу взаимодействия между сервером и клиентом, где клиент отправляет команды и данные серверу, а сервер выполняет операции и отправляет ответы обратно клиенту.
В начале запуска программы запускаем сервер, потом клиента через функции main:
Рисунок 4.1 Приветствующее окно при запуске программы
Далее мы хотим зарегистрироваться в компании, нажимаем на кнопку “Зарегистрироваться”, открывается следующее окно:
Рисунок 4.2 Окно регистрации пользователя
Теперь у нас появилась возможность заполнить поля ввода нашими личными данными, но учитываем, если какое-то поле не заполнено окно регистрации нас уведомит об этом:
Рисунок 4.3 Пользователь не зарегистрирован
Введем до конца все данные и увидим следующее уведомление:
Рисунок 4.4 Регистрация пользователя прошла успешно
Теперь проверяем появился ли наш пользователь в БД:
Рисунок 4.5 Таблица зарегистрированных пользователей
Нажимаем кнопку назад и переходим на стартовое окно и вводим не правильные данные, чтобы проверить работоспособность:
Рисунок 4.6 Стартовое окно с неправильными данными
Происходит анимация-потрясывания полей ввода, как бы говоря пользователю что данные были не правильными. Введем верные данные и окажемся в окне личный кабинет пользователя:
Рисунок 4.7 Окно личного кабинета зарегистрированного пользователя
Нажимаем кнопку “Скачать данные на пк” и на рабочем локальной машины появится Excel файл с данными пользователя, с которыми он потом может в дальнейшем работать:
Рисунок 4.8 Файл на рабочем столе, который появился после прожатия кнопки
Рисунок 4.9 Данные внутри Excel-файла
В ходе выполнения данной работы были достигнуты поставленные задачи и достигнута цель создания приложения, моделирующего работу информационной системы по авторизации и регистрации пользователей в базе данных.
Была разработана структура базы данных, которая позволяет хранить и организовывать данные о пользователях. Это включает информацию о имени, фамилии, логине, пароле, поле, местоположении и других сопутствующих данных, необходимых для регистрации и авторизации пользователей.
Также была разработана структура классов приложения, которая обеспечивает логику работы приложения. Классы были организованы в соответствии с принципами объектно-ориентированного программирования, чтобы обеспечить модульность, удобство сопровождения и возможность расширения функциональности в будущем.
Пользовательский интерфейс был разработан с использованием JavaFX, что позволяет создавать современные и привлекательные пользовательские интерфейсы. В интерфейсе представлены формы для ввода данных при авторизации и регистрации пользователей, а также соответствующие кнопки для выполнения этих операций.
Программная реализация включает в себя обработку действий пользователя, валидацию введенных данных, взаимодействие с базой данных и обеспечение безопасности при авторизации. Были использованы соответствующие библиотеки и инструменты для реализации требуемой функциональности.
Тестирование приложения проводилось для проверки его работоспособности, корректности обработки введенных данных и обеспечения безопасности авторизации. Были проведены тесты на различные сценарии использования, а также на возможные ошибки и исключительные ситуации.
В результате работы было создано полноценное приложение, которое успешно моделирует работу информационной системы по авторизации и регистрации пользователей в базе данных. Приложение предоставляет удобный и безопасный способ авторизации пользователей, а также возможность регистрации новых пользователей с проверкой и валидацией введенных данных.
Анализ требований // Википедия: свободная энциклопедия. URL: https: //ru.wikipedia.org/wiki/Анализ${-}$требований (дата обращения: 15.12.2022).
Разработка серверной части программного приложения для удаленного хранения данных / Л.А. Володченкова, Д.В. Козырев. – Омск Математические структуры и моделирование, 2020. – С. 108-138 –Режим доступа: по подписке. – URL: https://cyberleninka.ru/article/n/razrabotka-servernoy-chasti-programmnogo-prilozheniya-dlya-udalennogo-hraneniya-dannyh (дата обращения: 15.12.2022).
Мухамедзянов, Р. Р. JAVA. Серверные приложения : практическое пособие : [16+] / Р. Р. Мухамедзянов. – Москва : СОЛОН-ПРЕСС, 2007. – 336 с. – (Про ПК). – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=227066 (дата обращения: 15.12.2022). – ISBN 5-93455-134-5. – Текст : электронный.
Коузен, К. Современный Java: рецепты программирования : простые решения трудных задач на Java 8 и 9 : практическое пособие : [16+] / К. Коузен ; пер. с англ. А. А. Слинкина. – Москва : ДМК Пресс, 2018. – 274 с. : ил., табл. – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=594715 (дата обращения: 15.12.2022). – ISBN 978-5-97060-134-1. – Текст : электронный.
The world of Tomorrow // Hans Goedvolk, 1995г, URL: http://home.kpn.nl/daanrijsenbrij/vision/eng/vish4ex1.htm (датаобращения: 15.12.2022).
Риз, Р. Обработка естественного языка на Java : практическое пособие : [16+] / Р. Риз ; пер. с англ. А. В. Снастина. – Москва : ДМК Пресс, 2016. – 264 с. : ил. – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=567094 (дата обращения: 15.12.2022). – ISBN 978-5-97060-331-4. – Текст : электронный.
Хеффельфингер, Д. Java EE 6 и сервер приложений GlassFish 3 : практическое руководство по установке и конфигурированию сервера приложений GlassFish 3, а также по разработке приложений Java EE 6 и их развертыванию на этом сервере : [16+] / Д. Хеффельфингер ; пер. с англ. Е. Н. Карышева. – Москва : ДМК Пресс, 2013. – 416 с. : ил., табл. – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=578696 (дата обращения: 15.12.2022). – ISBN 978-5-94074-902-8. – Текст : электронный.
Виссер, Д. Разработка обслуживаемых программ на языке Java : [16+] / Д. Виссер ; пер. с англ. Р. Н. Рагимова. – Москва : ДМК Пресс, 2017. – 182 с. : ил., табл. – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=578540 (дата обращения: 15.12.2022). – ISBN 978-5-97060-447-2. – Текст : электронный.
Веб-сервисы RESTful: основы // IBM Developer Россия. URL: https://www. ibm.com/developerworks/ru/library/ws-restfu/index.html (датаобращения: 15.12.2022).
Бауэр, К. Java Persistence API и Hibernate : практическоепособие : [16+] / К. Бауэр, Г. Кинг, Г. Грегори ; науч. ред. пер. А. Н. Киселев ; пер. с англ. Д. А. Зинкевич. – 2-е изд. – Москва : ДМК Пресс, 2019. – 653 с. : схем., табл., ил. – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=686561 (дата обращения: 15.12.2022). – Библиогр.: с. 631. – ISBN 978-5-97060-674-2. – Текст : электронный.
Баженова, И. Ю. Язык программирования Java : практическое пособие : [16+] / И. Ю. Баженова. – Москва : Диалог-МИФИ, 2008. – 254 с. : табл., ил. – Режим доступа: по подписке. – URL: https://biblioclub.ru/index.php?page=book&id=54745 (дата обращения: 15.12.2022). – ISBN 5-86404-091-6. – Текст : электронный.
Шапошников, А. С. Spring в действии / А. С. Шапошников. – Москва : ДМК Пресс, 2018. – 496 с. – ISBN 978-5-97060-605-6. – Текст : печатный.
Дейтел, П. J. MySQL. Руководство по языку / П. J. Дейтел, Х. М. Дейтел, А. Б. Голдберг. – Санкт-Петербург : Питер, 2012. – 1376 с. – ISBN 978-5-496-00484-7. – Текст : печатный.
Crettaz, L. Log4j: The Complete Manual / L. Crettaz. – Birmingham : Packt Publishing, 2018. – 338 p. – ISBN 978-1-78899-018-3. – Текст : печатныйиэлектронный.
Косаревский, В. Apache Maven. Сборка, тестирование, деплоймент / В. Косаревский. – Москва : ДМК Пресс, 2016. – 288 с. – ISBN 978-5-97060-312-3. – Текст : печатный.