Совместное использование приложений на Java и Ruby
Составитель Тор Норби (Tor Norbye), редактор Бет Стернс (Beth Stearns)
Декабрь 2007 г. [номер версии: V6.0-1]
В этой статье описывается объединение приложений на Ruby и Java с помощью среды IDE NetBeans.
Содержание
Требования для работы со статьей
В этой статье показано объединение приложений на Java с приложениями на Ruby. Одновременно демонстрируется ряд новейших возможностей Ruby в среде IDE NetBeans 6.0.
Для работы со статьей требуются следующие предпосылки:
- базовые знания в области программирования с использованием технологий Ruby;
- установленная на компьютере среда IDE NetBeans 6.0 c Ruby (загрузить).
Указания по настройке
Можно выделить несколько подготовительных задач, которые в основном связаны с настройкой базы данных и работой с архивами JAR TopLink. Ниже показан способ добавления требуемых данных о валюте в таблицу базы данных. При настройке проекта Rails добавляются необходимые архивы JAR TopLink.
Базу данных необходимо настроить следующим образом:
- Создайте таблицу с названием CURRENCY.
- Создайте три столбца строкового типа (или VARCHAR) в таблице CURRENCY: "Country", "Currency" и "Name".
- Заполните таблицу данными. Например, можно добавить три валюты плюс произвольное количество других: "USA", "Dollar", "USD"; "Czech Republic", "Koruna", "CZK"; "Norway", "Krone", "NOK".
Также необходимо настроить доступ к таблице базы данных из среды NetBeans. Если это необходимо, следует настроить драйвер JDBC для базы данных и добавить источник данных в окне "Services".
Например, следующий код SQL создает таблицу CURRENCY в базе данных Derby с названием SAMPLE (используется комбинация имени пользователя и пароля APP/APP). Если требуется использовать ту же базу данных SAMPLE, таблицу можно создать путем выполнения этого SQL-кода в IDE (после подключения к базе данных SAMPLE). Можно создать и собственную базу данных в меню "Tools->Java DB Database->Create Database". Код SQL для создания такой же таблицы в другой СУБД может отличаться от приведенного в примере.
drop table "APP"."CURRENCY";
create table "APP"."CURRENCY" (
country VARCHAR(20), currency VARCHAR(20), name VARCHAR (20),
id INTEGER GENERATED always AS IDENTITY);
alter table CURRENCY add constraint currencyPK PRIMARY KEY (id);
INSERT INTO CURRENCY VALUES ('USA', 'Dollar', 'USD',DEFAULT);
INSERT INTO CURRENCY VALUES ('Czech Republic', 'Koruna', 'CZK',DEFAULT);
INSERT INTO CURRENCY VALUES ('Norway', 'Krone', 'NOK',DEFAULT);
INSERT INTO CURRENCY VALUES ('France', 'Euro', 'EU',DEFAULT);
Создание проекта Java
Сразу по выполнении задач настройки можно создать проект. Сначала создается настольное приложение на Java, которое фактически является приложением Swing, и выбирается вариант связывания с базой данных. Мастер позволяет выполнить все действия, необходимые для подключения проекта (назовем его "Money") к источнику данных, т.е. в нашем случае – к таблице CURRENCY примера базы данных Derby. После нескольких щелчков мышью полнофункциональное приложение типа CRUD для работы с базой данных готово.
Запустите приложение Money (щелкните правой кнопкой мыши проект и выберите "Run"), и откроется экран, подобный следующему. (Для выхода из приложения нажмите комбинацию клавиш Ctrl+Q.)
Рис. 3: Приложение "Money"
Изменение проекта Java
Начнем с исследования автоматически созданных классов Java; в частности, класса Currency.java. Ниже приводится ряд рекомендаций по просмотру элементов проекта.
В окне "Projects" разверните узел проекта "Source Packages->money" и дважды щелкните файл Currency.java для его открытия в редакторе исходного кода. Весь класс и его код выводится в окне редактора.
Члены класса
Для просмотра членов класса Currency необходимо нажать Ctrl+F12. Для быстрого перемещения внутри класса удобно пользоваться диалоговым окном "Members".
Рис. 4: Члены класса Currency.java
Например, для просмотра определения класса введите в поле "Filter" Cur.
Рис. 5: Определение класса "Currency"

Примечание: Убедитесь в том, что в созданном коде Currency.java правильно объявляется поле идентификатора ID. Вероятно, к файлу Java потребуется добавить строку, указывающую на то, что идентификатор создан автоматически и уникален. Ниже приведен правильный код для поля идентификатора. Также отметим, что при добавлении строки для типа создания (@GeneratedValue (strategy=GenerationType.IDENTITY)) вероятно возникновение ошибки отсутствия импорта, так что строка будет подчеркнута красным цветом. Это положение нетрудно исправить: достаточно щелкнуть ошибку и нажать Alt+Enter.
@Id
@GeneratedValue (strategy=GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
private Integer id;
Список задач
В среде IDE автоматически ведется список задач, содержащий ошибки компиляции, предупреждения и т.д. Список задач можно в любое время открыть и просмотреть сочетанием клавиш Ctrl+6.
Рис. 6: Список задач
Ознакомьтесь с исходным кодом Currency. Обратите внимание, что в нем содержатся аннотации интерфейса API сохранения состояния объектов Java. Эти аннотации означают привязку к столбцам базы данных и отмечаются знаком "at" (@). Например, привязки к столбцам базы данных отмечаются аннотацией @Column, за которой следует имя столбца и переменная Java, например: @Column(name="COUNTRY") private String country;
Создание класса Java для доступа к столбцам базы данных
Требуется создать новый класс Java с названием CurrencyLookup, который обращается к этим объектам сохранения состояния Java – столбцам базы данных. Затем приложение на Rails вызывает этот класс CurrencyLookup для получения списка валют из базы данных. Эта задача упрощается благодаря функциям автозавершения кода и шаблонов в редакторе исходного кода.
Создайте в классе CurrencyLookup метод getAll, возвращающий список валют. Готовый метод выглядит следующим образом. Обратите внимание, что единица сохранения состояния samplePU соответствует имени использованной базы данных SAMPLE. Это не строгое требование.
public List<Currency> getAll() {
EntityManager em = Persistence.createEntityManagerFactory("samplePU").createEntityManager();
Query query = em.createQuery("select c from Currency c");
return query.getResultList();
};
- Щелкните правой кнопкой мыши узел money в "Source Packages" и выберите "New > Java Class".
- Введите CurrencyLookup в поле "Class Name" в диалоговом окне "New Java Class". (В диалоговом окне должно указываться местоположение "Source Packages" и имя пакета money. Если это не так, необходимо выполнить соответствующую настройку.) В среде IDE создается класс CurrencyLookup.java, который помещается в узел "Source Packages -> money".
- Создайте метод, возвращающий список всех валют. При этом удобно пользоваться функциями IDE (например, автозавершением кода, исправлением операторов импорта и т.д.). Начните с ввода pu (для public) где-либо внутри класса CurrencyLookup, а затем нажмите комбинацию клавиш Ctrl+Space. Отметим, что текст автоматически дополняется. (Приведенные здесь комбинации клавиш предназначены для платформы Windows; на других платформах могут использоваться другие комбинации. Точную комбинацию клавиш для конкретной среды можно выяснить в файле "Help -> Keyboard Shortcuts".)
Рис. 7: Автозавершение кода
- Введите List<Cu, а затем нажмите комбинацию клавиш Ctrl+K для автозавершения имени класса Currency. Имя завершается как CurrencyLookup, так что необходимо удалить Lookup.
Рис. 8: Автозавершение кода имени класса
- Продолжайте вводить имя метода и остальную часть кода метода.
Дополнительные рекомендации по внесению изменений в исходный код
Приведем ряд дополнительных рекомендаций по внесению изменений в исходный код:
- Функция "Fix Imports" в контекстном меню окна редактора позволяет импортировать недостающие классы.
- Для просмотра рекомендаций относительно элементов, отсутствующих в методе, нажмите комбинацию клавиш Alt+Enter.
- При изменении тела метода по нажатию клавиши Return вставляется закрывающая фигурная скобка (}).
- Быстро заменить слово можно путем наведения курсора на это слово и нажатия Ctrl+R с последующим вводом нового текста.
Готовый класс запроса CurrencyLookup можно при необходимости протестировать. Для этого используется функция "Tools -> Create JUnit Test" или комбинация клавиш Ctrl+Shift+U. При этом автоматически создается скелетный класс CurrencyLookupTest. Фиктивный код можно удалить, после чего добавить для тестирования строку assertFalse. Например, для тестирования непустого статуса строки, возвращенной из базы данных, можно добавить следующую строку: assertFalse ("contains data", new CurrencyLookup().getAll().isEmpty());. Затем для запуска тестирования необходимо нажать Shift+F6.
Написание приложения на Rails
Теперь создайте приложение на Rails, обращающееся к коду Java в приложении "Money". Сначала потребуется небольшая подготовка, в т.ч. сборка проекта "Money" и добавление к проекту Rails нескольких архивов JAR.
Создание и настройка проекта Rails
- Сначала убедитесь в том, что настольное приложение Money на Java сформировано. Выберите в контекстном меню проекта функцию "Clean and Build" или нажмите комбинацию клавиш Shift+F11.
- Создайте новый проект "Ruby -> Ruby on Rails". Примите в мастере значения по умолчанию и создайте проект Rails в IDE. (Если установлен естественный Ruby на C, предлагается выбрать интерпретатор Ruby. Следует выбрать встроенный интерпретатор JRuby.)
- Затем следует настроить ряд свойств Java для проекта Rails. А именно, требуется добавить архивы JAR TopLink для интерфейса API сохранения состояния объектов Java плюс архив JAR для настольного приложения Money на Java. (Файл Money.jar расположен в каталоге /dist проекта "Money".) Щелкните правой кнопкой мыши узел проекта "Ruby" и выберите "Properties". Выберите категорию "Java", а затем нажмите кнопку "Add JAR/Folder". Перейдите к трем архивам JAR и добавьте их. Убедитесь в том, что добавлены toplink-essentials-agent.jar и toplink-essentials.jar; оба этих файла расположены в установочном каталоге NetBeans java1/modules/ext/toplink/. Файл Rails config/database.yml в этом проекте изменять не требуется, так как в приложении на Rails для работы с базой данных используется код Java.
Рис. 10: Добавление архивов JAR
Добавление поиска валют к проекту Rails
На этом этапе выполняется изменение автоматически созданного проекта Rails для использования кода поиска валют из проекта Java "Money".
- Сначала необходимо запустить проект Rails и вывести таким образом в обозревателе стандартную пустую страницу Rails. Измените URL-адрес по умолчанию; этот адрес должен указывать на приложение. Например, возможен следующий вид: http://localhost:3001/; в конце следует добавить /money/list. В обозревателе выводится сообщение ошибки при маршрутизации. По завершении написания кода (добавляется действие, реагирующее на этот URL-адрес) приложение будет выполняться в обозревателе корректно.
- Создайте контроллер "money" и представление списка с помощью генератора кода Rails. Выберите "Generate" из контекстного меню проекта Rails. В поле "Generate" диалогового окна "Rails Generator" выберите controller и введите money в поле "Name" и list в поле "View". Нажмите кнопку "OK".
Рис. 11: Создание контроллера "money"
Созданный контроллер money открывается в окне редактора. Добавьте к контроллеру код, позволяющий приложению работать с кодом Java (require 'java'), и добавьте класс Java CurrencyLookup (include_class 'money.CurrencyLookup'). После этого класс Java CurrencyLookup проекта "Money" можно вызывать обычным образом. Также следует иметь в виду, что в среде IDE имеется средство автозавершения кода специально для Ruby и Rails; для автозавершения имен методов и т.п. можно нажать Ctrl+K и Ctrl+Space.
Ниже приводится полный код для класса MoneyController:
class MoneyController < ApplicationController
def list
require 'java'
include_class 'money.CurrencyLookup'
lookup = CurrencyLookup.new
@list = lookup.get_all
end
end
Настройка представления
Ниже приведена методика создания правильно отформатированной таблицы, в которой выводятся три столбца из базы данных. Также демонстрируются некоторые комбинации клавиш IDE для Ruby.
- Откройте представление списка, созданное для класса MoneyController. Вызовите функцию "Navigate -> Goto Rails Action/View" или нажмите комбинацию клавиш Ctrl+Shift+A. В редакторе открывается файл list.rhtml или представление Money#list.
- Вставьте скелет таблицы в представление списка. Для ускорения процесса введите table и нажмите клавишу Tab. В среде IDE автоматически добавляется HTML для строк и ячеек таблицы.
Рис. 12: Использование клавиши Tab
- Выберите блок строки таблицы (<tr>) и нажмите комбинацию клавиш Alt+Enter. Поскольку требуется итерация по списку валют, строки таблицы следует заключить в цикл for. По комбинации клавиш Alt+Enter выводится вариант быстрого ввода, обозначенный значком лампочки. Выберите Surround with for и нажмите клавишу Enter.
Рис. 13: Использование комбинации клавиш Alt+Enter
- Теперь измените параметры цикла for в соответствии с данными о валютах. Для перехода между этими параметрами используется клавиша Tab. Назовем переменную цикла c вместо f и заменим @field на @list. Добавьте дополнительные теги ячеек таблицы (<td></td>) внутрь тега строки (<tr></tr>) с помощью комбинации клавиш для автозавершения кода.
Рис. 14: Использование автозавершения кода для добавления тегов HTML
- Вставьте шаблон кода для выражения Ruby между тегами ячейки таблицы. Введите re, а затем нажмите клавишу Tab. При этом вставляется выражение Ruby <%= %>.
Рис. 15: Вставка выражений Ruby
- Создайте три таких блока ячеек с выражением Ruby <%= %> в каждом. Вставьте имена столбцов валют (c.country, c.code и c.name) в блоки <%= %>. После этого код должен выглядеть следующим образом:
<h1>Money#list</h1>
<p>Find me in app/views/money/list.rhtml</p>
<table border="1">
<% for c in @list %>
<tr>
<td>
<%= c.country %>
</td>
<td>
<%= c.currency %>
</td>
<td>
<%= c.name %>
</td>
</tr>
<%end%>
</table>
- Нажмите комбинацию клавиш Shift+F6 для просмотра таблицы в обозревателе. Общий вид должен соответствовать приведенному ниже, в зависимости от валют, добавленных к базе данных:
Рис. 16: Вывод таблицы валют Ruby
Заключение
В этой статье было продемонстрировано объединение приложения на Ruby on Rails с настольным приложением на Java. В настольном приложении на Java содержался код для доступа к таблице базы данных, а приложение на Ruby вызывало написанный на Java код доступа к таблице базы данных для получения и вывода данных.
Также в статье был показан ряд сочетаний клавиш, доступных при разработке приложений на Java и Ruby.
Что дальше?
>> Дополнительная документация по Ruby в среде NetBeans