Apache Cayenne: создаём веб-приложение и работаем с СУБД ЛИНТЕР
В первой статье мы познакомились с Apache Cayenne и создали простое работающее приложение. В этой статье мы конвертируем это приложение в веб-приложение, а затем научим его работать с СУБД ЛИНТЕР.
Если вы не читали первую статью, то вот она: "Apache Cayenne: знакомимся и создаём простое приложение".
Конвертация проекта в веб-приложение
Типичное веб-приложение с Cayenne работает следующим образом:
-
-
- Конфигурация Cayenne загружается при старте контекста приложения, с помощью специального фильтра сервлетов.
- Пользовательские запросы перехватываются фильтром, и DataContext привязывается к потоку, который обрабатывает запрос. Таким образом, приложение может получить доступ к DataContext в любом месте.
- Тот же экземпляр DataContext может быть использован внутри простой пользовательской сессии. Разные сессии используют разные экземпляры DataContexts (и, соответственно, разные наборы объектов). Контекст может применяться по-разному в зависимости от специфики приложения. Здесь мы будем использовать контекст ограниченный сессией.
-
Итак, приступим к созданию веб-приложения:
-
-
- В Eclipse в папке нашего тестового проекта создайте новую папку «src/main/webapp/WEB-INF».
- В папке «WEB-INF» создайте файл «web.xml» (стандартное описание веб-приложения) со следующим содержанием:
-
-
-
- Создайте страничку для просмотра художников «src/main/webapp/index.jsp» со следующим содержимым:
-
-
-
- Создайте страничку для редактирования художника «src/main/webapp/detail.jsp» со следующим содержимым:
-
Теперь запустим наше веб-приложение с помощью «maven-jetty-plugin». Чтобы сделать это выполните следующие действия:
-
-
- Добавьте следующий кусок текста в файл «pom.xml» после секции «dependencies» и сохраните изменения:
-
-
-
- Вызовите меню «Run -> Run Configurations...», выберите в списке слева «Maven Build», щёлкните правой кнопкой мышки и выберите «New».
- Убедитесь, что поля «Name», «Base directory» и «Goals» заполнены так, как показано на рисунке снизу:
-
-
-
- Щёлкните «Apply» и «Run». При первом запуске плагина Jetty может уйти несколько минут на загрузку всех зависимостей, но в конечном итоге вы увидите подобные сообщения в консоли:
-
-
-
- Это значит, что Jetty контейнер стартовал.
- Теперь откройте ссылку http://localhost:8080/example/ в браузере. Вы должны увидеть сообщение «Художники не найдены» в вашем браузере и следующий текст в консоли Eclipse:
-
-
-
- Вы можете щёлкнуть по ссылке «Добавить нового художника...», чтобы добавить художников. Существующих художников можно редактировать.
-
Создание схемы базы данных в СУБД ЛИНТЕР с помощью CayenneModeler
Наш пример, который мы сделали выше, работает с базой данных хранящейся в памяти. Чтобы при остановке приложения все данные не пропадали, давайте попробуем создать скрипт на создание таблиц для реальной СУБД с помощью моделера Cayenne. Практика использования Cayenne с СУБД MySQL и IBM DB2 у меня уже есть, а вот попробовать, как Cayenne будет работать с СУБД ЛИНТЕР, мне было бы интересно.
Для корректного взаимодействия с различными СУБД в Cayenne предусмотрены так называемые адаптеры, которые позволяют учитывать различные диалекты SQL. По умолчанию, в Cayenne уже есть адаптеры для всех распространённых СУБД, за исключением СУБД ЛИНТЕР. Есть правда универсальный адаптер «org.apache.cayenne.dba.JdbcAdapter», но через него Cayenne отказался работать с СУБД ЛИНТЕР – происходят ошибки при записи изменений.
Но выход есть. Я обратился к разработчикам, и они любезно предоставили мне архив с исходниками пакета диалекта СУБД ЛИНТЕР, в котором реализован адаптер «org.apache.cayenne.dba.linter.LinterAdapter». Поддерживаются разные версии Cayenne. Скачать этот архив можно здесь:
Пакет диалекта СУБД ЛИНТЕР для работы с Apache Cayenne Версия:От 14.08.2015 | |
Пакета диалекта СУБД ЛИНТЕР для работы с Apache Cayenne к статье "Apache Cayenne: создаём веб-приложение и работаем с СУБД ЛИНТЕР". |
|
14.08.2015 49.36 KB 1659 |
Для сборки пакета диалекта используется Apache Maven (скачать можно здесь). Для установки Maven, просто распакуйте архив и пропишите в переменную среды путь к папке bin (в которой лежит файл mvn.cmd). Проверьте также, чтобы была добавлена переменная среды JAVA_HOME, в которой хранится путь к JDK (у меня – это «C:\Program Files\Java\jdk1.7.0_25»). Для проверки установки вызовите в консоли команду «mvn –v».
Итак, чтобы собрать пакет диалекта СУБД ЛИНТЕР, сделайте следующее:
-
-
- Распакуйте архив с исходниками. Я распаковал архив в папку «C:\linter».
- Выберите версию пакета, в зависимости от версии Cayenne. Для Cayenne 3.1 – это папка «cayenne/v3» (у меня это папка «C:\linter\cayenne\v3»).
- Из консоли выполните для выбранной папки команду «mvn clean install».
- После выполнения команд в папке «cayenne/v3/target» создастся файл «linter-cayenne3-1.0.1.jar» (у меня это папка «C:\linter\cayenne\v3\target») и, кроме того, пакет будет зарегистрирован в локальном хранилище Maven (это нужно для использования в Eclipse).
-
Также для работы с базой данных вам понадобится JDBC-драйвер (в нашем примере для JDK 1.5 – это файл linjdbc-1.4.jar). Найти его можно в папке «jdbc» в месте установки СУБД ЛИНТЕР (если при установке вы выбрали соответствующую опцию).
После того как у нас есть драйвер (файл linjdbc-1.4.jar) и адаптер (файл linter-cayenne3-1.0.1.jar) можно приступать к настройке Cayenne.
Сначала познакомим моделер Cayenne с JDBC-драйвером СУБД ЛИНТЕР (это нужно для того, чтобы выполнять скрипт на создание таблиц прямо из моделера) и адаптером (это нужно для генерации скриптов с учётом диалекта СУБД ЛИНТЕР).
-
-
- Щёлкните по пункту меню «Tools -> Preferences».
- В диалоге настроек «Edit Preferences» выберите «ClassPath» в списке слева.
- Щёлкните по кнопке «Add Jar/Zip» и выберите файл драйвера (linjdbc-1.4.jar).
- Щёлкните по кнопке «Add Jar/Zip» ещё раз и выберите файл пакета диалекта (linter-cayenne3-1.0.1.jar).
-
-
-
- Нажмите кнопку «Save», чтобы сохранить изменения (до того как эти изменения не сохранены, моделер Cayenne ничего не будет знать о драйвере и адаптере СУБД ЛИНТЕР).
-
Теперь создадим локальный источник данных Cayenne. Локальные источники данных используются только в моделере Cayenne для соединения с базами данных или быстрого создания новых узлов данных.
-
-
- Щёлкните по пункту меню «Tools -> Preferences».
- В диалоге настроек «Edit Preferences» выберите «Local DataSources» в списке слева.
- Щёлкните по кнопке «New».
- В очередном открывшемся диалоге «Create New Local DataSource» нужно задать имя источника данных. Введите в поле «Name» текст «LinterDataSource». В выпадающем списке адаптеров вы можете увидеть адаптеры для различных распространённых СУБД. Адаптеры позволяют генерировать SQL код специфичный для разных СУБД, а также автоматически заполняют поля «JDBC Driver» и «DB URL». Для СУБД ЛИНТЕР в этом списке адаптер не отображается, но это не страшно, мы зададим его чуть позже. Оставьте в этом поле значение «Custom / Undefined».
-
-
-
- Нажмите «Create».
- Теперь в поле «JDBC Driver» пропишите «com.relx.jdbc.LinterDriver», а в поле «DB URL» пропишите «jdbc:linter:linapid:localhost:1070:local» (я буду соединяться с демонстрационной базой данных, которая была создана на моём компьютере при установке СУБД ЛИНТЕР). В полях «User Name» и «Password» задайте имя пользователя и пароль для подключения к базе данных. В поле «Adapter» пропишите «org.apache.cayenne.dba.linter.LinterAdapter».
-
-
-
- Проверьте подключение, нажав на кнопку «Test...». Если вы всё настроили правильно, то вы увидите сообщение «Connected Successfully». Обратите внимание, что для работы JDBC-драйвера нужно запустить JDBC-сервер ЛИНТЕР.
-
Теперь создадим и выполним скрипт на создание таблиц:
-
-
- Выделите «datamap» в дереве слева и щёлкните по пункту меню «Tools -> Generate Database Schema». После этого поднимется диалог «Generate DB Schema: Options».
- На закладке «SQL Options» вы можете выбрать, что нужно удалять и создавать и здесь же задаётся адаптер. Поскольку, нужных таблиц в базе данных у нас ещё нет, проставьте только галки на создание объектов, как показано на картинке. Также в поле «Adapter» пропишите «org.apache.cayenne.dba.linter.LinterAdapter» и нажмите клавишу «Enter», чтобы SQL-скрипт перестроился.
-
-
-
- На закладке «Tables» вы можете выбрать нужные таблицы (нам нужно выбрать все таблицы).
- Нажмите «Generate».
- После этого появляется диалог «Generate DB Schema: Connect to Database», в котором выберите созданный выше локальный источник данных и нажмите «Continue».
-
-
-
- После того как скрипт выполнится, вы увидите сообщение «Schema Generation Complete».
-
После этого вы можете с помощью рабочего стола ЛИНТЕР удостовериться, что таблицы в базе данных действительно создались.
Перенастройка веб-приложения на работу с СУБД ЛИНТЕР
Для начала создадим новый узел данных (мы не будем удалять или изменять узел данных, который был сделан для in-memory базы данных, а просто добавим ещё один).
-
-
- Щёлкните по кнопке «Create DataNode».
- Выберите локальный источник данных, который мы создали выше, из выпадающего списка «Local DataSource» и нажмите кнопку «Sync with Local» (синхронизировать с локальным источником данных). Как видите все поля JDBC-конфигурации после нажатия на кнопку «Sync with Local» заполнились из выбранного локального источника данных.
-
-
-
- Перейдите на закладку «Adapter», введите в поле «Custom Adapter» текст «org.apache.cayenne.dba.linter.LinterAdapter» и нажмите «Enter».
-
После того как новый узел данных создан, щёлкните по карте данных «datamap» и выберите из выпадающего списка «DataNode» наш новый узел данных «datanode1» и сохраните изменения.
Перед тем как идти дальше, нам ещё нужно добавить JDBC-драйвер СУБД ЛИНТЕР в локальное хранилище Maven. Иначе мы не сможем прописать зависимости Maven и наше веб-приложение не увидит драйвер. Делать это вручную приходится потому, что никаких JAR-файлов ЛИНТЕР в хранилище Maven я не обнаружил.
Итак, чтобы добавить файл linjdbc-1.4.jar в локальное хранилище Maven перейдите в папку с этим файлом (у меня это папка «C:\Program Files (x86)\Linter\jdbc\») и выполните следующую команду из консоли:
Теперь возвращаемся в Eclipse. Остановите наше веб-приложение, если оно выполняется (кнопка «Terminate» в панели инструментов консоли) и обновите наш проект (пункт контекстного меню «Refresh»).
Затем добавьте в файл «pom.xml» внутрь секции «dependencies» следующий кусок текста и сохраните изменения:
Теперь, когда всё готово, запустите наш веб-проект снова, для этого щёлкните правой кнопкой мышки по названию проекта и выберите «Run As -> Maven Build». После запуска приложения опять откройте в браузере страничку http://localhost:8080/example/ и опять добавьте художников.
После добавления убедитесь с помощью рабочего стола ЛИНТЕР, что данные сохранились в базе данных.
Как видите, теперь данные сохраняются реальной в СУБД и после остановки приложения наши труды не пропадут. Можете остановить приложение, запустить его снова и убедиться, что добавленные художники остались в базе данных.
Подведём итог
Итак, из этих двух статей вы узнали, что такое Cayenne и научились использовать его основной функционал. Конечно, эта платформа даёт ещё много возможностей, которые не описаны в этих статьях, но те основы, которые описаны здесь, помогут вам начать правильно использовать мощный инструмент под названием Apache Cayenne.
Tags: Apache Cayenne Обзоры инструментов для программирования Учебники по программированию ЛИНТЕР