За последний несколько лет популярность платформы Eclipse в качестве интегрированной среды для написания IDE-средств (interactive development environment - среда интерактивной разработки) значительно возросла. С появлением версии Eclipse 3.0 эта технология была расширена для поддержки разработки "богатых" клиентов, предоставляя Java-разработчикам возможность писать код "богатых" клиентов, используя открытую платформу с присущим ей внешним видом и поведением.
Платформа для разработки приложений для "богатых" клиентов известна под названием Eclipse Rich Client Platform (RCP). Почему внимание снова переключается на приложения для "богатых" клиентов? После нескольких лет работы с n-уровневой архитектурой стало очевидным, что разработать приложения, предоставляющие конечному пользователю богатые возможности при работе в браузере, не просто. Основанные на браузере приложения часто пытались имитировать определенное удобство использования путем комбинирования JavaScript с HTML. Однако стало ясно, что приложения с более богатыми возможностями лучше создавать, используя более развитую клиентскую технологическую платформу. По существу, Eclipse RCP предоставляет разработчикам возможность создавать гибкие клиентские приложения (далее - клиенты), которые могут участвовать в n-уровневой архитектуре. Eclipse RCP позволяет разрабатывать приложения "богатых" клиентов следующего поколения и является основной для таких платформ клиентов, как технология IBM Workplace Client.
IBM Rational Application Developer V6 (ранее, IBM WebSphere Studio Application Developer) построена на платформе Eclipse 3.0. Это дает J2EE-разработчикам возможность создавать приложения для "богатых" клиентов, которые взаимодействуют с J2EE-приложениями. В данной статье мы будем использовать функциональные возможности Eclipse 3.0 в Rational Application Developer (здесь и далее называемом Application Developer) для создания Eclipse RCP-клиентов, вызывающих EJB-компоненты, развернутые в тестовой среде WebSphere Application Server внутри Application Developer.
Для создания Eclipse RCP-приложения,вызывающего корпоративный компонент, который выполняется внутри WebSphere Application Server V6, следуйте следующим указаниям:
Установите IBM Application Client for WebSphere Application Server. При развертывании Java-клиентов на рабочих станциях вы должны использовать клиентское программное обеспечение WebSphere для правильного взаимодействия с удаленным корпоративным компонентом, выполняющимся на WebSphere Application Server. Мы это сделаем в данной статье, чтобы продемонстрировать конфигурацию.
Разверните EJB-приложение преобразователя температуры в WebSphere Application Server, используя J2EE™ Perspective в Application Developer, который включает в себя полнофункциональную версию WebSphere Application Server для тестирования ваших приложений. Через Application Developer вы можете взаимодействовать с экземпляром WebSphere Application Server по умолчанию, вызвать административную консоль и развернуть приложение (вам не надо импортировать файл Enterprise Archive (EAR) в ваше рабочее окружение для этого демонстрационного примера). (Мы используем Application Developer для удобства; если вы используете автономный WebSphere Application Server, инструкции остаются такими же.)
Используйте среду Eclipse Plug-in Development для построения RCP-клиента. Мы настроим Eclipse Plug-in Launcher на взаимодействие с WebSphere Application Server Java Thin Client, который представляет собой обычный IBM JDK с серверными расширениями, необходимыми для взаимодействия с WebSphere Application Server. Мы выбрали его, а не J2EE Application Client Container, потому что он проще в настройке.
Экспортируйте RCP-приложение и запустите его как автономное приложение. Вы должны знать, как настраивать ваши подключаемые модули и JRE для работы с "тонким" клиентом WebSphere Application Server.
Для дальнейшей работы с этим упражнением вам понадобятся:
Rational Application Developer V6 (or Eclipse 3)
WebSphere Application Server V6 (после небольшой модификации вы можете также использовать Eclipse 3 и WebSphere Application Server V5)
IBM Application Client for WebSphere Application Server (включенный в WebSphere Application Server V6)
Прежде всего мы должны установить IBM Application Client for WebSphere Application Server, который входит в WebSphere Application Server V6 (если у вас нет клиента, то вы можете изменить вашу конфигурацию, указав на сервер JDK в тестовой среде Application Developer, либо в реальной установке WebSphere Application Server), а затем развернуть приложение в работающем WebSphere Application Server:
J2EE-клиент устанавливается при помощи Installation wizard interface (интерфейс мастера установки). После запуска LaunchPad вашей WebSphere, выберите IBM Client for IBM WebSphere Application Server.
По мере следования указаниям мастера мы установим клиента в каталог C:\WebSphere6ND\AppClient. Находящийся в загруженном zip-файле пакетный файл Windows (BAT) использует именно этот class path; если вы выберете другой каталог, придется изменить BAT-файл для ссылки на этот новый каталог. На рисунке 3 изображен третий экран мастера, в котором вы выбираете каталог.
Затем мы будем использовать Application Developer для развертывания EAR в WebSphere Application Server. Это сделано просто для удобства создания и тестирования подключаемого модуля из этого же рабочего пространства. Вы можете также развернуть приложение в автономном экземпляре WebSphere Application Server, настроив Eclipse для взаимодействия с ним.
Откройте Application Developer, используя меню Start, и перейдите в рабочее пространство, например C:\RCPEJBClient\workspace, (рисунок 3).
Перейдите в J2EE Perspective, если она не загрузилась по умолчанию.
Найдите вид Servers в нижнем фрейме и нажмите правой кнопкой мыши на WebSphere Application Server v6.0 (Рисунок 5). При этом Application Developer проверит, выполняется ли экземпляр WebSphere Application Server по умолчанию.
Сервер опять должен перейти в состояние "Stopped". Нажмите правой кнопкой мыши на сервере и выберите Start (рисунок 6). (Для запуска сервера можно также перейти в каталог <Application Developer_INSTALL_ROOT>/runtimes/profiles/default/bin и выполнить команду startserver server1).
После запуска сервера вы можете запустить консоль администратора, нажав правой кнопкой мыши на сервере и выбрав команду Run administrative console (или открыть браузер и перейти по адресу http://localhost:9060/admin), как показано на рисунке 7.
Просмотрите C:\RCPEJBClient, выберите TemperatureEAR.ear и затем нажмите Next (рисунок 10). Приложение TemeratureEAR представляет собой простой метод, преобразующий температуру из шкалы по Цельсия в шкалу по Фаренгейту (хотя, возможно, не слишком точно).
На следующей странице Step 1 процесса установки приложения выберите Deploy enterprise beans (развернуть корпоративные компоненты), а затем Step 7 Summary (рисунок 12).
Теперь мы готовы создать клиентское приложение RCP в виде простого подключаемого модуля при помощи мастера Plug-in. При создании RCP-приложений вы обычно должны создать несколько подключаемых модулей с учетом возможности повторного использования. Например, вы могли бы переписать этот пример и создать один подключаемый модуль с вашими J2EE-зависимостями, второй для компонента View, а третий для RCP Shell. Это даст возможность повторно использовать различные подключаемые модули, например, код J2EE. Однако в этом упражнении мы создадим только один подключаемый модуль, в основном по причине ограничения размера этой статьи.
В диалоговом окне "Create a new plug-in project" (рисунок 24) дайте название проекту: com.ibm.issw.temperature.form. Это обычное соглашение по наименованию для подключаемых модулей. Убедитесь, что вы отметили варианты, показанные на рисунке 24:
Ваш проект подключаемого модуля будет также Java-проектом, поскольку вы будете добавлять Java-код.
В Eclipse 3.0 у вас есть возможность выбрать установку зависимостей времени исполнения с использованием файла манифеста, что мы и выберем.
Для создания подключаемого модуля мы будем использовать шаблон. Поскольку мы будем создавать подключаемый модуль с окном просмотра, выберите Plug-in with a view, затем нажмите Next (рисунок 26).
В следующем диалоговом окне мы определим информацию о классе View. Введите точно такую же информацию, которая показана на рисунке 27, затем нажмите Next.
Наконец, в диалоговом окне View Features (рисунок 28), снимите отметки на всех вариантах. (Мы будем импортировать свой собственный класс просмотра.) Нажмите кнопку Finish.
Сейчас мы импортируем два JAR в наш новый подключаемый модуль:
j2ee.jar - Подключаемый модуль, взаимодействующий с API EJB-клиента, поэтому его необходимо включить в ваш classpath.
JAR EJB-клиента - Содержит необходимые клиентские интерфейсы и сгенерированные прокси и заглушки (stub) для корректного подключения к выполняющимся корпоративным компонентам.
В Application Developer нажмите правой кнопкой мыши на проекте подключаемого модуля и выберите пункт Import (рисунок 30).
Есть несколько мест, из которых можно получить j2ee.jar. Поскольку RCP будет использовать IBM Application Client for WebSphere Application Server во время исполнения, лучше всего использовать этот JAR, который вы можете найти в <WAS_CLIENT_INSTALL_ROOT>/lib, как показано на рисунке 32. Убедитесь, что выбран только j2ee.jar. (Если ваш подключаемый использует любые другие WebSphere API, например расширение программной модели WebSphere, вы должны импортировать их тоже. В противном случае, вам не нужно импортировать другие WebSphere JAR времени исполнения; во время исполнения сгенерированный код EJB-прокси и код контейнера клиента загружают классы из загрузчика классов (classloader) тонких клиентов WebSphere.) Если у вас нет установленного клиентского программного обеспечения, вы можете получить j2ee.jar из каталога <Application Developer_INSTALL_ROOT>/runtimes/base_v6/lib or <WAS_ROOT>/lib.
Далее нам необходимо импортировать JAR EJB-клиента, который является специальным JAR-файлом с кодом, необходимым для вызова EJB из удаленного места. В него входят интерфейсы EJB-клиента и сгенерированный код RMI/IIOP. (Если бы вы создавали ваше собственное EJB-приложение, то могли бы сгенерировать клиентский JAR в Application Developer, нажав правой кнопкой мыши на ваш EJB Project и выбрав Create EJB Client Jar) Для нашего примера JAR EJB-клиента предоставляется в файле для загрузки. Импортируйте JAR-файл при помощи варианта File System (как и прежде), перейдите в каталог C:\RCPEJBClient и выберите TemperatureEJBClient.jar (рисунок 33).
Теперь нам нужно установить classpath времени компилирования для создания и компилирования в рабочем пространстве. Это позволит успешно компилировать код подключаемого модуля как в Eclipse IDE, так и при автоматизированной компоновке. Информация о classpath времени компоновки обновляется в Build Section редактора конфигурации подключаемого модуля. Выберите закладку Build, показанную на рисунке 35.
Перейдите на закладку Binary Build (рисунок 36) и выберите два JAR-файла. Если вы выберете компоновку подключаемого модуля в бинарный файл, в Build нужно включить JAR-файлы. Binary build дает возможность скомпоновать ваш бинарный файл и затем использовать загружаемый бинарный файл Eclipse RCP. Для этого упражнения мы вручную скопируем подключаемые модули для запуска приложения Eclipse RCP.
Для успешного компилирования кода необходимо добавить JAR-файлы в classpath времени компилирования. Вы можете сделать это, добавив JAR-файлы в Extra Classpath Entries в нижней части раздела Build (рисунок 37). При этом обновляется Project Build Path в Eclipse.
Сделанные на странице Build изменения обновят файл build.properties. Вы можете просмотреть этот файл, выбрав закладку build.properties.
Для того чтобы код вашего подключаемого модуля во время исполнения мог найти J2EE и код EJB-клиента, необходимо добавить его в classpath времени исполнения подключаемого модуля. Это можно сделать в редакторе конфигурации подключаемого модуля, который должен открыться по умолчанию. (Если нет, щелкните дважды на файле plug-in.xml, чтобы его открыть.) Выберите закладку Runtime, в разделе Run-time libraries, нажмите кнопку Add (рисунок 37) и добавьте только что импортированные два JAR-файла.
Диалоговое окно Runtime обновит файл MANIFEST.MF подключаемого модуля. Так же как и для J2EE-приложений, манифест определяет classpath времени исполнения. Вы можете увидеть манифест, перейдя на закладку MANIFEST.MF.
Сейчас мы скомпонуем окно просмотра. Мы импортируем класс (переопределяя сгенерированный для нас шаблоном View) и затем исследуем соответствующий фрагмент кода. но перед этим мы должны указать подключаемые модули, от которых зависит наш подключаемый модуль. В нашем окне просмотра мы будем использовать элементы управления формой из Standard Widget Toolkit (SWT), поэтому нам нужно установить зависимости в подключаемом модуле Eclipse, содержащем элементы управления формой.
Импортируйте класс View, переопределяя сгенерированный класс. В каталоге src нажмите правой кнопкой мыши на пакете com.ibm.issw.temperature.form.views и выберите Import (рисунок 40).
Выберите File System и затем нажмите кнопку Next. Просмотрите каталог C:\RCPEJBClient\View и импортируйте три файла в пакет, как показано на рисунке 41.
Метод createPartContol() приведен в листинге 1. Код использует класс FormToolkit для помощи в создании управляющих элементов в родительском компоненте, в данном случае - окне просмотра. Создаются необходимые метки, кнопка и текстовое поле, а кнопке назначается listener ("слушатель"). Listener - это внутренний класс View.
public void createPartControl(Composite parent)
{
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createScrolledForm(parent);
form.setText(RcpMessages.getString("TemperatureView.Title"));
GridLayout layout = new GridLayout(2,false);
form.getBody().setLayout(layout);
Label label = toolkit.createLabel(form.getBody(),
"Enter temperature in Celsius: ");
Text textBox = toolkit.createText(form.getBody(), "", SWT.BORDER);
GridData gdText = new GridData(8);
textBox.setLayoutData(gdText);
Button button = toolkit.createButton(form.getBody(),
RcpMessages.getString("TemperatureView.Button"),
SWT.PUSH);
Label result = toolkit.createLabel(form.getBody(), "");
result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
MyListener listener = new MyListener();
listener.setInput(textBox);
listener.setResult(result);
listener.setParent(parent);
listener.setFormToolkit(toolkit);
button.addListener(SWT.Selection,listener);
}
Метод внутреннего класса обработки событий приведен в листинге 2. В этом классе читается значение текстового поля и вызывается EJB при помощи API EJB-клиента. Код ищет месторасположение EJB и получает удаленный интерфейс. Затем вызывается метод и метка результата заполняется полученным значением. Помните, что лучше всего спрятать EJB-вызов в бизнес-делегате, а не вызывать его в коде подключаемого модуля напрямую. Для целей данной статьи мы упростили код. Непосредственный вызов EJB из классов просмотра обычно не рекомендуется.
Вы, возможно, заметили, что для избежания жесткого кодирования имени EJB JNDI и месторасположения сервера приложений используется файл свойств. При развертывании RCP-приложения вы можете изменить файл свойств и указать реальное месторасположение удаленного EJB.
TemperatureView.JNDIName=ejb/TempConverter
TemperatureView.Title=Celsius to Fahrenheit Temperature Converter
TemperatureView.Button=Convert to Fahrenheit
При построении подключаемого модуля обычно необходимо добавить его в файл plug-in.xml и выбрать объект расширения (в данном случае вы расширяете подключаемый модуль View). Это было сделано за нас, поскольку мы использовали шаблон View в мастере. Вы можете увидеть это на закладке Extensions или просмотреть исходный код plug-in.xml. Конфигурация расширения приведена в листинге 4.
Мы разрабатываем RCP-приложение, используя среду Eclipse по умолчанию, которая оформлена как IDE и не идеальна для нашего случая. Поэтому, вместо нее мы создадим наше собственное рабочее место и перспективу. Мы импортируем классы, предоставленные в файле для загрузки, в наш подключаемый модуль, затем добавим записи в plug-in.xml для рабочего места и перспективы по умолчанию.
Нажмите правой кнопкой мыши на папке src и выберите Import (рисунок 45).
RcpWorkbenchAdvisor - используется для создания нашего рабочего места. Код устанавливает некоторые настройки, например размер и заголовок, а также запрещает некоторые элементы по умолчанию.
public class RcpWorkbenchAdvisor extends WorkbenchAdvisor {
public String getInitialWindowPerspectiveId() {
return "MyRCPPerspective";
}
public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
super.preWindowOpen(configurer);
configurer.setInitialSize(new Point(750, 600));
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Temperature Converter");
}
}
MyRCPPerspective - окно просмотра, добавляется к перспективе. Это начальная схема перспективы. Код запрещает также область редактора, поскольку мы не создаем подключаемый модуль для редактирования файлов.
Теперь должны появиться расширения, как показано на рисунке 58. Сохраните изменения конфигурации подключаемого модуля, выбрав либо File => Save, либо нажав комбинацию клавиш Ctrl-S.
В качестве альтернативного подхода вы можете добавить подключаемый модуль вручную, добавив его непосредственно в файл plug-in.xml, приведенный в листинге 8. Добавленный код выделен жирным шрифтом:
Мы готовы запустить RCP EJB-клиент. Сначала мы помодульно протестируем наше RCP-приложение в Application Developer. Затем мы экспортируем наш подключаемый модуль и настроим его для запуска вне среды разработки.
В Eclipse 3.0 вы можете создать конфигурацию запуска для выполнения подключаемых модулей. Эти конфигурации запуска необходимо настроить на использование WebSphere V6 JRE (входящий в состав IBM Application Client for WebSphere Application Server и WebSphere Application Server), который добавляется в Perspective Preferences. Однако вместо использования Eclipse мы будем использовать Application Developer, в котором JRE уже установлен.
В основном меню Application Developer выберите Run =>Run.... (рисунок 59).
Назовите конфигурацию MyRCPClient. В разделе Program to Run выберите ваш подключаемый модуль com.ibm.issw.temperature.form.RcpApplication в поле Run an application и WebSphere v6 JRE в поле JRE (рисунок 61).
В поле VM arguments введите код, показанные на рисунке 61, скопировав код из предоставленного файла C:\RCPEJBClient\Snippet1.txt (листинг 9). Пока ничего не запускайте. Аргументы VM указывают каталог, в котором установлен IBM Application Client for WebSphere Application Server. Если вы установили его в другой каталог, используйте его. В противном случае используйте экземпляр WebSphere в Application Developer, расположенный в <Application Developer_INSTALL_ROOT>/runtimes/base_v6.
На закладке Plug-in мы должны включить подключаемые модули, от которых зависит наш подключаемый модуль. Это легко сделать, следуя последовательности нажатий, показанных на рисунке 62.
Введите значение, затем выберите Convert to Farenheit.
Должен отобразиться результат, аналогичный показанному на рисунке 64. (Первый вызов будет выполняться дольше, чем последующие, поскольку необходимо установить соединение с WebSphere Application Server.)
Для запуска RCP-приложения вне Application Developer нам будет необходимо использовать мастер Export plug-in. В Eclipse 3 нет механизма экспорта для RCP-приложений, но вы могли бы использовать двоичный файл для завершения этого процесса. В целях обучения мы развернем его вручную.
Нажмите правой кнопкой мыши на проекте подключаемого модуля и выберите Export (рисунок 65).
В диалоговом окне "Deployable plug-ins and fragments" выберите наш подключаемый модуль, в поле deploy it as укажите вариант directory structure, затем разверните его в каталог, как показано на рисунке 67. Нажмите Finish.
Для запуска нашего приложения нам необходим BAT-файл. Скопируйте BAT-файл из C:\RCPEJBClient\MyRCPApp.bat в каталог, в который вы экспортировали ваш подключаемый модуль.
BAT-файл будет использовать клиента приложения JRE (в предположении, что IBM Client for WebSphere Application Server находится в C:\WebSphere6ND\AppClient; если это не так, обновите сценарий и поменяйте каталог, изменив переменную в начале файла так, чтобы она указывала на клиент приложения или на WebSphere Application Server в случае, если вы не используете клиент.). (Мы тестируем наше RCP-приложение с WebSphere Application Server Base. Если в рабочих условиях вы будете вызывать EJB-приложение, развернутое на кластере, аргумент Djava.naming.provider.url=corbaloc::localhost должен иметь URL, указывающий кластер, например: corbaloc::<host1>:<port>,:<host2>:<port>.)
Поскольку мы вручную экспортировали подключаемый модуль, нам необходимо скопировать startup.jar и базовые подключаемые модули из каталога нашей установки Eclipse. В Application Developer Eclipse расположен в каталоге eclipse установленного Application Developer (рисунок 69).
В этой статье описывается, как создать клиентские EJB-приложения, используя Eclipse Rich Client Platform (RCP). Платформа Eclipse содержит богатый набор элементов управления (widget), окон просмотра (view), рабочих областей (framework) (таких как Eclipse Modeling Framework) и других расширений, которые могут быть использованы для создания мощных клиентских приложений. Знание процесса интегрирования Eclipse RCP-приложений с WebSphere Application Server необходимо для создания интегрированных клиентских приложений.