Spring в действии — пробуем opensource CMS на Java

JAVA*
В данной статье речь пойдёт о системе управления содержимым Riot, написанной на Java. Система основана на Spring Framework, использует Ajax.

web developer at work

Я приведу основные возможности системы и пошагово расскажу, как её установить. Статья адресована всем тем, кто интересуется системами управления содержимым на Java.


Содержание


Что такое Riot
  • Основные характеристики
  • Системные требования
  • Используемые библиотеки
  • Документация

Создание нового Riot проекта
  • Русификация Riot
  • Настройка подключения к БД
  • Ошибки, возникшие во время установки


Что такое Riot


Riot — это opensource фреймворк для построения веб-приложений.

Конечные пользователи могут рассматривать систему как CMS, но с позиции разработичика Riot — это скорее Content Management Framework (CMF), так как система не предлагает решения из коробки (out-of-the-box). Riot представляет собой каркас веб-приложения, основанный на opensource технологиях, наиболее значимые из которых Spring и Hibernate.

Основные характеристики:

  • возможность редактировать контент напрямую на странице, используя Ajax-интерфейс;
  • возможность управлять бизнес-объектами (domain objects) из администраторского раздела вне зависимости от их происхождения (Hibernate, JPA, custom DAO);
  • поддержка многоязычности как в интерфейсе, так и в содержимом;
  • поддержка модулей;
  • поддержка мультисайтинга;
  • настраиваемые шаблоны оформления, возможность управлять блоками содержимого прямо на сайте;
  • управление пользователями;
  • красивые урлы вида site.com/level1/level2/../page.html;
  • возможность интегрирования в существующие приложения.

Системные требования:

  • работает на любой платформе с установленной Java-машиной от версии 1.5;
  • использует сервлет-контейнеры, поддерживающие спецификацию 2.5;
  • для доступа к данным использует Hibernate, что даёт возможность выбирать СУБД из набора доступных;
  • некоторые функции требуют наличия библиотеки ImageMagick, которая также доступна на большинстве платформ.

Используемые библиотеки:

  • Spring Framework — в качестве IoC-контейнера и web MVC фреймворка;
  • ORM фреймворк Hibernate;
  • шаблонизатор FreeMarker;
  • Direct Web Remoting — библиотека, позволяющая коду Javascript в браузере взаимодействовать с Java-объектами на сервере. Линейка инструментов сайта (Riot Toolbar) использует DWR для создания пользовательского интерфейса на Ajax;
  • Apache Ant — java-утилита для автоматизации процесса сборки программного продукта;
  • Ivy — менеджер определения зависимостей, отличающийся гибкостью и простотой.

Документация:

Документации на систему немного. Разработчики riot настаивают на том, что система базируется на известных хорошо документированных технологиях и разобраться с надстройками riot'а будет нетрудно. Есть группа в гугл, в которой происходит обсуждение системы, есть online JavaDoc и fmdoc.

Создание нового Riot проекта


Создавать новый проект будем в Эклипсе (с установленным плагином Web Standard Tools). Если вы не хотите использовать IDE, просто создайте новую папку будущего проекта.
web developer at work
В созданной папке разместите следующий ant-файл setup.xml и запустите цель по-умолчанию
(wget http://riotfamily.org/setup.xml && ant -f setup.xml).


Setup.xml cкачивает файл www.riotfamily.org/setup/skeleton-8.0.zip и распаковывает его. Выполняет ant-скрипт skeleton.xml. Удаляет skeleton.xml, setup.xml, skeleton-8.0.zip.

Выполнение файла skeleton.xml.
Файл проверяет, был ли создан проект в Eclipse, и если да, то скрипт патчит несколько конфиг-файлов в IDE. (например, папка build/conf добавляется в список source folders). После этого вызывается процедура setup файла build.xml, которая выполняет разрешение зависимостей с помощью Ivy и строит проект. У меня построение проекта заняло около 15 минут, за них иви вытянул одиннадцать мегабайт библиотек.

После того, как завершится построение проекта, обновите структуру проекта из Эклипса для того, чтобы увидеть файлы, загруженные во время создания проекта.
web developer at work
Если вы не используете редактор, для создания WAR-файла воспользуйтесь командой «ant war».

Созданный war-файл разместите в папку webapps Томката и перезапустите сервер.

Сайт по-умолчанию будет доступен по адресу localhost:8080/<context>/.
Админ панель будет доступна по адресу localhost:8080/<context>/riot.
Username: admin
Password: admin
web developer at work
Русификация Riot

Riot использует кодировку utf8, но для того, чтобы система стала понимать кириллицу, нужно проверить несколько настроек приложения.
  1. Проверить кодировку СУБД. Для MySQL мне пришлось в файле my.cnf (my.ini) писать:
    character-set-server = utf8
    collation-server = utf8_general_ci
  2. Для корректного преобразования текста в картинку (пакет org.riotfamily.website.txt2img) подключить в файле riot-config/website-servlet.xml кириллические шрифты (например этот);
  3. Для перевода меню админки в адресную строку браузера введите команду javascript:void(frameset.toggleI18n()), после чего возле каждой надписи появится жёлтая кнопка [l18n]. Жмите на неё и переводите меню.

web developer at work
Настройка подключения к БД

По-умолчанию Riot использует HSQLDB и не хранит изменения в системе после перезагрузки. Для настройки работы с MySQL (PostgreSQL) измените настройки файла conf\default\application.properties в соответствии с рекомендациями, приведёнными в conf\mysql\application.properties или conf\postgres\application.properties.

Ошибки, возникшие во время установки

1. После построения проекта у меня в Эклипсе возникли ошибки валидации spring-beans-2.5.xsd. Решение оказалось простое.
2. Также при создании таблицы riot_dbmsgsrc_entries возникла ошибка.
Пришлось менять код:
  1. CREATE TABLE `riot_dbmsgsrc_entries` (
  2.   `id` bigint(20) NOT NULL auto_increment,
  3.   `bundle` varchar(255) collate utf8_general_ci default NULL,
  4.   `code` varchar(255) collate utf8_general_ci default NULL,
  5.   `comment` longtext collate utf8_general_ci,
  6.   PRIMARY KEY  (`id`),
  7.   UNIQUE KEY `bundle` (`bundle`,`code`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1 ;

на
  1. CREATE TABLE `riot_dbmsgsrc_entries` (
  2.   `id` bigint(20) NOT NULL auto_increment,
  3.   `bundle` varchar(255) collate utf8_general_ci default NULL,
  4.   `code` varchar(255) collate utf8_general_ci default NULL,
  5.   `comment` longtext collate utf8_general_ci,
  6.   PRIMARY KEY  (`id`),
  7.   UNIQUE KEY `bundle` (`bundle`(100),`code`(100))
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1 ;

3. У меня не получилось запустить Томкет из редактора, поэтому я в build.xml добавил цели запуска/останова сервера и цель размещения war-файла в папке webapps. Мои изменения:
  1. <!-- The Tomcat folder-->
  2. <property name="tomcat.dir" value="C:/Program Files/Apache Software Foundation/Tomcat 6.0" />
  3.  
  4. <!-- The Tomcat webapp content -->
  5. <property name="tomcat.webapp.dir" value="${tomcat.dir}/webapps" />
  6.  
  7. <!-- Copies war file into Tomcat -->
  8. <target name="deploy-tomcat" depends="war" description="Copies war file into Tomcat">
  9.     <antcall target="tomcat-stop" />
  10.     <copy file="${war.location}" todir="${tomcat.webapp.dir}"/>
  11.     <delete dir="${tomcat.webapp.dir}/${ant.project.name}"/>
  12.     <antcall target="tomcat-start" />
  13. </target>
  14.  
  15. <!-- Runs Tomcat -->
  16. <target name="tomcat-start">
  17.     <java jar="${tomcat.dir}/bin/bootstrap.jar" fork="true">
  18.         <jvmarg value="-Dcatalina.home=${tomcat.dir}"/>
  19.     </java>
  20. </target>
  21.  
  22. <!-- Stops Tomcat -->
  23. <target name="tomcat-stop">
  24.     <java jar="${tomcat.dir}/bin/bootstrap.jar" fork="true">
  25.         <jvmarg value="-Dcatalina.home=${tomcat.dir}"/>
  26.         <arg line="stop"/>
  27.     </java>
  28. </target>


Выводы


Riot — интересная и гибкая система, построенная на java-технологиях. Riot предоставляет разработчику каркас веб-приложения с уже реализованными основными функциями CMS.
+35
6 августа 2010, 12:20
53
schaan 28,0

комментарии (20)

+1
Kodeks #
Как там насчёт гибкой системы безопасности?
Допустим определённым пользователям дать редактировать часть формы?
+3
schaan #
В обсуждении пишут, что всё настраивается.
+3
schaan #
В группе обсуждения пишут, что всё настраивается.
0
Kodeks #
Нужно будет ознакомиться, спасибо за обзор.
+8
Kipriz #
В своё время в компании искали CMS на Java, остановились на Apache Lenya. Та ещё штучка: внутри Apache Cacoon, XSLT, всё достаточно запутанно. Зато лицензия сама свободная (Apache License) — делай с ней что хочешь. Пока её дорабатывали под нужды заказчика, оказалось, что архитектура вполне стройная, IoC какой-никакой есть, страницы можно генерировать хоть на обычном HTML, хоть в XML, хоть под телефоны.
В общем, если кому-то интересно, могу написать небольшой обзор.
0
schaan #
Очень интересно будет прочитать про архитектуру вашего приложения. Хоть в общих чертах.
+2
Kipriz #
Вот обзор Apache Lenya kipriz.habrahabr.ru/blog/101294/
0
kastaneda #
поддерживаю, было бы очень интересно прочитать обзор
+2
mresc #
А как с производиельностью у Riot? Мы тоже искали CMS на Java и наткнулись на Liferay Portal с его довольно мощной CMS и всем остальным, что дается в «догонку» (Forum, Wiki, IM, Document Management, Image Gallery, Announcements, Webmail). Так он ресурсы требовал, что плакать хотелось… да и реагировал не так шустро, с нагрузкой и без. Сразу вспоминались «потехи» на php вроде Joomla и Drupal. Маленькие, стройные, непрожорливые и отзывчивые.
+1
mikhailian #
А почему потехи? Liferay ну никак не мощнее Drupal. И пользователей у Liferay поменьше будет.
+2
mresc #
Простота администрации Liferay очень понравилась… Гибкость настройки, немалое количество Portlets с функционалом из коробки. Возможность создания сложных структур (Organisations, Sub-Organisations, Locations, Communities, Pages, User Roles, User Groups). Готовность работать в кластере. Простота написания собственных модулей-портлетов. После Liferay не видел ни одной CMS, которая бы делала управление действительно удобным.

Демо Riot этим же порадовало — нет разделения между тем, что видит пользователь и тем, что «лепит» админ.

Drupal от таких удобств далек. Поэтому потехи…
0
mikhailian #
А я вот в Sun Glassfish Web Space Server, который вроде как основан на Liferay, не смог создать HTML документ и опубликовать его на первой странице.
0
mresc #
Sun Glassfish Web Space Server я еще не видел. В чистом Liferay это делается легко и безпроблемно: на самой странице через Liferay-Dock добавляем Web-Content Portlet куда надо на страницу и вводим текст через Wysiwyg редактор. Все… ну или если хочется можно на других языках сразу текст тоже ввести. Интернационализация встроена и работает как часы.
–1
malkolm #
какая ядовитая раскраска кода, столько красного что возникает ощущение — там одни ошибки! смените на синий и сразу удивитесь, насколько легче воспринимать стало
–2
malkolm #
Ну и да, в заголовке определенно должен был упоминаться Riot. Вы хоть видите, что от спринга тут только конфиги видны? В чем прикол его то в заголовке указывать.
0
schaan #
1. Цвет поменял на более синий. Глаз не режет, но читается хуже.
2. Тут и от riot'a одни конфиги. Мне понравилось такое название.
0
malkolm #
нормальный синий, а не бледный
–2
smithj #
А где здесь собственно Spring в действии?
+1
Chikey #
едрить твою… незря я выбрал rails
0
schaan #
Да, не зря.

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