240 likes | 486 Views
Adobe Flex. Новая технология для создания RIA на базе Flash- платформы. Константин Ковалев RIA- разработчик http://www.riapriority.com/ constantiner@riapriority.com. Новая?. Macromedia Flex 1.0 (март 2004) Flash Player 7, ActionScript 2
E N D
Adobe Flex Новая технология для создания RIA на базе Flash-платформы Константин Ковалев RIA-разработчик http://www.riapriority.com/ constantiner@riapriority.com
Новая? • Macromedia Flex 1.0 (март 2004) Flash Player 7, ActionScript 2 • Macromedia Flex 1.5 (октябрь 2004) Flash Player 7, ActionScript 2 • Macromedia Flex 2.0 public alpha 1 (октябрь 2005) Flash Player 8.5, ActionScript 3 • Adobe Flex 2.0 (28 июня 2006) Flash Player 9 • Adobe Flex 2.0.1 (5 января 2007) Flash Player 9
Революционные особенности Flex 2 • Возможность создания приложений без необходимости компиляции на сервере • Бесплатный SDK • Новая виртуальная машина • Новая среда разработки на базе Eclipse • Новый язык программирования ActionScript 3 • Ориентирована на традиционных разработчиков
Насыщенные Интернет-приложения (RIA) • Термин введен Macromedia в марте 2002
Adobe Flex 2 – мощная среда для создания RIA • Объединение группы технологий на базе Flash-платформы • Flex – это DSL для GUI (Брюс Эккель)
Поддержка стандартов • XML (MXML) • ECMA-262, edition 4 (ActionScript 3) • E4X (ECMAScript for XML из ECMA-357 2 ed.) • CSS, level 1 (CSS1) • Событийная модель W3C DOM Level 3 Events specification • J2EE (Adobe LiveCycle Data Services)
Flash Player 9 • Альфа-версия появилась в октябре 2005 (как Flash Player 8.5) • Релиз в июне 2006 • Вес плеера по-прежнему в районе 1M (примерно на 300K больше Flash Player 8) • Повышенная производительность
ActionScript 3 • Встроенная поддержка классов • Строгая типизация + динамика • Ошибки времени исполнения • Реорганизованный API + новые API • JIT-компилятор • Введены примитивные типы int и uint • Регулярные выражения var example:RegExp = /(\d)abc(\d*)/g; либо var example:RegExp = new RegExp ("(\d)abc(\d*)", "g"); • Проект Tamarin
Display List API • «Классовый» подход: var aButton:Button = new Button (); вместо var aButton:MovieClip = aBox.attachMovie (“button”, “button”, 0); • Возможность смены родителя var aButton:Button = new Button (); aBox.addChild (aButton); aContainer.addChild(aButton);
E4X var myXML:XML = <companies> <company name="Adobe"> <products> <product name="Flex"/> <product name="Flash"/> <product name="Apollo"/> </products> </company> </companies> • Простота и наглядность • Так же прост, как XPath и SQL • Простая запись XML • Получение списка продуктов myXML..product.@name либо myXML.company.products.product.@name • Получение всех продуктов на букву “F” myXML..product.(@name.indexOf('F') == 0) myXML.company += <company name="Macromedia"> <products> <product name="Flex"/> <product name="Flash"/> <product name="Central"/> </products> </company>
CSS • Наследование • Объявление стилей в CSS-файлах, в MXML-классах, внутри MXML-тэгов • Runtime CSS • Стили компилируются внутрь swf • Скинизация <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> <mx:Style> Panel { font-family: Times, "_serif"; font-size: 24; } .areaStyle { color: #FF00FF; font-size: 12; border-style:none; } </mx:Style> <mx:Panel title="Hello!"> <mx:Button fontSize="18" label="Button" /> <mx:TextArea styleName="areaStyle" text="Hello, World!" /> </mx:Panel> </mx:Application>
Позиционирование с помощью CSS <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> <mx:Style source="layout.css"/> <mx:Panel width="50%" height="50%" layout="absolute«title="Hello!"> <mx:Button styleName="panelArea" label="Button" /> <mx:TextArea styleName="panelButton" text="Hello, World!" /> </mx:Panel> </mx:Application> .panelButton { top: 10; bottom: 40; left: 10; right: 60;} .panelArea{ bottom: 10; horizontal-center: -25;} .panelButton { top: 10; bottom: 10; left: 90; right: 10;} .panelArea { top: 10; left: 10;}
MXML • Декларативная форма • Расширяемость • Data binding • Встраивание блоков кода • Встраивание CSS • Модульность • Мощный фрэймворк компонент • Контейнеры • MXML-файл ActionScript-класс
MXML: что проще? publicclass MyApp extends mx.core.Application { privatevar myText:TextArea; privatevar myButton:Button; publicfunction MyApp(){ layout = "vertical"; myText = new TextArea (); addChild(myText); myText.editable = false; myText.width = 300; myText.height = 200; myButton = new Button (); addChild(myButton); myButton.label = "Нажми меня!"; myButton.addEventListener("click", onButtonClick); } privatefunction onButtonClick (event:MouseEvent):void { myText.text += 'Еще раз\n' } } <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> <mx:TextArea editable="false" id="myText" width="300" height="200" /> <mx:Button id="myButton" label="Нажми меня!" click="myText.text += 'Еще раз\n'" /> </mx:Application> VS
MXML: расширяемость Компонент: Приложение: <?xml version="1.0" encoding="utf-8"?> <!-- com.riapriority.rit2007.CityList.mxml --> <mx:ComboBox dataProvider="{cityList}" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:ArrayCollection id="cityList"> <mx:String>Москва</mx:String> <mx:String>Санкт-Петербург</mx:String> <mx:String>Новосибирск</mx:String> <mx:String>Владивосток</mx:String> </mx:ArrayCollection> </mx:ComboBox> <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:rit2007="com.riapriority.rit2007.*" layout="vertical"> <rit2007:CityList /> </mx:Application>
MXML: data binding Компонент: Приложение: <?xml version="1.0" encoding="utf-8"?> <!-- com.riapriority.rit2007.CityList.mxml --> <mx:ComboBox dataProvider="{cityList}" creationComplete="dispatchEvent(new Event ('change'))" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ [Bindable (event="change")] publicfunctionget currentCity ():String { return selectedItem as String; } ]]> </mx:Script> <mx:ArrayCollectionid="cityList"> <mx:String>Москва</mx:String> <mx:String>Санкт-Петербург</mx:String> <mx:String>Новосибирск</mx:String> <mx:String>Владивосток</mx:String> </mx:ArrayCollection> </mx:ComboBox> <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:rit2007="com.riapriority.rit2007.*" layout="vertical"> <rit2007:CityList id="cityList" /> <mx:Label text="{cityList.currentCity}" /> </mx:Application>
MXML: модульность Компонент: Подкомпонент: <?xml version="1.0" encoding="utf-8"?> <!-- com.riapriority.rit2007.CityList.mxml --> <mx:ComboBox dataProvider="{cityList}" creationComplete="dispatchEvent(new Event ('change'))" xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:rit2007="com.riapriority.rit2007.*"> <mx:Script> <![CDATA[ [Bindable (event="change")] publicfunctionget currentCity ():String { return selectedItem as String; } ]]> </mx:Script> <rit2007:CityListData id="cityList" /> </mx:ComboBox> <?xml version="1.0" encoding="utf-8"?> <mx:ArrayCollection xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:source> <mx:String>Москва</mx:String> <mx:String>Санкт-Петербург</mx:String> <mx:String>Новосибирск</mx:String> <mx:String>Владивосток</mx:String> </mx:source> </mx:ArrayCollection>
MXML: события Компонент: Приложение: <?xml version="1.0" encoding="utf-8"?> <!-- com.riapriority.rit2007.CityList.mxml --> <mx:ComboBox dataProvider="{cityList}" creationComplete=" onChange()" change=" onChange()" xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:rit2007="com.riapriority.rit2007.*"> <mx:Metadata> [Event (name="cityChange", type="flash.events.Event")] </mx:Metadata> <mx:Script><![CDATA[ privatefunctiononChange ():void { dispatchEvent(new Event ("cityChange"));} [Bindable (event="cityChange")] publicfunctionget currentCity ():String { return selectedItem as String; }]]></mx:Script> <rit2007:CityListDataid="cityList" /> </mx:ComboBox> <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:rit2007="com.riapriority.rit2007.*" layout="vertical"> <mx:Labelid="cityLabel" text="{cityList.currentCity}" /> <rit2007:CityList id="cityList" cityChange="labelBlur.play()“/> <mx:Blurid="labelBlur" target="{cityLabel}" blurXFrom="50“blurXTo="0" /> </mx:Application>
Code behind Код: Разметка: package com.riapriority.rit2007 { import flash.events.MouseEvent; import mx.containers.Box; import mx.controls.Alert; import mx.controls.Button; import mx.controls.TextInput; import mx.events.FlexEvent; import mx.utils.StringUtil; publicclass LoginFormBase extends Box { public var yourName:TextInput; public var submitButton:Button; publicfunction LoginFormBase() { addEventListener(FlexEvent.CREATION_COMPLETE, onComplete); } privatefunction onComplete (event:FlexEvent):void { submitButton.addEventListener(MouseEvent.CLICK, onSubmit); } privatefunction onSubmit (event:MouseEvent):void { var message:String = StringUtil.substitute ("Превед, {0}!", yourName.text); Alert.show(message); } } } <?xml version="1.0" encoding="utf-8"?> <LoginFormBase direction="vertical" xmlns="com.riapriority.rit2007.*" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Form defaultButton="{submitButton}"> <mx:FormItem label="Имя:" required="true"> <mx:TextInput id="yourName" /> </mx:FormItem> <mx:FormItem label=""> <mx:Button id="submitButton" label="Подтвердить"/> </mx:FormItem> </mx:Form> </LoginFormBase>
Компоненты и контейнеры • Расширяемые (MXML и ActionScript) • Datagrid, Tree, List, TileList, HorizontalList,... • Tab, Accordion, Menu, ... • RichText Editor, Sliders, ... • ToggleButton, PopupButton, ... • Медиа-компоненты • Charting Components • Panel, VBox, HBox, VDividedBox, HDivideBox, Form, Tile, Grid, … + Валидаторы, Форматтеры, Эффекты,Состояния, Drag’n’drop, Модули, RSL, Resource Bundles
Adobe LiveCycle Data Services • Клиентская библиотека • Сервер на базе J2EE • HTTP/S, AMF, RTMF/S • Server Data Pushing • Компиляция swf на сервере • Удаленный вызов процедур (RPC) • Publish/Subscribe Messaging • CRUD • Кластеризация • Бесплатно для 1 CPU, $6,000 (до 100 пользователей), $20,000 (без ограничений)
Q&A Константин Ковалев RIA-разработчик http://www.riapriority.com/ constantiner@riapriority.com