Доклад на FPUG #20 - Coldfusion+Flex
Родион Быков - 07/26/2010
Coldfusion is...
- Coldfusion - это проприетарный сервер приложений корпорации Adobe;
- Приложения под Coldfusion пишутся на языке CFML (Coldfusion Markup Language);
- Coldfusion создан как Java веб-приложение и поставляется либо с сервером Adobe JRun, или в виде WAR файла для JEE-сервера или в виде cloud image;
Родословная
- Первая версия вышла в 1995 году. Разработчик - фирма Allaire - искала способ легкой генерации web-страниц, без использования Perl.
- Огромный успех Coldfusion на волне дот-комов обусловлен легкостью разработки.
- С закатом эры доткомов, популярность Coldfusion снизилась, но не изчезла, благодаря хорошей адаптации в корпоративной среде.
- Для поднятия былой популярности и закрепления в корпоративном секторе, Macromedia (к тому времени купившая Allaire) решила переписать сервер на Java.
- Adobe не только не придушила Coldfusion, но дала серверу новую жизнь и нашла достойное место в своей "периодической таблице".
- Coldfusion занимает центровое место в системе документооборота LiveCycle, а также продается как standalone-продукт.
- Adobe рассматривает Coldfusion как "корпоративный клей", который может "склеить" разнородные среды, сервера, источники данных в единый механизм.
В чем фишка
- Простой теговый язык. Конструкции, близкие к HTML, легко давались web-мастерам.
- Для каждого сложного действия, в Coldfusion был свой тег или функция.
<cfquery name="users" datasource="database">
SELECT * FROM users
</cfquery>
Компоненты - элементы ООП в Coldfusion
- Coldfusion Components (CFC) - реализация ООП в CFML. Компоненты инкапсулируют свойства и методы, поддерживают наследование.
- Методы могут быть статическими (вызываться без создания объекта), если в них не используется переменная THIS.
- Методы могут использовать модификаторы доступа private, package, public и remote.
Использование компонентов для реализации RPC
- Использовать удаленный вызов методов CFC очень просто - достаточно обозначить метод модификатором доступа "remote".
- Coldfusion может сама сгенерировать WSDL - для этого достаточно удаленно обратиться к компоненту таким образом: /demo.cfc?wsdl
- Чтобы обратится к remote методу 'getMessages' в компоненте demo.cfc, достаточно вызывать его таким образом: /demo.cfc?method=getMessages&nick=bob
- Coldfusion умеет сериализовать данные в WDDX и JSON (последнее удобно для AJAX-вызовов)
Реализация Flash Remoting
- За remoting отвечает встроенный в Coldfusion сервер BlazeDS
- BlazeDS - это open-source, написанное на Java веб-приложение, реализующее сериализацию данных и удаленный доступ к Java-объектам. При знании Java, рекомендую поэкспериментировать связку JEE сервер + Java классы + BlazeDS + Flex приложение.
- Все варианты общения клиента с сервером (polling, long-polling, HTTP streaming) абстрагируются "каналами" ("channels") и описываются в настройках BlazeDS.
- BlazeDS не поддерживает Comet или RTMP - для реализации этого существует платный Adobe LiveCycle Data Services
Работа с удаленными данными из Flex-приложения
- s:Webservice - подгружает WSDL, откуда узнает о существующих методах вебсервиса (или CFC в нашем случае). Для каждого удаленного метода, Flex создает динамический метод в объекте Webservice (например для remote-метода getMessages из demo.cfc, Flex создаст метод getMessages в объекте Webservice).
<s:WebService id="wsMain" wsdl="http://localhost/demo/demo.cfc?wsdl" />
wsMain.loadWSDL();
wsMain.getMessages(nick); - s:RemoteObject - работает более эффективно чем Webservice через бинарный протокол AMF. Coldfusion-сервер по-умолчанию имеет настроенный endpoint для работы с клиентами через AMF (http://localhost/flex2gateway), а также преднастроенный destination "ColdFusion", описывающий правила передачи данных. Этот код описывает соединение с CFC "demo.cfc" лежащем в папке /demo на сервере (используется dot-notation принятый в Java-мире). Для каждого метода в CFC создается динамический метод в объекте класса RemoteObject.
<s:RemoteObject id="roMain" destination="ColdFusion" endpoint="http://localhost/flex2gateway/" source="demo.demo" />
roMain.getAllMessages(nick); - s:Consumer - работа с messaging gateway. Gateway - это средство общения Coldfusion-сервера с "не-веб" клиентами. Работает по принципу подписки. Удобное средство, если надо рассылать сообщения многим клиентам. Во Flex объект класса Consumer используется для соединения с удаленным сервером и подписки на сообщения. На событие message навешивается обработчик, который работает с пришедшими данными. Симметричный класс - Producer - посылает сообщения серверу через gateway.
<s:Consumer id="amfConsumer" destination="ColdFusionGateway" message="amfConsumer_messageHandler(event)" />
Инструкции по развертыванию демонстрации
- Скачать ZIP-архив со всеми нужными файлами (1,7МБ).
- Понадобится Coldfusion 8 или 9 - trial или developer версию можно бесплатно скачать на сайте Adobe.
- Понадобится Flash Builder - trial можно бесплатно скачать на сайте Adobe.
- Соедините Coldfusion с IIS или Apache, чтобы CFM-файлы обслуживались из корня http://localhost/
- Положите содержимое папки demo (index.cfm, demo.cfc, demomessaging.cfc) в папку demo под корнем сайта. Таким образом, доступ к ней должен осуществлятся как http://localhost/demo/
- Создайте в сервере MySQL БД demo и скормите ей скрипт demo.sql
- В Coldfusion Administrator создайте datasource demo и привяжите его к созданной БД demo.
- В Coldfusion Administrator создайте gateway - Gateway ID: demo, Type: DataServicesMessaging, CFC Path: [корень вебсервера]/demo/demomessaging.cfc . Этот пустой CFC уже лежит по указанному пути (путь в файловой системе, а не через http)
- Возьмите Flex-проекты demo-desktop и demo-web, и импортируйте их во Flash Builder. Настройте output folder для проекта demo-web куда вам удобно под корень веб-сервера, а для простоты - прямо ту же папку [корень]/demo, где уже лежат demo.cfc и остальные.
Инструкции по работе демонстрации
- В БД создано три пользователя - alice, bob и jack. Alice и bob состоят в одной группе, WORLD.
- Сообщение, посланное в группу видно всем участникам группы.
- AIR-проект настроен на пользователя alice, Flex-проект настроен на пользователя bob, /demo/index.cfm настроен на пользователя jack.
- При старте приложений участники загружают все свои сообщения, а потом только новые (поступившие с момента последнего обращения)
Have lots of fun !