ActionScript краткий обзор
Интеграция Flash с веб-приложениями > Обмен информацией с удаленными файлами
Обмен (отсылка и получением) информацией с удаленными файлами
Flash-клип это окно для сбора и отображения информации и он во многом похож на HTML страницу. Но Flash-клипы, в отличие от HTML страниц, могут постоянно обновляться, оставаясь загруженными в браузер, без необходимости обновления окна браузера. Вы можете использовать Flash-команды и методы объектов для отсылки и получения информации от серверных скриптов, текстовых файлов и XML-файлов.
Серверные скрипты могут запрашивать разнообразную информацию из баз данных что позволяет производить обмен информацией между базой данных и Flash-клипом (например, в настоящее время на http://polar-lights.com/en/ производится разработка расширения Flash2Databases для общения флеша с базами данных - Прим. переводчика). Серверные скрипты могут быть написаны на разных языках, причем наиболее предпочтительными и современными языками являются PHP (прямой наследник Perl) и ASP (Microsoft Active Server Pages) несколько более устаревший, но могучий Perl все еще не теряет актуальности, а более редкими но мощными и интересными языками являются JSP (Java Server Pages) и особенно удобный и простой для разработчика CFM (Allare ColdFusion).
Хранение информации в базах данных и динамическая подгрузка ее во Flash-клип позволяет создавать Flash-страницы с динамическим и персонализированным содержанием. Например, можно создать доску объявлений, чат, персональный профайл для пользователя или "shopping cart" (корзину покупок), которая будет помнить все покупки клиента, что может помочь в определении его предпочтений.
Вы можете использовать некоторые команды Actionscript и методы объектов для передачи информации внутрь и за пределы Flash-клипа. Каждая команда и метод могут использовать свой протокол для передачи информации, каждый из которых, в свою очередь, может требовать определенной разметки (формата) передаваемой информации.
Команды getURL, loadVariables и loadMovie используют HTTP или HTTPS протокол для посылки информации в кодированном формате URL.
Методы XML.send, XML.load и XML.sendandLoad используют HTTP или HTTPS протокол для посылки информации, как XML.
Методы XMLSocket.connect и XMLSocket.send создают и используют a TCP/IP сокет и соединение для посылки информации, как XML.
О безопасности
Во время воспроизведения Flash-клипа в браузере, можно загрузить данные в этот клип только из файла на сервере в том же субдомене. (Это, по замыслу Макромедии, должно было запретить Flash-клипам даже думать о попытках загрузить информацию с чужих серверов. Тем не менее все существующие на данный момент (21.09.2000) Flash-плееры для всех браузеров позволяют загружать во Flash-клип SWF-файлы с любого другого сервера по команде Load Movie. - Прим.переводчика)
Для определения субдомена URL состоящего из одного или двух компонентов, используется имя домена:
http://macromedia
Для определения субдомена URL состоящего из более чем двух компонентов, удаляют верхний уровень:
http://x.y.macromedia.com
Следующий график показывает как Flash плеер определяет разрешить или нет HTTP запрос:
![](images/ch05/05Flowchart.gif)
Используя XMLSocket объект для создания сокет-соединения с сервером, нужно использовать порт с номером 1024 или выше. (Порты с меньшими номерами обычно используются стандартными вещами типа Telnet, FTP, World Wide Web или Finger.)
Flash-клипам доступны все стандартные возможности браузеров в части HTTP и HTTPS защищенных соединений. По существу, Flash предоставляет ту же защищенность, что доступна при применении стандартного HTML протокола. Нужно следовать тем же правилам, которым обычно следуют при создании страниц с функцией защищенного соединения. Проще говоря команда LoadVariables произведенное из Flash-клипа (безразлично с передачей переменных или нет) оказывает точно такое же воздействие на сервер как и загрузка соответствующего скрипта или файла в стандартное окно браузера (с передачей тех же переменных и тем же методом).
Для защиты паролем чего-либо, используйте текстовое поле для запроса пароля от пользователя. Введенное значение можно отправить на сервер командой loadVariables или методом XML.sendandLoad, указав в свойствах HTTPS URL и метод POST. И уже на сервере можно будет проверить пароль и произвести соответствующие действия - чаще всего применяется генерация ответа от сервера в виде понятном для Flash (например var=something&var2=another& для случая LoadVariables). Полученные от сервера данные можно обработать внутри Flash-клипа и произвести какие-либо действия в зависимости от полученной информации. Другие методы обработки паролей (например проверка внутри Flash-клипа) не могут обеспечить сколько-нибудь стойкой защиты.
Проверка загруженности данных
Каждая команда и метод загружающие данные во Flash-клип (кроме XMLSocket.send) является асинхронным, т.е. результаты этого действия возвращаются через неопределенное время.
Перед тем как использовать полученные из удаленного источника данные во Flash-клипе, необходимо проверить, загружены ли эти данные или еще нет. Например, нельзя использовать команду LoadVariables и манипулировать полученными значениями в одном ключевом кадре. В следующем примере нельзя использовать переменную lastFrameVisited, если она загружается из файла myData.txt. Более того, ее нельзя использовать и в последующих кадрах до тех пор пока не будет полной уверенности в том, что загрузка данных из файла myData.txt завершилась. Короче говоря, этот скрипт написан неправильно.
loadVariables("myData.txt", 0); gotoandPlay(lastFrameVisited);
Каждая команда и метод требуют использования специфической техники проверки загруженности данных. При использовании команд loadVariables или loadMovie можно загрузить информацию в символ типа movie clip и использовать событие data в контейнере действия onClipEvent. Замечательным свойством Flash5 является тот факт, что команда loadVariables при загрузке переменных в Target (в Movie clip, а не в Level), событие onClipEvent(data) происходит только после окончания загрузки последней переменной. Если же загружать переменные из отдельного .swf файла командой loadMovie (например при загрузке данных с другого домена), событие onClipEvent(data) происходит после загрузки каждого фрагмента этого .swf файла (т.е. обычно несколько раз).
Например, кнопка со следующей командой загружает переменные из файла myData.txt в символ типа movie clip с именем (Name в окошке Instance/Instance) loadTargetMC (причем этот movie clip расположен в основной Timeline):
on(release){ loadVariables("myData.txt", _root.loadTargetMC); }
Если какая-либо команда внутри символа loadTargetMC использует переменную lastFrameVisited, загруженную из внешнего файла myData.txt, то следующее действие будет выполнено только после окончания загрузки всех переменных из этого файла, включая lastFrameVisited:
onClipEvent(data) { gotoandPlay(lastFrameVisited); 1
}
При использовании методов XML.load и XMLSocket.connect можно определить программу обработки (XML handler) данных, которая будет обрабатывать данные после их появления. Программа обработки это свойство XML и XMLSocket объектов, к которому привязаны определенные вами (набитые на клавиатуре в окошке "Actions") функции. Программы обработки вызываются автоматически сразу после получения информации. Для XML объекта используйте XML.onLoad, а для XMLSocket объекта - XMLSocket.onConnect.
Для более подробной информации, щелкайте мышкой сюда Использование XML объекта и Использование XMLSocket объекта.
От переводчика:
Cудя по всему, переменная "lastFrameVisited" это что-то вроде вручную созданной переменной с именем подобным "КадрНаКоторыйВыХотитеПерейти". Она не имеет никакого отношения к стандартным функциям и свойствам Flash и не связана с проверкой загруженности данных. Так что не советую забывать дописывать в конец файлов предназначенных для загрузки в основную Timeline Flash-клипов что-то вроде
&finishloading=1&
и каким-либо циклом ожидать появления во Flash-клипе переменной "finishloading" равной 1. И только после появления этой переменной делать вывод об окончании загрузки данных. Для этого случая можно сказать в каком-либо кадре
loadVariables("myData.txt", 0);
в следующем кадре
play ();
и в третьем кадре
if (finishloading!=1) { prevFrame (); }
Интеграция Flash с веб-приложениями: Обзор
Flash-клипы могут обмениваться (отсылать и получать) информацией с удаленными файлами. Для отсылки и получения переменных используется команда loadVariables или, если требуется только отослать данные - getURL. Для загрузки другого Flash-клипа в текущий, используется команда loadMovie. Для отсылки и получения XML данных, используются XML или XMLSocket объекты. Можно также организовывать XML данные при помощи разнообразных методов XML объекта.
Кроме того, можно создавать Flash-формы, собранные из обычных интерфейсных элементов, таких как тестовые поля (text fields) и всплывающие окошки (pop-up menus), и использовать их для сбора информации и отсылки данных серверным приложениям.
Если же вспомнить про все возможности Flash, мы увидим что он позволяет обмениваться данными не только с удаленными файлами и серверными приложениями, но и с HTML окружением (ява скриптом) на клиентской машине. Позднее мы рассмотрим способы отсылки и получения данных из яваскрипта, причем рассмотрим не только устаревший метод fscommand, но и прямые вызовы яваскрипта из Flash-клипа c помощью команды getURL. 1
От редактора:
Насчет устаревшего метода и прямых вызовов переводчик добавил от себя и я с ним согласен :)
Использование fscommand и взаимодействие
on(release){ fscommand("fullscreen", "true"); }
В таблице указаны значения, которые вы можете использовать в качестве параметров команды fscommand для управления воспроизведением клипа в автономном Flash Player. (запущен прожектор)
quit
Для вызова исполнимых файлов с параметром, например
file.exe /s -e
нужно войти в "expert mode" и заменить все пробелы в выражении табуляцией (кнопка TAB :)
Чтобы использовать fscommand для передачи сообщения скриптовому языку в броузере, например JavaScript, вы можете передать два любых аргумента в параметрах Command и arguments. Это могут быть строки или выражения, они будут использоваться в JavaScript функции, в которой находится команда fscommand.
Команда fscommand вызывает JavaScript-функцию moviename_DoFSCommand в HTML странице которая включает ролик, где moviename это имя ролика. Если Flash Player назначен имени myMovie, вызванная JavaScript функция будет myMovie_DoFSCommand.
Чтобы использовать команду fscommand для открытия окна сообщения между роликом и HTML страницей через JavaScript, надо:
1 | На HTML странице, которая содержит ролик добавить следующий JavaScript-код: |
function theMovie_DoFSCommand(command, args) { if (command == "messagebox") { alert(args); } } | |
Если вы публикуете ваш ролик, используя Flash с FSCommand-шаблоном, то этот код вставляется автоматически. Имя ролика и ID атрибуты будут именем файла. Например, для файла myMovie.fla, атрибуты будут установлены в myMovie. Для дополнительной информации смотрите Help к Программе Flash. |
|
2 | В ролике, добавьте команду fscommand кнопке: |
fscommand("messagebox", "This is a message box invoked from within Flash.") | |
Вы также можете использовать выражения в качестве параметров команды fscommand, например: | |
fscommand("messagebox", "Hello, " & name & ", welcome to our Web site!") | |
3 | Выберите File > Publish Preview > HTML чтобы протестировать ролик. |
![]() |
Команда fscommand также может посылать сообщения программе Macromedia Director, которые представлены как строки, события или выполнимый lingo-код. Если сообщение является строкой или событием, вы должны написать Lingo-код для получения указаний из команды fscommand и выполнения их. Для дополнительной информации смотрите сайт Direct Support Center.
В Visual Basic, Visual C++ и других программах, которые используют ActiveX, fscommand посылает VB-событие в виде двух строк и оно может быть обработано этими языками программирования. Для дополнительной информации смотрите сайт Flash Support Center.
Использование команд loadVariables, getURL и loadMovie
Команды loadVariables, getURL и loadMovie взаимодействуют с серверными скриптами используя протокол HTTP. Каждая из этих команд посылает все переменные из Timeline туда, куда она направлена; каждая команда обрабатывает ответ следующим образом:
![]() |
getURL возвращает любую информацию в окно броузера, не во Flash Player |
![]() |
loadVariables загружает переменные в заданную линейку (Timeline) во Flash Player. |
![]() |
loadMovie загружает ролик в заданный уровень во Flash Player. |
Когда вы используете команды loadVariables, getURL или loadMovie, можете указать некоторые параметры:
![]() |
URL файла, в котором находятся удаленные переменные |
![]() |
Местоположение (Location) - уровень или место в ролике, которое получает переменные. Для дополнительной информации об уровнях и местах смотрите О множестве линеек |
Примечание: в команде getURL нельзя указывать местоположение. | |
![]() |
Переменные могут быть отосланы разными HTTP методами - GET или POST. |
Например, если хотите использовать таблицу достижений (high scores) в игре, можете положить таблицу на сервер и использовать команду loadVariables чтобы загружать её в ролик каждый раз, когда кто-то поиграл в игру. Команда будет похожей на эту:
loadVariables("http://www.mySite.com/scripts/high_score.php", _root.scoreClip, GET);
Здесь команда loadVariables загрузит переменные из PHP-скрипта high_score.php в мувик с именем scoreClip, используя GET HTTP метод.
Все переменные используемые с командой loadVariables должны быть в стандартном MIME формате application/x-www-urlformencoded (стандартный формат используемый в CGI скриптах). Скрипт, который вы указываете в URL-параметре команды loadVariables, должен выдать в виде ответа переменную и пары значений тоже в этом формате, чтобы Flash мог прочитать их.
Файл может содержать любое количество переменных; переменные и пары значений разделяются амперсандом (&), а слова с пробелами внутри, разделяются плюсом (+) (формат url-кодирования). Например, это выражение определяет несколько переменных:
highScore1=54000&playerName1=rockin+good&highScore2=53455&playerName2=bonehelmet&highScore3=42885&playerName3=soda+pop
Дополнительную информацию о командах loadVariables, getURL и loadMovie, смотрите в ActionScript словаре.
Информация по url-кодированию спец-символов доступна на сайте Макромедии.
Использование объекта XMLSocket
Чтобы установить Socket-соединение, необходимо создать приложение на сервере, которое будет ждать запрос на Socket-соединение и посылать ответ обратно Flash-клипу. Это серверное приложение можно написать на каком-либо языке программирования, например на Java.
Методы connect и send XMLSocket объектов используются для передачи XML-данных серверу и для возвращения их с сервера во время Socket-соединения. Метод connect устанавливает Socket-соединение с портом сервера. Метод send посылает XML объект на сервер, который указан в Socket-соединении.
При использовании метода connect, Flash Player открывает TCP/IP соединение с сервером и не закрывает его до тех пор, пока не произойдет одно из следующих событий:
![]() |
Вызван метод close XMLSocket объекта. |
![]() |
Ссылок на XMLSocket объект больше не существует. |
![]() |
Flash Player прекратил работу. |
![]() |
Соединение прервано (например, отключился модем) |
Следующий пример создает XML сокет-соединение и отсылает данные из XML объекта myXML. Для облегчения понимания, в скрипте встречаются комментарии, начинающиеся с символов //:
//Создаем новый XMLSocket объект sock = new XMLSocket(); //Вызываем его метод соединения чтобы законнектиться с портом 1024 //сервера по этому урл sock.connect("http://www.myserver.com", 1024); //Определяем функцию назначенную для этого sock объекта, которая будет обрабатывать //ответ сервера. Если соединение произошло, отсылаем myXML объект. //Если что-то не получилось, выводим сообщение об ошибке в текстовом поле "msg" function onSockConnect(success){ if (success){ sock.send(myXML); } else { msg="There has been an error connecting to "+serverName; } } //назначаем onSockConnect функцию для свойства onConnect sock.onConnect = onSockConnect;
Дополнительную информацию смотрите в ActionScript словаре.
Использование переменных в формах
Вы можете использовать переменные в форме для хранения данных, водимых пользователем. Чтобы назначить переменные, используйте окошко свойств редактируемых текстовых полей и назначьте команды кнопкам в элементах интерфейса. Например, каждый пункт всплывающего меню это кнопка с действием, которое устанавливает переменную для указания на нажатый пункт. Вы можете назначить имя этой переменной текстовому полю. Текстовое поле действует подобно окну, которое отображает значение переменной.
Когда вы посылаете/получаете информацию серверному скрипту и от него, переменные в ролике должны совпадать с переменными в скрипте. Например, если скрипт ожидает переменную с именем pаssword, текстовое поле в котором пользователи вводят пароль тоже должно иметь имя переменной password.
Некоторые скрипты требуют скрытых переменных. Это такие переменные, которые пользователь не видит. Чтобы создать скрытую переменную в Flash, вы можете назначить переменную на кадр в ролике, который содержит другие элементы формы. Скрытые переменные отсылаются серверному скрипту наряду с любыми другими переменными из линейки
Примечание: Встроенные Flash-методы GET и POST отсылают все переменные из текущей линейки, включая разные $version. Поэтому, если хочется отослать только то, что необходимо, обычно создают отдельный символ с текстовыми полями и кнопкой "send" и помещают этот символ в основную линейку.
О XML
XML (Расширяемый язык разметки - Extensible Markup Language) стал стандартом обмена структурированными данными в Интернет-Приложениях. Вы можете объединять данные из Flash с серверами, которые используют XML технологию для создания сложных приложений, как например чата или банковской системы .
В XML, так же как и в HTML, вы можете использовать тэги для разметки текста. В HTML вы можете использовать предопределенные тэги чтобы указать каким должен быть показан текст в броузере (например, тэг <b> выделяет текст жирным начертанием). В XML вы указываете тэги которые выделяют тип части данных (например, <password>VerySecret</password>). XML разделяет структуру данных в зависимости от способа их отображения. Это позволяет многократно использовать один и тот же документ в различных средах.
Каждый XML тэг называется узлом (node) или элементом (element). Узлы бывают 2х типов (1-XML элемент, или 3-text узел). Элементы так же могут иметь атрибуты. Узел вложенный в узел (а node nested in a node) называется child или childNode. Эта иерархическая структура узлов называется XML DOM (Document Object Model). Она во многом похожа на JavaScript DOM, являющимся структурой элементов в броузере.
В следующем примере, <PORTFOLIO> является главным узлом (parent node), он не имеет атрибутов и содержит childNode <HOLDING>, который имеет атрибуты SYMBOL, QTY, PRICE и VALUE:
<PORTFOLIO> <HOLDING SYMBOL="RICH" QTY="75" PRICE="245.50" VALUE="18412.50" /> </PORTFOLIO>
Отсылка и прием сообщений Flash
От переводчика:
На данный момент существует альтернатива fscommand, которая работает в большем числе браузеров и позволяет передать среде окружения более одного параметра за один раз- это прямые вызовы яваскриптовых функций командой getURL с синтаксисом
getURL ("javascript:functionname(params,morepareams)");
или
getURL ("javascript:functionname()");
Для использования прямых вызовов яваскрипта не нужно использовать шаблон публикации от fscommand. HTML код обеспечивающий работу прямых вызовов яваскрипта отличается от Flash Only (default) (файл Default.html в папке HTML) только присутствием swLiveConnect=true и NAME=movieID внутри тега Embed. Можно создать собственный шаблон публикации для таких случаев, просто скопировав все содержимое Default.html и добавив swLiveConnect=true NAME=$TI в тег embed (хотя в принципе еще можно слегка изменить строку $TTFlash Only (Default) к примеру на $TTFlash and JavaScript чтобы не путаться :)
Создание форм
Flash-формы предоставляют собой расширенный тип интерактивного интерфейса - комбинацию кнопок, мувиков и текстовых полей, которые позволяют удобно передавать информацию другому приложению на локальном или удаленном сервере. Все стандартные элементы форм (радио-кнопки, выпадающие списки и переключатели) могут быть созданы как мувики или кнопки в стиле вашего сайта.
Простым элементом формы является, например, поле для ввода текста. Стандартным типом форм, использующим этот интерфейс элементов, являются ЧАТы, бланки-заявки и поисковые формы. Например, Flash-форма может собирать адреса и посылать их другому приложению которое в свою очередь преобразует информацию в E-mail письмо или запись базы данных. Даже одиночное текстовое поле рассматривается как форма и может использоваться для получения информации вводимой пользователем и отображения результата.
Форма состоит из двух главных компонентов: элементы Flash-интерфейса, которые составляют форму, а также серверного приложения или скрипта на стороне клиента, для обработки информации, вводимой пользователем. Следующие шаги описывают основные этапы создания формы в Flash.
Для составления формы необходимо:
1 | Поместить элементы интерфейса в ролик. (Можете использовать элементы интерфейса из библиотеки или создать свои). |
2 | В панели Text Options установите РАЗНЫЕ имена переменных для текстовых полей для ввода и подтверждения. (Для дополнительной информации о создании изменяемых текстовых полей смотрите Help файл Flash.) |
3 | Назначьте команду, которая будет отсылать и загружать данные. |
![]() |
Создание поисковой формы
Примером простейшей поисковой формы может служить поле ввода строки поиска с кнопкой "ОК". Следующий пример содержит указания для создания поискового интерфейса с использованием команды getURL.
Для создания простой поисковой формы необходимо:
1 | Создать кнопку, которая подтверждает введенную информацию для поиска. | |
2 | Создать чистое текстовое поле и пояснительную надпись. | |
Ваш экран будет примерно таким:![]() | ||
3 | Выделить текстовое поле и выбрать в Window > Panels> Text Options. | |
4 | В панели Text Options установить следующие параметры: | |
![]() |
Выбрать Input Text из всплывающего меню | |
![]() |
Включить Border/Bg. | |
![]() |
Указать имя переменной. | |
ПРИМЕЧАНИЕ: Некоторые поисковые машины могут требовать специальное имя переменной. Для дополнительной информации смотрите сайт поисковой машины.. | ||
5 | Нажать на правую кнопку в рабочей области и выбрать Window > Actions. | |
Появится панель действий объектов. | ||
ПРИМЕЧАНИЕ: галочка рядом с Actions в меню Window показывает, что панель открыта. | ||
6 | Удерживая кнопку мыши, перетащить команду getURL из окна со списком команд в окно скрипта. | |
7 | В области Параметров действия, установить следующие опции: | |
![]() |
В строку URL, ввести URL поисковой машины. | |
![]() |
Для Window, выбрать _blank. Это откроет новое окно с результатами поиска. | |
![]() |
Для Variables, выбрать Send using GET. | |
8 | Для проверки формы выбрать File > Publish Preview > HTML. | |
![]() |