CMS

Java (11), Swing, несколько классов, взятых из предыдущих проектов (GBL, Loc, Mes, Proper)

У меня возникла проблема. 23 августа 2025 года, находясь в отпуске на прекрасном побережье Средиземного моря в городе Сиде, я придумал и реализовал заготовку для этого сайта. Я собирался опубликовать на нём полные описания всех проектов, и, в общем-то, всё получилось. Я придумал двуязычную главную страницу, решил отвести под каждый проект (репозиторий) по одной странице для каждого языка и начал вести дневник. Но жизнь не стоит на месте. Появляются идеи новых проектов, и они должны получить свою страничку на сайте. А добавление одной новой страницы вызывает необходимость внести изменения на все страницы сайта. И да, можно, конечно, и так, но зачем?

Я сделал собственную CMS (систему управления контентом) для ведения своего сайта. Проблема решена! Конечно, можно было бы взять что-то готовое, но что? И сколько времени мне понадобилось бы для её изучения? Удалось бы сделать сайт таким, каким я его придумал на побережье Средиземного моря, или всего лишь примерно таким? В общем, дело сделано: CMS создана, и она работает.

Кроме того, эта CMS позволила попрактиковаться в работе с файлами на Java, а также в создании пользовательского интерфейса с помощью Swing, в частности: в работе с текстовыми полями, радиокнопками, комбобоксами, редактировании списка и двуязычности.

Для разработки использован Eclipse. Проект расположен здесь: https://github.com/weekend-game/weekendcms/ (EN) и здесь: https://gitflic.ru/project/weekend-game/weekendcms/ (RU).

Как запустить программу

Скачайте репозиторий на свой компьютер. Всё необходимое для работы программы расположено в папке app. Зайдите в папку app и запустите программу двойным кликом по WeekendCMS.jar или, если она не запускается, двойным кликом по WeekendCMS.bat. Если и последнее не запускает программу, то скачайте и установите Java 11 или новее и снова попробуйте способы, описанные выше.

Как открыть проект в Eclipse

В Eclipse, в меню выберите File - Import... В появившемся окне выберите Existing Projects into Workspace. Укажите папку скачанного вами репозитория и нажмите кнопку Finish. Проект откроется в Eclipse. В Package Explorer (в левой части экрана) дважды кликните на файле WeekendCMS.java. Файл откроется для редактирования (в центральной части экрана). Запустите программу на выполнение, нажав Ctrl+F11 или так, как вам удобно запускать программы в Eclipse.

Как работать с программой

Программа помогает создать HTML-страницы сайта в определённом стиле - стиле моего сайта. Если нужно что-то другое или что-то ещё, то надо дорабатывать программу.

Чтобы легче понять пояснения ниже, надо запустить программу и открыть созданный с её помощью сайт. Видим, что сайт состоит из двух видов страниц: главной страницы и страниц проектов, подобных этой странице. Все страницы проектов, в принципе, одинаковы.

Главная страница (index.htm)

В центральной части страницы крупным шрифтом отображается название всего проекта. В данном случае это название моего профиля - Weekend Game. Если запустить программу, то мы увидим, что в появившемся окне будет несколько полей. Поле "Название проекта" отвечает именно за то, что будет отображаться в центральной части главной страницы. Верхняя часть страницы содержит ссылку на сайт с проектами и предлагает писать письма на мой адрес. Она выполнена на английском языке. Нижняя часть содержит аналогичную информацию, но написана на русском языке. Для указания всех этих атрибутов в CMS предназначены поля "Сайт для проектов на английском", "Сайт для проектов на русском" и "Электронная почта".

Видим, что на странице, выше и ниже названия всего проекта (профиля), расположены линейки меню, т.е. ссылки на страницы каждого проекта (репозитория). Предполагается, что сверху будут ссылки на страницы на английском языке, а снизу - на русском.

Страницы проектов (репозиториев)

Перечень страниц проектов (репозиториев) указывается в CMS в разделе "Список страниц". Подразумеваются страницы проектов. Для каждой страницы указывается "Язык" (EN или RU). Эти значения определяют, где будет расположена ссылка на страницу на главной странице: сверху или снизу. Ссылки будут формироваться в той последовательности, в которой они указаны в списке страниц. Расположение можно поменять кнопками "Вверх" и "Вниз", расположенными справа от списка. Поле "Наименование" определяет название страницы на естественном языке, а поле "Имя файла" — это имя файла страницы, которая будет сгенерирована.

При генерации страниц будет сформирована не только главная страница, но и страницы для каждой строки из списка страниц. Каждая страница проекта будет содержать заголовок крупным шрифтом и взятый из поля "Наименование", а также линейку меню, содержащую ссылки на все страницы EN или RU, в зависимости от атрибута самой страницы. Таких линеек меню будет две: вверху и внизу страницы. В самом низу будет предложение посетить сайты с проектами и email. Содержимое же страницы будет взято из одноимённого файла из папки, указанной в поле "Папка расположения файлов с текстами". Например, для генерации страницы weekendinterpreter.htm следует не только указать её в списке страниц, но и разместить описание интерпретатора выходного дня в одноимённом файле (weekendinterpreter.htm) и поместить его в папку, указанную в поле "Папка расположения файлов с текстами". Если такого файла не найдётся, страница weekendinterpreter.htm всё равно будет создана, но она будет иметь только заголовок и завершение.

Генерация сайта

Чтобы получить страницы сайта, нажмите кнопку "Сформировать страницы". Все сформированные HTML-файлы будут расположены в папке, указанной в поле "Папка для размещения сформированных страниц". Таблицу стилей моя CMS не формирует. Её следует создать вручную и расположить там, где удобно. Также самостоятельно позаботьтесь о размещении файлов с изображениями.

Внимание! Не редактируйте вручную сгенерированные HTML-файлы в папке для размещения страниц, так как при очередной генерации они будут переписаны.

Как программа написана

Главным классом приложения является класс WeekendCMS. Именно он содержит статический метод main() для запуска программы. В его конструкторе создаётся всё необходимое для работы.

Прежде всего, вызывается метод Proper.read(). Proper - это класс, который нужен, чтобы приложение могло сохранять данные между сеансами работы. Так сохраняется расположение и размер главного окна, предпочитаемый язык интерфейса, а также вся информация полей ввода и данные списка страниц. Метод read() читает файл с ранее записанными данными. Метод save() делает обратное: записывает всё, что запомнено в объекте, в файл. Метод setProperty(name, value) сохраняет значение value с именем "name". Метод getProperty(name, def) читает значение с именем "name"", а если оно не записывалось, то будет возвращено значение def. Для записи и восстановления расположения и размеров окна приложения используется пара методов saveBounds() и setBounds().

Затем статическим методом Loc.setLanguage() устанавливается язык интерфейса. Класс Loc отвечает за I18n. Работает это так: все строки, которые предназначены для отображения, написаны на английском языке с использованием нижнего подчёркивания вместо пробела. Метод Loc.get(строка) будет возвращать строки на ранее установленном языке, если, конечно, найдётся файл локализации messages_xx.properties, где xx - условное обозначение языка. Иначе в английской фразе подчёркивания будут заменены на пробел, а первая буква будет сделана прописной. И получившееся будет использовано для отображения. Для целей данной программы этого вполне достаточно.

Создаётся объект класса SiteDescriptor - объект для хранения всей информации о сайте, который будет сгенерирован. У созданного объекта тут же вызывается метод siteDescriptor.readData(). Здесь происходит чтение этой самой информации.

Создаётся окно приложения - объект класса JFrame. И сразу вызывается метод makeJFrame(), в котором в окне приложения располагаются компоненты пользовательского интерфейса. Для их расположения используется класс GBL. GBL - это упрощение менеджера расположения GridBagLayout, адаптированное под нужды приложения. Компонентов пользовательского интерфейса не так уж много, но для их создания и настройки приходится писать много текста. Чтобы несколько упростить, всё, что связано с редактированием списка страниц, выделено в отдельный класс: ListEditor. Объект класса ListEditor формирует панель редактора списка страниц, которую можно получить методом getPanel() и расположить где угодно. Я её, естественно, располагаю на единственном экране своего приложения.

Затем я инициализирую класс Mes, предназначенный для отображения различных сообщений с помощью диалоговых окон. Методы Mes статические, и это создаёт некоторую связанность классов моих программ, но я отношусь к нему как к System.out в Java.

В заключение я вызываю метод readFromSiteDescriptor(), который заполнит компоненты пользовательского интерфейса ранее прочитанными данными из SiteDescriptor().

Основная работа выполняется в слушателе кнопки "Сформировать страницы". Вызывается метод класса Generator DoIt(). Этот метод и сформирует страницы сайта на основании имеющихся данных.

Более подробно о работе программы можно узнать, скачав проект, открыв его в Eclipse, читая тексты классов, внося изменения, запуская программу и наблюдая, что из этого получается.

Итоги

Создание даже такой небольшой CMS существенно облегчило ведение моего сайта.

Хорошо бы…

Дневник быстро разрастается. Надо убирать в архив старые записи.

В дневнике нужно сделать фильтр, который позволит отфильтровывать записи по какому-то конкретному проекту.