[ предыдущая страница ] [ следующая страница ] [ содержание ]

8.4. Взаимодействие с сервером

Использование XML-данных в роликах Flash имеет смысл в том случае, если необходимо обмениваться с сервером какими-либо структурами данных. Поэтому разработчики Flash предусмотрели специальные методы для осуществления такого обмена путем взаимодействия с серверными приложениями.

Прежде всего, стоит рассказать о двух особенностях, которые введены во избежание ошибок обращения к элементам XML-объекта, которые еще не успели загрузиться с сервера. Если помните, XML-объекты могут быть загружены с сервера методом load (или методом sendAndLoad, о котором речь пойдет ниже). Для проверки того, загружен ли полностью XML-объект, используется свойство loaded. Например, можно написать в одном кадре такой код:

a = new XML();
a.load ("http://myserver.com/mytest.xml");

а в другом:

if (!a.loaded) gotoAndPlay(49);
else gotoAndPlay ("xml-exchange");

Это обеспечит переход к кадру со сценарием, использующим XML (мы его назвали условно xml-exchange) только после полной загрузки XML-объекта. Обратите внимание на то, что метод load и использование свойства loaded должны находиться в разных кадрах, иначе возможны ошибки. Кроме того, существует метод onLoad, который вызывает сопоставленную с ним пользовательскую функцию по окончании загрузки объекта. Синтаксис этого метода весьма схож с синтаксисом, использующимся в подобных случаях в JavaScript:

а = new XML();
a.load ("http://myserver.com/mytest.xml");
а.onLoad = SomeFunc;

При этом предполагается, что определена пользовательская функция SomeFunc, которая и будет выполнена при загрузке объекта. Кстати, эта функция вполне может принять аргумент, который ей передаст метод onLoad. В случае, если загрузка завершилась неудачей, аргумент равен false, а если все в порядке, то true.

Теперь давайте поговорим о том, что же наш ролик может сделать со сформированными XML-данными. При всем многообразии вариантов их употребления выясняется, что от сценария ActianScript требуется совсем немного - отправить данные соответствующему серверному приложению. Даже если нам необходимо просто показать пользователю XML-документ, все равно придется переслать его серверу, поскольку встроенного XML-браузера программа Flash (пока что?) не имеет. Давайте поэтому для простоты рассмотрим в качестве примера именно этот случай.

Итак, создадим сценарий, генерирующий простую XML-структуру и затем передадим ее для отображения в браузере. Сначала откроем новый ролик и создадим в первом кадре следующий сценарий.

a = new XML();
аа = a.createElement("beatles");
a.appendChild(aa);
//a.docTypeDecl = "<!DOCTYPE beatles [\n<!ELEMENT beatles (lennon+)>\n<!ELEMENT lennon (#PCDATA)>\n]>\n";
aaa = a.createElement("lennon");
aaa2 = a.createElement("lennon");
aa.appendChild (aaa);
aa.appendChild (aaa2);
aaa.appendChild("Is there anybody going to listen to my story...");
aaa2.appendChild("Women I can hardly express...");
b = a.toString();

Строку DOCTYPE мы закомментировали, поскольку текущая версия Internet Explorer 5.5 в данном случае неправильно воспринимает ее последние символы. Можно также создать динамическое текстовое поле и сопоставить его с переменной b, чтобы увидеть получившийся XML-код:

<beatles><lennon>Is there anybody going to listen to my story...</lennon><lennon>Women I can hardly express...</lennon></beatles>

Итак, мы видим, что XML-объект превращается в "хорошо оформленный" XML-документ. Чтобы передать его на сервер, можно использовать специальный метод send. В качестве его аргумента следует указать адрес URL серверного приложения, а также имя окна браузера, в которое будет выведен ответ сервера (можно использовать также специальные имена _blank, _top, _self и _parent). Например, если мы хотим отобразить содержимое XML-объекта в браузере, напишем соответствующий серверный сценарии и отошлем ему наш XML-объект:

a.send ("http://www.myserver.com/xmlshow.pl","_blank");

При этом XML-объект кодируется в совместимый с HTTP формат и передается на сервер методом POST. В данном примере ответ сервера будет выведен в новом окне браузера. Вот как при этом может выглядеть сценарий для отображения нашего XML-объекта (файл xmlshow.pl):

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
if ($ENV("REQUEST_METHOD") eq "POST") {
sysread(STDIN,$xmlobj,$ENV{CONTENT_LENGTH});
$xmlobj=~s/\+/ /g;
$xmlobj=~s/%([0-9A-H]{2})/pack("C",hex($1))/ge;
print "<?xml version=\"1.0\"?><?xml-stylesheet href=\"http://www.myserver.com/t.css\" type=\"text/css\"?>";
print $xmlobj;
}
exit 0;

Как видите, нам нужно было только раскодировать XML-документ и отослать браузеру-клиенту. Обратите внимание на то, что пришлось предварить вывод этого документа командой

<?xml-stylesheet href="http://www.myserver.com/t.css" type="text/css"?>

Дело в том, что современный браузер обычно не отображает содержимое XML, если не находит ссылки на соответствующую таблицу стилей XSL или CSS. В данном случае мы употребили CSS. В таблице мы задали стили отображения элементов документа <beatles> и <lennon>:

beatles {
   display: block;
   font-size: 30px;
   width: 400px;
   background-color: #CCEEEE;
   text-align: center;
   padding: 20px;
}
lennon {
   display: block;
   width: 300px;
   text-align: center;
   background-color: #111111;
   color: #FF6688;
   margin: 2px;
}

При этом на экране пользователь увидит примерно то, что изображено на рис. 8.3. Разумеется, мы привели пример крайне простого серверного сценария. Точно таким же образом XML-данные, сгенерированные или обработанные во Flash-ролике можно передавать любому серверному приложению.


Рис. 8.3. Пример отображения XML-обьекта

Если сервер при этом генерирует обычный ответ типа text/himl, text/plain и тому подобное, этот ответ отображается просто в браузере. Но бывают ситуации, когда сервер, в свою очередь, возвращает другие XML-данные. Для того чтобы загрузить такой ответ сервера прямо в объект ActionScript, можно использовать метод sendAndLoad. Этот метод сначала действует аналогично методу send, то есть кодирует XML-данные и пересылает их с помощью запроса POST, а затем загружает ответ сервера в указанный XML-объект. Если переменные a и q сопоставлены с объектами XML, то синтаксис при этом следующий:

a.seridAndLoad ("http://www.myserver.com/xmlreturn.pl",q);

Методы send и sendAndLoad весьма удобны, однако здесь есть небольшая загвоздка. Дело в том, что в некоторых версиях программы Flash запросы POST работают некорректно (проще говоря, вообще практически не работают). В этом случае становится невозможным использование методов send и sendAndLoad объекта XML, а также просто оператора getURL с передачей переменных с помощью POST.

Если вам попалась именно такая версия программы, не стоит отчаиваться или вообще отказываться от использования объектов XML Ведь можно воспользоваться всей мощью методов манипуляции объектами, а загрузку на сервер осуществить через внешнюю среду.

Представим себе, что мы хотим заставить работать наш пример именно с такой версией Flash. В этом случае можно поместить ролик в браузер, и заменить метод send на передачу команды в среду браузера:

fscommand ("send",b);

Собственно говоря, нам здесь важна только переменная b, которая в нашем примере содержит строковое представление XML-объекта (см. листинг выше). Тогда в HTML-окружении мы можем создать невидимую форму, состоящую из одного скрытого поля, и сценарий, который присвоит этому полю значение b и передаст на сервер. Сценарий может вызываться из ролика при исполнении fscommand. Поскольку HTML-форма не видна на экране, пользователь может и не подозревать о ее присутствии.

<HTML>
<HEAD>
<TITLE>testthruhtml</TITLE>
<SCRIPT LANGUAGE="VBScript">
Sub t_FSCommand(ByVal cmd,ByVal arg)
call t_DoFSCommand (cmd,arg)
end sub
</SCRIPT>
<SCRIPT language="JavaScript">
function t_DoFSCommand(cmd,arg) {
document.forms[0].xmlfield.value = arg;
document.forms[0].submit ();
}
</SCRIPT>
</HEAD>
<BODY bgcolor="#FFFFFF">
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
   codebase="http://download.macromedia.com/pub/shockwave/cabs/
   flash/swflash.cab#version=5,0,0,0" WIDTH=550
   HEIGHT=400 ID="t">
<PARAM HAME=movie VALUE="t.swf">
<PARAM NAME=quality VALUE=high>
<PARAM HAME=bgcolor VALUE=#FFFFFF>
<EMBED src="testthruhtml.swf" quality=high bgcolor=#FFFFFF
   WIDTH=550 HEIGHT=400 TYPE="application/x-shockwave-flash"
   PLUGINSPAGE="http://www.macromedia.com/shockwave/
   download/index.cgi?P1_Prod_Version=ShockwaveFlash">
   </EMBED> </OBJECT>
<form action="http://www.myserver.net/xmlshow.pl" method="post">
<input type="hidden" name="xmlfield" value="">
</form>
</BODY>
</HTML>

Здесь подразумевается, что файл ролика называется t.swf. При выполнении в нем оператора fscommand запускается функция JavaScript, которая вставляет в скрытое поле формы строковое представление XML-объекта, а затем с помощью метода submit эмулирует нажатие на кнопку передачи запроса серверу.

Этот пример приведен скорее для иллюстрации того, как можно обходить препятствия, возникающие не по вашей вине. Вообще же говоря, вряд ли потребуется применять на практике подобные ухищрения, поскольку Flash-проигрыватели для браузеров Internet Explorer и Netscape отрабатывают запрос POST правильно.

Для особых случаев разработчики Flash предусмотрели возможность прямо из сценария связываться с сервером в обход протокола HTTP. Для этого предусмотрен объект XMLSocket, с помошью которого можно установить прямое соединение с сервером (обращаясь через порт с номером 1024 или большим). Правда, при этом нельзя запрограммировать собственный протокол - объект XMLSocket уже содержит его. Его двумя главными особенностями являются представление каждого XML-сообщения в виде завершенного XML-документа, в конец которого добавлен нулевой байт, и отсутствие ограничения на число переданных и принятых сообщений через одно соединение. Правда, не все серверные программы-демоны способны понять этот протокол. Кроме того, соединение через такой сокет возможно далеко не с любым компьютером - по соображениям безопасности многие брандмауэры (даже на промежуточных узлах) могут заблокировать такое соединение. Да к тому же установка соединения через такой сокет может быть небезопасна также и для вас, поскольку позволяет получить доступ к вашему компьютеру. В документации к программе Flash говорится, что по соображениям безопасности соединения через сокет должны устанавливаться только с компьютерами, находящимися в той же зоне домена второго уровня.

Поэтому мы не будем подробно останавливаться на способах применения объекта XMLSocket. Методы этого объекта приведены в Приложении 2. Применять подобные вещи имеет смысл только тогда, когда без них действительно нельзя или очень трудно обойтись. Например, соединение через сокет вполне целесообразно применить в системах реального времени (например, чатах), где необходимо оставить серверу возможность передавать клиенту поступившую информацию без запроса с его стороны, или же подолгу держать соединение открытым. В остальных случаях лучше воспользоваться обычной пересылкой данных по протоколу HTTP с помощью методов GET или POST.

На этой достаточно интересной и многогранной теме мы и закончим наше повествование о замечательной программе Flash. Надеемся, что на основе полученных знаний вы теперь сможете создавать свои собственные интересные разработки. Примеры, приведенные в этой книге, достаточно просты, но они наглядно демонстрируют приемы программирования на ActionScript. А на основе простых элементов можно создавать все более и более сложные композиции. Только не забывайте о том, что оформление никогда не должно заслонять собой содержание вашего творения, будь то веб-странипа или просто локальная презентация. Если оформление подчинить содержанию, то сразу исчезнет множество проблем, и работа пойдет веселей и удачней.

[ предыдущая страница ] [ следующая страница ] [ содержание ]
Hosted by uCoz