Skip to content

6. Flex-клієнти сервісу JEE для зустрічей

Тепер ми представимо два клієнти Flex для веб-сервісу JEE для зустрічей. Використовується Flex Builder 3. Демо-версію цього продукту можна завантажити за посиланням [https://www.adobe.com/cfusion/tdrc/index.cfm?loc=fr_fr&product=flex]. Flex Builder 3 — це IDE Eclipse. Крім того, для запуску клієнта Flex ми використовуємо веб-сервер Apache з інструменту Wamp [http://www.wampserver.com/]. Підійде будь-який сервер Apache. Браузер, який відображає клієнт Flex, повинен мати плагін Flash Player версії не нижче 9.

Особливістю додатків Flex є те, що вони виконуються всередині плагіна Flash Player браузера. У цьому вони схожі на додатки Ajax, які вбудовують у сторінки, що надсилаються до браузера, скрипти JavaScript, які потім виконуються безпосередньо в браузері. Додаток Flex не є веб-додатком у звичному розумінні цього слова: це клієнтський додаток, що використовує сервіси, які надаються веб-серверами. У цьому він аналогічний настільному додатку, який би був клієнтом тих самих сервісів. Однак він відрізняється в одному: спочатку його завантажують із веб-сервера у браузері, що має плагін Flash Player, здатний його виконати.

Як і настільний додаток, додаток Flex складається переважно з двох елементів:

  • презентаційної частини: це вікна, що відображаються у браузері. Ці вікна мають таку ж функціональність, як і вікна настільних програм. Вікно описується за допомогою мови тегів, що називається MXML.
  • кодова частина, яка в основному обробляє події, спричинені діями користувача на екрані. Цей код також можна писати на MXML або на об’єктно-орієнтованій мові, що називається ActionScript. Слід розрізняти два типи подій:
  • подія, яка вимагає обміну даними з веб-сервером: заповнення списку даними, наданими веб-додатком, надсилання даних з форми на сервер тощо. Flex надає низку методів для взаємодії з сервером, що є прозорою для розробника. Ці методи за замовчуванням є асинхронними: користувач може продовжувати взаємодіяти з представленням під час запиту до сервера.
  • подія, яка змінює відображуваний вигляд без обміну даними з сервером, наприклад, перетягування елемента з дерева для розміщення його у списку. Цей тип подій повністю обробляється локально в браузері.

Додаток Flex зазвичай виконується таким чином:

  • у [1] запитується HTML-сторінка
  • у [2] вона надсилається. Разом із нею надсилається бінарний файл SWF (ShockWave Flash), що містить весь додаток Flex: усі представлення та код обробки подій для них. Цей файл буде виконано плагіном FlashPlayer браузера.
  • Виконання клієнта Flex відбувається локально в браузері, за винятком випадків, коли йому потрібні зовнішні дані. У такому разі він запитує їх у сервера [3]. Він отримує їх у форматі [4] у різних форматах: XML або бінарному. Додаток, до якого надходить запит на веб-сервері, може бути написаний будь-якою мовою. Важливим є лише формат відповіді.

Ми описали архітектуру виконання додатка Flex, щоб читач чітко усвідомив різницю між нею та архітектурою класичного веб-додатка без Ajax, такого як описаний раніше додаток Asp.Net. В останньому браузер є пасивним: він просто відображає HTML-сторінки, сформовані на веб-сервері, який їх надсилає.

Далі ми наведемо два приклади клієнтів Flex з єдиною метою — продемонструвати різноманітність клієнтів веб-сервісу. Оскільки автор сам є початківцем у Flex, деякі моменти, можливо, не будуть висвітлені так детально, як слід.

6.1. Перший клієнт Flex

Тепер ми напишемо перший клієнт Flex для відображення списку клієнтів. Архітектура «клієнт/сервер», яку ми реалізуємо, буде такою:

У цій архітектурі є два веб-сервери:

  • сервер Glassfish, на якому працює віддалений веб-сервіс
  • сервер Apache, на якому працює клієнт Flex віддаленої веб-служби

Ми створюємо клієнт Flex за допомогою IDE Flex Builder 3:

  • у Flex Builder 3 створюємо новий проєкт у [1]
  • даємо йому ім’я [2] і вказуємо [3], у якій папці його створити
  • у [4] надаємо ім’я головній програмі (тієї, що буде виконуватися)
  • у [5] — після генерації проекту
  • у [6] — головний файл програми MXML
  • файл MXML містить представлення та код обробки подій цього представлення. Вкладка [Source] [7] надає доступ до файлу MXML. У ньому містяться теги <mx>, що описують представлення, а також код ActionScript.
  • Вигляд можна побудувати графічно за допомогою вкладок [Design] та [8]. Теги MXML, що описують вигляд, у цьому випадку генеруються автоматично у вкладці [Source]. І навпаки: теги MXML, додані безпосередньо у вкладці [Source], відображаються графічно у вкладці [Design].

Як і у випадку з попередніми клієнтами C# та Asp.Net, ми створимо локальний проксі-сервер C [B] для віддаленого веб-сервісу S [A]:

Щоб проксі-сервер на мові C міг бути згенерований, веб-сервіс JEE має бути активним.

  • у [1] виберіть опцію «Дані / Імпорт веб-сервісу»
  • у [2] виберіть папку для генерації класів та інтерфейсів проксі-сервера C.
  • у [3] вкажіть URI файлу WSDL віддаленого веб-сервісу S (див. розділ 4.10.2), а потім перейдіть до наступного кроку
  • у [4] та [5] — веб-сервіс, описаний у файлі WSDL, вказаному у [3]
  • у [6]: список методів, які будуть згенеровані для проксі C. Слід зауважити, що це не реальні методи сервісу S. Вони не мають правильного сигнатура. Тут кожен представлений метод має єдиний параметр, незалежно від кількості параметрів реального методу веб-сервісу. Цей єдиний параметр є екземпляром класу, який у своїх полях інкапсулює параметри, очікувані віддаленим методом.
  • en [7]: пакет, у якому будуть згенеровані класи та інтерфейси проксі C
  • у [8]: ім’я локального класу, який виконуватиме роль проксі для віддаленого веб-сервісу
  • у [9]: завершити роботу майстра.
  • en [10]: список класів та інтерфейсів згенерованого проксі-коду на C.
  • en [11]: клас [WsDaoJpaService], що реалізує методи проксі-сервера на мові C.

Згенерований клас [WsDaoJpaService] реалізує наступний інтерфейс [IWsDaoJpaService]:


/**
 * Service.as
 * This file was auto-generated from WSDL by the Apache Axis2 generator modified by Adobe
 * Any change made to this file will be overwritten when the code is re-generated.
 */
package generated.webservices{
    import mx.rpc.AsyncToken;
    import flash.utils.ByteArray;
    import mx.rpc.soap.types.*;
               
    public interface IWsDaoJpaService
    {
        //Функції-заглушки для операції getAllClients
        /**
         * Call the operation on the server passing in the arguments defined in the WSDL file
         * @param getAllClients
         * @return An AsyncToken
         */
        function getAllClients(getAllClients:GetAllClients):AsyncToken;
....
        function getAllClients_send():AsyncToken;
...
        function get getAllClients_lastResult():GetAllClientsResponse;
...
        function set getAllClients_lastResult(lastResult:GetAllClientsResponse):void;
...
       function addgetAllClientsEventListener(listener:Function):void;
...
        function get getAllClients_request_var():GetAllClients_request;
...
        function set getAllClients_request_var(request:GetAllClients_request):void;
...
    }
}
  • рядок 11: інтерфейс [IWsDaoJpaService], реалізований класом [WsDaoJpaService]
  • рядки 19–31: різні методи, згенеровані для методу getAllClients() віддаленого веб-сервісу. Єдиний метод, який наближається до того, що насправді експонується веб-сервісом, — це метод у рядку 19. Він має правильну назву, але неправильну сигнатуру: метод getAllClients() віддаленого веб-сервісу не має параметрів.

Єдиний параметр методу getAllClients згенерованого проксі-сервера C має тип GetAllClients, а саме:


/**
 * GetAllClients.as
 * This file was auto-generated from WSDL by the Apache Axis2 generator modified by Adobe
 * Any change made to this file will be overwritten when the code is re-generated.
 */

package generated.webservices
{
    import mx.utils.ObjectProxy;
    import flash.utils.ByteArray;
    import mx.rpc.soap.types.*;
    /**
     * Wrapper class for a operation required type
     */
    
    public class GetAllClients
    {
        /**
         * Constructor, initializes the type class
         */
        public function GetAllClients() {}
            
    }
}

Це порожній клас. Це може свідчити про те, що цільовий метод getAllClients не приймає параметрів.

Тепер розглянемо класи, згенеровані для об’єктів Medecin, Client, Rv та Creneau. Розглянемо, наприклад, клас Client:


package generated.webservices
{
    import mx.utils.ObjectProxy;
    import flash.utils.ByteArray;
    import mx.rpc.soap.types.*;
    
    public class Client extends generated.webservices.Personne
    {
        public function Client() {}
            
    }
}

Клас Client також порожній. Він походить (рядок 7) від наступного класу Personne:


package generated.webservices
{
    import mx.utils.ObjectProxy;
    import flash.utils.ByteArray;
    import mx.rpc.soap.types.*;
    
    public class Personne
    {
        public function Personne() {}
            
        public var id:Number;
        public var nom:String;
        public var prenom:String;
        public var titre:String;
        public var version:Number;
    }
}
  • рядки 11–15: тут містяться атрибути класу Personne, визначеного в рамках веб-сервісу JEE.

Ми маємо основні елементи проксі C. Тепер ми можемо ним користуватися.

Основний файл клієнта [rdvmedecins01.xml] має такий вигляд:


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init();">
    <mx:Script>
        <![CDATA[
            import generated.webservices.Client;
...
            
            // дані
            private var ws:WsDaoJpaService;
            [Bindable]
            private var clients:ArrayCollection;
            
            private function init():void{
...
            }
            
            private function loadClients():void{
...
            }
            
...            
            private function displayClient(client:Client):String{
...
            } 
        ]]>
    </mx:Script>
    <mx:Label text="Liste des clients" fontSize="14"/>
    <mx:List dataProvider="{clients}" labelFunction="displayClient"></mx:List>
    <mx:Button label="Afficher les clients" click="loadClients()"/>
    <mx:Text id="txtMsgErreur" width="454" height="75"/>
    
</mx:Application>

У цьому коді слід розрізняти різні елементи:

  • визначення додатка (рядок 2)
  • опис його представлення (рядки 27–30)
  • обробники подій на мові ActionScript у тезі <mx:Script> (рядки 3–26).

Для початку прокоментуємо саме визначення додатка та опис його представлення:

  • рядок 2: визначає
    • спосіб розміщення компонентів у контейнері подання. Атрибут layout="vertical" вказує, що компоненти будуть розташовані один під одним.
    • метод, який потрібно виконати після створення екземпляра подання, c.a.d. момент, коли всі його компоненти будуть створені. Атрибут creationComplete="init();" вказує, що має бути виконано метод init із рядка 13. creationComplete — це одна з подій, які може генерувати клас Application.
  • рядки 27–30 визначають компоненти подання
  • рядок 27: визначає текст
  • рядок 28: список, у який буде вставлено перелік клієнтів. Тег dataProvider="{clients}" вказує джерело даних, якими має заповнюватися список. У цьому випадку список заповнюватиметься об’єктом clients, визначеним у рядку 11. Щоб можна було написати dataProvider="{clients}", поле clients повинно мати атрибут [Bindable] (рядок 10). Цей атрибут дозволяє посилатися на змінну ActionScript поза тегом <mx:Script>. Поле clients має тип ArrayCollection — тип ActionScript, що дозволяє зберігати списки об’єктів, у даному випадку список об’єктів типу Client.
  • рядок 29: кнопка. Її подія click обробляється. Атрибут click="loadClients()" вказує, що метод loadClients із рядка 17 має виконуватися під час натискання на кнопку. Саме ця кнопка ініціює запит до веб-сервісу щодо списку клієнтів.
  • рядок 30: текстове поле, призначене для відображення можливого повідомлення про помилку, яке може бути повернуто сервером у відповідь на попередній запит.

Рядки 27–30 формують таке відображення у вкладці [Design]:

  • [1]: було згенеровано компонентом Label із рядка 27
  • [2]: було згенеровано компонентом List із рядка 28
  • [3]: було згенеровано компонентом Button у рядку 29
  • [4]: було згенеровано компонентом Text у рядку 30
  • [5]: приклад виконання

Тепер розглянемо код ActionScript на сторінці. Цей код обробляє події подання.


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init();">

    <mx:Script>
        <![CDATA[
            import generated.webservices.Client;
...
            
            // дані
            private var ws:WsDaoJpaService;
            [Bindable]
            private var clients:ArrayCollection;
            
            private function init():void{
                // створення екземпляра проксі-сервера веб-служби
                ws=new WsDaoJpaService();
                // налаштування обробників подій
                ws.addgetAllClientsEventListener(loadClientsCompleted);
                ws.addEventListener(FaultEvent.FAULT,loadClientsFault);
            }
            
            private function loadClients():void{
                // запит списку клієнтів
                ws.getAllClients(new GetAllClients());
            }
            
            private function loadClientsCompleted(event:GetAllClientsResultEvent):void{
                // отримано клієнтів у надісланому результаті
                clients=event.result as ArrayCollection;
            }
            
            private function loadClientsFault(event:FaultEvent):void{
                // виводиться повідомлення про помилку
                txtMsgErreur.text=event.fault.message;
            }
            
            private function displayClient(client:Client):String{
                // відображення клієнта
                return client.nom + " " + client.prenom;
            } 
        ]]>
    </mx:Script>
    <mx:Label text="Liste des clients" fontSize="14"/>
    <mx:List dataProvider="{clients}" labelFunction="displayClient"></mx:List>
    <mx:Button label="Afficher les clients" click="loadClients()"/>
<mx:Text id="txtMsgErreur" width="454" height="75"/>

  • рядок 9: ws вказує на проксі C типу WsDaoJpaService — раніше згенерований клас, що реалізує методи доступу до віддаленого веб-сервісу.
  • рядок 13: метод init, що виконується під час створення екземпляра представлення (рядок 1)
  • рядок 15: створюється екземпляр проксі-сервера C
  • рядок 17: до події «асинхронний метод GetAllClients успішно завершився» прив’язано обробник подій. Для кожного методу m віддаленого веб-сервісу проксі C реалізує метод addmEventListener, який дозволяє прив’язати обробник до події «асинхронний метод m завершився успішно». Тут у рядку 17 вказано, що метод loadClientsCompleted із рядка 26 має бути виконаний, коли клієнт Flex отримає список клієнтів.
  • рядок 18: обробник подій пов’язаний з подією «асинхронний метод проксі C завершився з помилкою». Тут рядок 18 вказує, що метод loadClientsFault з рядка 31 має виконуватися щоразу, коли асинхронний запит проксі-сервера C до веб-сервісу S завершується з помилкою. У даному випадку єдиним запитом, що буде зроблено, є запит на отримання списку клієнтів.
  • Зрештою, метод init у рядку 13 створив екземпляр проксі C та визначив обробники подій для асинхронного запиту, який буде зроблено пізніше.
  • рядок 21: метод, що виконується при натисканні кнопки [Afficher les clients] (рядок 44)
  • рядок 23: виконується асинхронний метод getAllClients проксі-сервера C. Йому передається екземпляр GetAllClients, який інкапсулює параметри викликаного віддаленого методу. У даному випадку параметрів немає. Створюється порожній екземпляр. Метод getAllClients є асинхронним. Виконання продовжується, не чекаючи на дані, що повертаються сервером. Зокрема, користувач може продовжувати взаємодіяти з представленням. Події, які він викликає, продовжуватимуть оброблятися. Завдяки методу init ми знаємо, що:
    • метод loadClientsCompleted (рядок 26) буде виконано, коли клієнт Flex отримає список клієнтів
    • метод loadClientsFault (рядок 31) буде виконано, якщо запит завершиться помилкою.
  • рядок 28: список клієнтів отримується в події. Відомо, що метод getAllClients віддаленого веб-сервісу повертає список. Його поміщають у поле clients у рядку 11. Необхідне перетворення типів. Оскільки список у рядку 43 прив’язаний (Bindable) до поля «клієнти», він отримує повідомлення про зміну даних. Після цього він відображає список клієнтів. Він відображатиме кожен елемент списку clients за допомогою методу displayClient (рядок 43).
  • рядок 36: метод displayClient отримує тип Client. Він повинен повернути рядок символів, який список має відобразити для цього клієнта. У даному випадку — прізвище та ім’я (рядок 38).
  • рядок 31: метод, що виконується, коли запит до веб-сервісу завершується невдало. Він отримує параметр типу FaultEvent. Цей клас має поле fault, яке інкапсулює помилку, повернуту сервером. fault.message — це повідомлення, що супроводжує помилку.
  • рядок 33: повідомлення про помилку відображається у відповідному текстовому полі.

Після компіляції додатка його виконуваний код знаходиться у папці [bin-debug] проекту Flex:

Вищезазначений

  • файл [rdvmedecins01.html] — це HTML-файл, який браузер буде запитувати у веб-сервера для отримання клієнта Flex
  • файл [rdvmedecins01.swf] — це бінарний файл клієнта Flex, який буде вбудовано у HTML-сторінку, надіслану до браузера, а потім виконано за допомогою плагіна Flash Player цього браузера.

Ми готові запустити клієнт Flex. Але спершу нам потрібно налаштувати необхідне для нього середовище виконання. Повернімося до протестованої архітектури «клієнт/сервер»:

На стороні сервера:

  • запустити SGBD MySQL
  • запустити сервер Glassfish
  • розгорнути веб-сервіс JEE для зустрічей, якщо він ще не розгорнутий
  • за необхідності протестувати один із попередніх клієнтів, щоб переконатися, що на стороні сервера все працює належним чином.

На стороні клієнта:

Запустити сервер Apache, до якого буде звертатися додаток Flex. Тут ми використовуємо інструмент Wamp. За допомогою цього інструменту ми можемо прив’язати псевдонім до папки [bin-debug] проекту Flex.

  • іконка Wamp знаходиться внизу екрана [1]
  • клацнувши лівою кнопкою миші на іконці Wamp, виберіть опцію Apache [2] / Alias Directories [3, 4]
  • виберіть опцію [5]: «Додати псевдонім»
  • у [6] присвоїти псевдонім (будь-яке ім’я) веб-додатку, який буде запущено
  • у [7] вкажіть кореневу папку веб-додатку, який матиме цей псевдонім: це папка [bin-debug] проекту Flex, який ми щойно створили.

Нагадаємо структуру папки [bin-debug] проекту Flex:

Файл [rdvmedecins01.html] — це HTML-файл додатка Flex. Завдяки псевдоніму, який ми щойно створили для папки [bin-debug], цей файл можна буде відкрити за URL-адресою [http://localhost/rdvmedecins/rdvmedecins01.html]. Ми відкриваємо його в браузері, що має плагін Flash Player версії 9 або вище:

  • у [1], URL-адреса додатка Flex
  • [2] — запит на список клієнтів
  • у [3] — результат, отриманий, коли все працює нормально
  • у [4] — результат, отриманий при запиті на відображення клієнтів, коли веб-сервіс було зупинено.

Можливо, вам буде цікаво переглянути вихідний код отриманої HTML-сторінки

<!-- збережено з url=(0014)about:internet -->
<html lang="en">

<!-- 
Smart developers always View Source. 

This application was built using Adobe Flex, an open source framework
for building rich Internet applications that get delivered via the
Flash Player or to desktops via Adobe AIR. 

Learn more about Flex at http://flex.org 
// -->

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<!--   BEGIN Розділ «Історія браузера» обовязковий -->
<link rel="stylesheet" type="text/css" href="history/history.css" />
<!--   END Розділ, для якого потрібна історія браузера -->

<title></title>
<script src="AC_OETags.js" language="javascript"></script>
...
<script language="JavaScript" type="text/javascript">
<!--
// -----------------------------------------------------------------------------
// Глобальні змінні
// Потрібна основна версія Flash
var requiredMajorVersion = 9;
// Необхідна допоміжна версія Flash
var requiredMinorVersion = 0;
// Необхідна допоміжна версія Flash
var requiredRevision = 124;
// -----------------------------------------------------------------------------
// -->
</script>
</head>

<body scroll="no">
<script language="JavaScript" type="text/javascript">
<!--
// Перевірка версії Flash Player, що підтримує запуск установки продукту Player (6.0r65)
....
// -->
</script>
<noscript>
        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
                        id="rdvmedecins01" width="100%" height="100%"
                        codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
                        <param name="movie" value="rdvmedecins01.swf" />
                        <param name="quality" value="high" />
                        <param name="bgcolor" value="#869ca7" />
                        <param name="allowScriptAccess" value="sameDomain" />
                        <embed src="rdvmedecins01.swf" quality="high" bgcolor="#869ca7"
                                width="100%" height="100%" name="rdvmedecins01" align="middle"
                                play="true"
                                loop="false"
                                quality="high"
                                allowScriptAccess="sameDomain"
                                type="application/x-shockwave-flash"
                                pluginspage="http://www.adobe.com/go/getflashplayer">
                        </embed>
        </object>
</noscript>
</body>
</html>

Основна частина сторінки починається з 39-го рядка. Вона містить не класичний HTML, а об’єкт (рядок 47) типу «application/x-shockwave-flash» (рядок 60). Це файл [rdvmedecins01.swf] (рядок 54), який можна побачити в папці [bin-debug] проекту Flex. Це файл значного розміру: приблизно 600 К для цього простого прикладу.

6.2. Другий клієнт Flex

Другий клієнт Flex не використовуватиме проксі на C, згенерований для першого. Ми хочемо показати, що цей крок не є обов’язковим, хоча він і має переваги порівняно з тим, що буде представлено тут.

Проєкт розвивається наступним чином:

  • у [1] — новий додаток Flex
  • у [2] — пов’язані з ним виконувані файли
  • в [3] — новий вигляд: ми відобразимо список лікарів.

Код MXML додатка [rdvmedecins02.mxml] має такий вигляд:


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:Script>
        <![CDATA[
            import mx.rpc.events.ResultEvent;
            import mx.rpc.events.FaultEvent;
            import mx.collections.ArrayCollection;
            
            // дані
            [Bindable]
            private var medecins:ArrayCollection;
            
            private function loadMedecins():void{
                // запитується список лікарів
                wsrdvmedecins.getAllMedecins.send();
            }
            
            private function loadMedecinsCompleted(event:ResultEvent):void{
                // отримано список лікарів
                medecins=event.result as ArrayCollection;
            }
            
            private function loadMedecinsFault(event:FaultEvent):void{
                // виведення повідомлення про помилку
                txtMsgErreur.text=event.fault.message;
            } 
            
            // відображення даних про лікаря
            private function displayMedecin(medecin:Object):String{
                return medecin.nom + " " + medecin.prenom;
            } 

        ]]>
    </mx:Script>
    <mx:WebService id="wsrdvmedecins" 
        wsdl="http://localhost:8080/serveur-webservice-ejb-dao-jpa-hibernate/WsDaoJpaService?wsdl">
        <mx:operation name="getAllMedecins" 
            result="loadMedecinsCompleted(event)" fault="loadMedecinsFault(event);">
            <mx:request/>
        </mx:operation>
    </mx:WebService>
    <mx:Label text="Liste des médecins" fontSize="14"/>
    <mx:List dataProvider="{medecins}" labelFunction="displayMedecin"></mx:List>
    <mx:Button label="Afficher les médecins" click="loadMedecins()"/>
    <mx:Text id="txtMsgErreur" width="300" height="113"/>
    
</mx:Application>

Ми прокоментуємо лише нововведення:

  • рядки 42–45: новий вигляд. Він ідентичний попередньому, за винятком того, що його було адаптовано для відображення лікарів замість клієнтів.
  • рядки 35–41: веб-сервіс тут описано тегом <mx:WebService> (рядок 35). Проксі C, що використовувався в попередній версії, тут більше не застосовується.
  • рядок 35: атрибут id присвоює веб-сервісу ім’я.
  • рядок 36: атрибут wsdl вказує URI файлу WSDL веб-сервісу. Це той самий URI, що використовувався попереднім клієнтом і визначений у параграфі 4.10.2.
  • рядки 37–40: визначають метод віддаленого веб-сервісу за допомогою тегу <mx:operation>
  • рядок 37: метод, на який посилається тег, визначається атрибутом name. Тут ми посилаємося на віддалений метод getAllMedecins.
  • рядок 38: визначаються методи, які слід виконати у разі успішного виконання операції (атрибут result) та у разі невдачі (атрибут fault).
  • рядок 39: тег <mx:request> слугує для визначення параметрів операції. У даному випадку віддалений метод getAllMedecins не має параметрів, тому ми нічого не вказуємо. Для методів, що приймають параметри param1 та param2, слід написати:
<mx:Request>
    <param1>{param1}</param1>
    <param1>{param1}</param1>
</mx:Request>

де param1 та param2 — це змінні, оголошені та ініціалізовані у тезі <mx:Script>

[Bindable]
private var param1:Type1;
[Bindable]
private var param2:Type2;

У тезі <mx:Script> міститься код ActionScript, аналогічний тому, що розглядався в попередньому клієнті. Відрізняється лише метод loadMedecins у рядках 13–16. Відмінність полягає у способі виклику віддаленого методу [getAllMedecins]:

  • рядок 15: використовується веб-сервіс [wsrdvmedecins], визначений у рядку 35, та його операція [getAllMedecins], визначена у рядку 37. Для виконання цієї операції використовується метод send. Саме вона ініціює асинхронний виклик методу getAllMedecins веб-сервісу, визначеного в рядку 35. Метод send здійснить виклик із параметрами, визначеними тегом <mx:request> у рядку 39. У даному випадку параметрів немає. Якби метод мав параметри param1 та param2, скрипт loadMedecins присвоїв би значення цим параметрам перед викликом методу send.

Залишилося лише протестувати цей новий додаток: