Skip to content

6. Randevu hizmeti JEE'in Flex istemcileri

Şimdi, randevu web hizmeti JEE'in iki Flex istemcisini tanıtıyoruz. Kullanılan IDE, Flex Builder 3'tür. Bu ürünün deneme sürümü [https://www.adobe.com/cfusion/tdrc/index.cfm?loc=fr_fr&product=flex] URL'sinden indirilebilir. Flex Builder 3, Eclipse tabanlı bir IDE yazılımıdır. Ayrıca, Flex istemcisini çalıştırmak için Wamp [http://www.wampserver.com/] aracının Apache web sunucusunu kullanıyoruz. Herhangi bir Apache sunucusu bu iş için uygundur. Flex istemcisini görüntüleyen tarayıcıda en az Flash Player 9 sürümü eklentisi bulunmalıdır.

Flex uygulamalarının özelliği, tarayıcının Flash Player eklentisi içinde çalışmasıdır. Bu bakımdan, tarayıcıya gönderilen sayfalara JavaScript komut dosyalarını yerleştiren ve bu komut dosyalarının daha sonra tarayıcı içinde çalıştırılan Ajax uygulamalarına benzerler. Bir Flex uygulaması, genel anlamıyla bir web uygulaması değildir: bu, web sunucuları tarafından sağlanan hizmetlerin istemci uygulamasıdır. Bu bakımdan, aynı hizmetlerin istemcisi olan bir masaüstü uygulamasına benzer. Ancak bir noktada farklılık gösterir: başlangıçta, onu çalıştırabilecek Flash Player eklentisine sahip bir tarayıcı aracılığıyla bir web sunucusundan indirilir.

Bir masaüstü uygulaması gibi, bir Flex uygulaması da temel olarak iki unsurdan oluşur:

  • görünüm kısmı: tarayıcıda görüntülenen görünümler. Bu görünümler, masaüstü uygulamalarının pencereleri kadar zengin özelliklere sahiptir. Bir görünüm, MXML adlı bir etiket dili kullanılarak tanımlanır.
  • kod bölümü: esas olarak kullanıcının görünüm üzerindeki eylemlerinin tetiklediği olayları yönetir. Bu kod, MXML dilinde veya ActionScript adlı nesne yönelimli bir dilde de yazılabilir. İki tür olay arasında ayrım yapmak gerekir:
  • Web sunucusuyla veri alışverişi gerektiren olay: bir web uygulaması tarafından sağlanan verilerle bir listenin doldurulması, bir formdaki verilerin sunucuya gönderilmesi, ... Flex, geliştirici için şeffaf bir şekilde sunucuyla iletişim kurmak üzere bir dizi yöntem sunar. Bu yöntemler varsayılan olarak eşzamansızdır: kullanıcı, sunucuya yapılan istek sırasında görünümle etkileşime devam edebilir.
  • Sunucu ile veri alışverişi yapmadan görüntülenen görünümü değiştiren olay; örneğin, bir ağaçtan bir öğeyi seçip bir listeye bırakmak. Bu tür olaylar tamamen tarayıcı içinde yerel olarak işlenir.

Bir Flex uygulaması genellikle şu şekilde çalıştırılır:

  • [1]'te bir HTML sayfası istenir
  • [2]'te bu sayfa gönderilir. Sayfa, Flex uygulamasının tamamını (tüm görünümleri ve bunlara ait olay işleme kodlarını) içeren SWF (ShockWave Flash) adlı bir ikili dosyayı da beraberinde taşır. Bu dosya, tarayıcının FlashPlayer eklentisi tarafından çalıştırılacaktır.
  • Flex istemcisinin çalıştırılması, harici verilere ihtiyaç duyulmadığı sürece tarayıcı üzerinde yerel olarak gerçekleştirilir. Bu durumda, verileri [3] sunucusundan talep eder. Verileri, [4] formatında çeşitli biçimlerde (XML veya ikili) alır. Web sunucusunda sorgulanan uygulama herhangi bir dilde yazılabilir. Önemli olan yalnızca yanıtın formatıdır.

Okuyucunun, Flex uygulamasının yürütme mimarisini, daha önce açıklanan Asp.Net uygulaması gibi Ajax içermeyen geleneksel bir web uygulaması ile arasındaki farkı net bir şekilde kavrayabilmesi için bu mimariyi açıkladık. Sonuncusunda tarayıcı pasiftir: sadece web sunucusunda oluşturulup kendisine gönderilen HTML sayfalarını görüntüler.

Bundan sonra, bir web hizmetinin istemcilerinin çeşitliliğini göstermek amacıyla iki Flex istemcisi örneği vereceğiz. Yazarın kendisi de Flex konusunda yeni olduğu için, bazı noktalar olması gerektiği kadar ayrıntılı olarak ele alınmayabilir.

6.1. İlk Flex istemcisi

Şimdi, müşteri listesini görüntülemek için ilk Flex istemcisini yazacağız. Kurulacak istemci/sunucu mimarisi şu şekilde olacaktır:

Bu mimaride iki web sunucusu bulunmaktadır:

  • uzaktaki web hizmetini çalıştıran Glassfish sunucusu
  • uzak web hizmetinin Flex istemcisini çalıştıran Apache sunucusu

Flex istemcisini IDE Flex Builder 3 ile oluşturuyoruz:

  • Flex Builder 3'te, [1] ile yeni bir proje oluşturuyoruz
  • projeye [2] adını veriyoruz ve [3] ile projenin hangi klasörde oluşturulacağını belirtiyoruz
  • [4]'te, ana uygulamaya (çalıştırılacak olan) bir ad verilir
  • [5]'te, proje oluşturulduktan sonra
  • [6]'te, uygulamanın ana dosyası olan MXML
  • MXML dosyası, bir görünüm ve bu görünümün olaylarını yöneten kodu içerir. [Source] [7] sekmesi, MXML dosyasına erişim sağlar. Burada, görünümü tanımlayan <mx> etiketleri ve ActionScript kodu bulunur.
  • Görünüm, [Design] ve [8] sekmeleri kullanılarak grafiksel olarak oluşturulabilir. Görünümü tanımlayan MXML etiketleri, bu durumda [Source] sekmesinde otomatik olarak oluşturulur. Tersi de geçerlidir: [Source] sekmesine doğrudan eklenen MXML etiketleri, [Design] sekmesinde grafiksel olarak yansıtılır.

Önceki C# istemcileri ve Asp.Net ile yapıldığı gibi, S [A] uzak web hizmetinin C [B] yerel proxy'sini oluşturacağız:

C proxy'sinin oluşturulabilmesi için JEE web hizmetinin aktif olması gerekir.

  • [1]'te, Data / Import Web Service
  • [2]'te, C proxy'sinin sınıf ve arayüzlerinin oluşturulacağı klasörü seçin.
  • [3]'te, uzak web hizmeti S'nin WSDL dosyasının Uri'sini girin (bkz. paragraf 4.10.2) ve ardından bir sonraki adıma geçin
  • [4] ve [5]'te, [3]'te belirtilen WSDL dosyası tarafından tanımlanan web hizmeti
  • [6]'te: C proxy'si için oluşturulacak yöntemlerin listesi. Bunların S hizmetinin gerçek yöntemleri olmadığına dikkat edilmelidir. Doğru imzaya sahip değillerdir. Burada, web hizmetinin gerçek yöntemindeki parametre sayısına bakılmaksızın, sunulan her yöntemin tek bir parametresi vardır. Bu tek parametre, uzak yöntem tarafından beklenen parametreleri alanlarında barındıran bir sınıf örneğidir.
  • [7]: C proxy'sinin sınıflarının ve arayüzlerinin oluşturulacağı paket
  • [8]: Uzak web hizmetine proxy görevi görecek yerel sınıfın adı
  • [9]: Sihirbazı tamamlayın.
  • [10]: Oluşturulan C proxy'sinin sınıf ve arayüzlerinin listesi.
  • [11]: C proxy'sinin yöntemlerini uygulayan [WsDaoJpaService] sınıfı.

Oluşturulan [WsDaoJpaService] sınıfı, aşağıdaki [IWsDaoJpaService] arayüzünü uygular:


/**
 * 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 işlemi için stub işlevleri
        /**
         * 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. satır: [WsDaoJpaService] sınıfı tarafından uygulanan [IWsDaoJpaService] arayüzü
  • 19-31. satırlar: Uzak web hizmetinin getAllClients() yöntemi için oluşturulan çeşitli yöntemler. Web hizmeti tarafından gerçekten sunulan yönteme en yakın olanı 19. satırdaki yöntemdir. Adı doğru ancak imzası doğru değildir: Uzak web hizmetinin getAllClients() yöntemi parametre içermez.

Oluşturulan C proxy’sindeki getAllClients yönteminin tek parametresi, aşağıdaki GetAllClients türündedir:


/**
 * 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() {}
            
    }
}

Bu, boş bir sınıftır. Bu durum, hedef yöntem olan getAllClients'in parametre kabul etmemesiyle ilişkili olabilir.

Şimdi Medecin, Client, Rv ve Creneau varlıklar için oluşturulan sınıfları inceleyelim. Örneğin, Client sınıfını inceleyelim:


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 sınıfı da boştur. Bu sınıf (7. satır), aşağıdaki Personne sınıfından türetilmiştir:


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. satırlar: JEE web hizmeti içinde tanımlanan Personne sınıfının özniteliklerini burada da görüyoruz.

C proxy'sinin temel öğelerine sahibiz. Artık bunu kullanabiliriz.

İstemcinin ana dosyası [rdvmedecins01.xml] şu şekildedir:


<?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;
...
            
            // veriler
            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>

Bu kodda çeşitli unsurları ayırt etmek gerekir:

  • uygulamanın tanımı (2. satır)
  • uygulamanın görünümünün açıklaması (27-30. satırlar)
  • <mx:Script> etiketinin içindeki ActionScript dilinde yazılmış olay işleyicileri (3-26. satırlar).

Öncelikle, uygulamanın tanımını ve görünümünün açıklamasını inceleyelim:

  • 2. satır:
    • görünüm konteyneri içindeki bileşenlerin düzenlenme şeklini tanımlar. layout="vertical" özniteliği, bileşenlerin birbirinin altına yerleştirileceğini belirtir.
    • Görünüm örneklendiğinde çalıştırılacak yöntem, c.a.d. Tüm bileşenleri örneklendiğinde. creationComplete="init();" özniteliği , 13. satırdaki init yönteminin çalıştırılması gerektiğini belirtir. creationComplete, Application sınıfının yayınlayabileceği olaylardan biridir.
  • 27-30. satırlar, görünümün bileşenlerini tanımlar
  • 27. satır: bir metin tanımlar
  • 28. satır: Müşteri listesinin yerleştirileceği bir liste tanımlar. dataProvider="{clients}" etiketi, listeyi dolduracak verilerin kaynağını belirtir. Burada liste, 11. satırda tanımlanan clients nesnesiyle doldurulacaktır. dataProvider="{clients}" yazabilmek için, clients alanının [Bindable] özniteliğine sahip olması gerekir (10. satır). Bu öznitelik, ActionScript değişkeninin <mx:Script> etiketinin dışında referans alınmasına olanak tanır. clients alanı, ArrayCollection türündedir; bu, nesne listelerini depolamaya olanak tanıyan bir ActionScript türüdür ve burada Client türünde bir nesne listesi depolanmaktadır.
  • 29. satır: bir düğme. click olayını yönetir. click="loadClients()" özniteliği, düğmeye tıklandığında 17. satırdaki loadClients yönteminin çalıştırılması gerektiğini belirtir. Müşteri listesi için web hizmetine yapılacak isteği tetikleyen bu düğme olacaktır.
  • 30. satır: Önceki istek üzerine sunucu tarafından geri gönderilebilecek olası bir hata mesajını görüntülemek için kullanılan bir metin alanı.

27-30. satırlar, [Design] sekmesinde aşağıdaki görünümü oluşturur:

  • [1]: 27. satırdaki Label bileşeni tarafından oluşturulmuştur
  • [2]: 28. satırdaki List bileşeni tarafından oluşturulmuştur
  • [3]: 29. satırdaki Button bileşeni tarafından oluşturulmuştur
  • [4]: 30. satırdaki Text bileşeni tarafından oluşturulmuştur
  • [5]: bir yürütme örneği

Şimdi sayfanın ActionScript kodunu inceleyelim. Bu kod, görünüm olaylarını yönetir.


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

    <mx:Script>
        <![CDATA[
            import generated.webservices.Client;
...
            
            // veriler
            private var ws:WsDaoJpaService;
            [Bindable]
            private var clients:ArrayCollection;
            
            private function init():void{
                // web hizmeti proxy'si başlatılıyor
                ws=new WsDaoJpaService();
                // olay işleyicileri yapılandırılıyor
                ws.addgetAllClientsEventListener(loadClientsCompleted);
                ws.addEventListener(FaultEvent.FAULT,loadClientsFault);
            }
            
            private function loadClients():void{
                // istemcilerin listesi isteniyor
                ws.getAllClients(new GetAllClients());
            }
            
            private function loadClientsCompleted(event:GetAllClientsResultEvent):void{
                // gönderilen sonuçtan müşteriler alınır
                clients=event.result as ArrayCollection;
            }
            
            private function loadClientsFault(event:FaultEvent):void{
                // hata mesajı görüntüleniyor
                txtMsgErreur.text=event.fault.message;
            }
            
            private function displayClient(client:Client):String{
                // bir müşteri görüntüleniyor
                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. satır: ws, WsDaoJpaService türündeki C proxy'sini, yani uzak web hizmetine erişim yöntemlerini uygulayan ve daha önce oluşturulan sınıfı işaret edecektir.
  • 13. satır: Görünümün örneklendiği sırada (1. satır) yürütülen init yöntemi
  • 15. satır: C proxy'sinin bir örneği oluşturulur
  • 17. satır: "GetAllClients asenkron yöntemi başarıyla tamamlandı" olayına bir olay işleyicisi atanır. Uzak web hizmetindeki her m yöntemi için, C proxy'si "asenkron addmEventListener yöntemi başarıyla tamamlandı" olayına bir işleyici atamaya olanak tanıyan bir addmEventListener yöntemi uygular. Burada, 17. satır, Flex istemcisi istemci listesini aldığında 26. satırdaki loadClientsCompleted yönteminin yürütülmesi gerektiğini belirtir.
  • 18. satır: "C proxy'sinin bir asenkron yöntemi başarısızlıkla sonuçlandı" olayına bir olay işleyicisi atanmıştır. Burada 18. satır, C proxy'sinden S web hizmetine yönelik asenkron bir istek her başarısız olduğunda 31. satırdaki loadClientsFault yönteminin çalıştırılması gerektiğini belirtir. Burada yapılacak tek istek, müşteri listesini talep eden istektir.
  • Sonuç olarak, 13. satırdaki init yöntemi, C proxy'sini başlatmış ve daha sonra yapılacak asenkron istek için olay işleyicileri tanımlamıştır.
  • 21. satır: [Afficher les clients] düğmesine (44. satır) tıklandığında yürütülen yöntem
  • 23. satır: C proxy'sinin asenkron getAllClients yöntemi yürütülür. Bu yönteme, çağrılan uzak yöntemin parametrelerini kapsüllemekle görevli bir GetAllClients örneği aktarılır. Burada herhangi bir parametre yoktur. Boş bir örnek oluşturulur. getAllClients yöntemi asenkron bir yöntemdir. Sunucu tarafından geri gönderilen veriler beklenmeden yürütme devam eder. Kullanıcı, özellikle görünümle etkileşime devam edebilir. Kullanıcının tetiklediği olaylar işlenmeye devam eder. init yöntemi sayesinde şunu biliyoruz:
    • Flex istemcisi müşteri listesini aldığında loadClientsCompleted yöntemi (26. satır) çalıştırılacaktır
    • loadClientsFault yöntemi (satır 31), istek bir hatayla sonuçlanırsa çalıştırılacaktır.
  • 28. satır: Müşteri listesi olaydan alınır. Uzak web hizmetinin getAllClients yönteminin bir liste döndürdüğü bilinmektedir. Bu liste, 11. satırdaki clients alanına yerleştirilir. Bir veri türü dönüştürme işlemi gereklidir. 43. satırdaki liste, müşteriler alanına bağlı (Bindable) olduğundan, verilerinde değişiklik olduğu bildirilir. Ardından müşteri listesini görüntüler. clients listesindeki her bir öğeyi displayClient yöntemi ile görüntüler (43. satır).
  • 36. satır: displayClient yöntemi, Client türünde bir parametre alır. Bu yöntem, liste tarafından bu müşteri için görüntülenmesi gereken karakter dizisini döndürmelidir. Burada soyadı ve adı (38. satır).
  • satır 31: Web hizmetine yapılan bir istek başarısız olduğunda yürütülen yöntemdir. FaultEvent türünde bir parametre alır. Bu sınıf, sunucu tarafından döndürülen hatayı kapsayan fault adlı bir alana sahiptir. fault.message ise hataya eşlik eden mesajdır.
  • 33. satır: Hata mesajı, bunun için ayrılmış metin kutusunda görüntülenir.

Uygulama derlendiğinde, yürütülebilir kodu Flex projesinin [bin-debug] klasöründe bulunur:

Yukarıda,

  • [rdvmedecins01.html] dosyası, Flex istemcisini almak için tarayıcının web sunucusundan isteyeceği HTML dosyasını temsil eder
  • [rdvmedecins01.swf] dosyası ise, tarayıcıya gönderilen HTML sayfasına kapsüllenecek ve ardından tarayıcının Flash Player eklentisi tarafından çalıştırılacak olan Flex istemcisinin ikili dosyasıdır.

Flex istemcisini çalıştırmaya hazırız. Öncelikle bunun için gerekli olan çalışma ortamını kurmamız gerekiyor. Test ettiğimiz istemci/sunucu mimarisine geri dönelim:

Sunucu tarafında:

  • SGBD ve MySQL'i başlatın
  • Glassfish sunucusunu başlatın
  • Henüz dağıtılmamışsa JEE randevu web hizmetini dağıtın
  • gerekirse, sunucu tarafında her şeyin yolunda olduğunu doğrulamak için önceki istemcilerden birini test edin.

İstemci tarafında:

Flex uygulamasının çağrılacağı Apache sunucusunu başlatın. Burada Wamp aracını kullanıyoruz. Bu araçla, Flex projesinin [bin-debug] klasörüne bir takma ad atayabiliriz.

  • Wamp simgesi ekranın alt kısmında yer alır [1]
  • Wamp simgesine sol tıklayarak Apache seçeneğini seçin [2] / Alias Directories [3, 4]
  • [5] seçeneğini seçin: Takma ad ekle
  • [6]'te, çalıştırılacak web uygulamasına bir takma ad (istediğiniz herhangi bir ad) verin
  • [7]'te bu takma adı taşıyacak web uygulamasının kök dizinini belirtin: bu, az önce oluşturduğumuz Flex projesinin [bin-debug] klasörüdür.

Flex projesinin [bin-debug] klasörünün yapısını hatırlayalım:

[rdvmedecins01.html] dosyası, Flex uygulamasının HTML dosyasıdır. Az önce [bin-debug] klasörü üzerinde oluşturduğumuz takma ad sayesinde, bu dosyaya [http://localhost/rdvmedecins/rdvmedecins01.html] URL’si üzerinden erişilebilir. Bu URL’yi, Flash Player 9 veya üstü sürümüne sahip bir tarayıcıda açıyoruz:

  • [1] (Flex uygulamasının URL'si)
  • [2] adresinde, müşteri listesini talep ediyoruz
  • [3], her şey yolunda gittiğinde elde edilen sonuç
  • [4], web hizmeti durdurulmuşken müşteri listesinin görüntülenmesini talep ettiğimizde elde edilen sonuç.

Alınan HTML sayfasının kaynak kodunu görüntülemek isteyebilirsiniz

<!-- url=(0014)about:internet adresinden kaydedildi -->
<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 Tarayıcı Geçmişi gerekli bölüm -->
<link rel="stylesheet" type="text/css" href="history/history.css" />
<!--   END Tarayıcı Geçmişi gerekli bölüm -->

<title></title>
<script src="AC_OETags.js" language="javascript"></script>
...
<script language="JavaScript" type="text/javascript">
<!--
// -----------------------------------------------------------------------------
// Küresel değişkenler
// Flash'ın ana sürümü gereklidir
var requiredMajorVersion = 9;
// Flash'ın alt sürümü gereklidir
var requiredMinorVersion = 0;
// Flash'ın alt sürümü gereklidir
var requiredRevision = 124;
// -----------------------------------------------------------------------------
// -->
</script>
</head>

<body scroll="no">
<script language="JavaScript" type="text/javascript">
<!--
// Player Ürün Kurulumunu başlatabilen Flash Player sürümü kontrolü (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>

Sayfanın gövdesi 39. satırda başlar. Klasik HTML içermez, bunun yerine "application/x-shockwave-flash" (60. satır) türünde bir nesne (47. satır) içerir. Bu, Flex projesinin [bin-debug] klasöründe görülebilen [rdvmedecins01.swf] dosyasıdır (54. satır). Bu dosya oldukça büyüktür: bu basit örnek için yaklaşık 600 K boyutundadır.

6.2. İkinci bir Flex istemcisi

İkinci Flex istemcisi, ilki için oluşturulan C proxy'sini kullanmayacaktır. Burada, bu adımın, burada anlatılacak adıma kıyasla avantajları olsa da zorunlu olmadığını göstermek istiyoruz.

Proje şu şekilde gelişiyor:

  • [1] yeni Flex uygulaması
  • [2]'e, ona ait yürütülebilir dosyalar
  • [3]: yeni görünüm; burada doktorların listesini görüntüleyeceğiz.

[rdvmedecins02.mxml] uygulamasının MXML kodu şu şekildedir:


<?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;
            
            // veriler
            [Bindable]
            private var medecins:ArrayCollection;
            
            private function loadMedecins():void{
                // doktor listesi isteniyor
                wsrdvmedecins.getAllMedecins.send();
            }
            
            private function loadMedecinsCompleted(event:ResultEvent):void{
                // doktorlar alınır
                medecins=event.result as ArrayCollection;
            }
            
            private function loadMedecinsFault(event:FaultEvent):void{
                // hata mesajı görüntüleniyor
                txtMsgErreur.text=event.fault.message;
            } 
            
            // bir doktorun bilgileri görüntüleniyor
            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>

Sadece yenilikler üzerinde duracağız:

  • 42 - 45. satırlar: yeni görünüm. Müşteriler yerine doktorları görüntülemek üzere uyarlanmış olması dışında, önceki görünümle aynıdır.
  • 35-41. satırlar: Web hizmeti burada <mx:WebService> etiketiyle tanımlanmıştır (35. satır). Önceki sürümde kullanılan C proxy'si burada artık kullanılmamaktadır.
  • 35. satır: id özniteliği, web hizmetine bir ad verir.
  • 36. satır: wsdl özniteliği, web hizmetinin WSDL dosyasının URI'sini belirtir. Bu, önceki istemci tarafından kullanılan ve 4.10.2 paragrafında tanımlanan URI ile aynıdır.
  • 37-40. satırlar: <mx:operation> etiketiyle uzaktaki web hizmetinin bir yöntemini tanımlar.
  • 37. satır: Referans verilen yöntem, name özniteliği ile tanımlanır. Burada, getAllMedecins uzaktaki yönteme referans veriyoruz.
  • satır 38: İşlemin başarılı olması durumunda (result özniteliği) ve başarısız olması durumunda (fault özniteliği) yürütülecek yöntemler tanımlanır.
  • 39. satır: <mx:request> etiketi, işlemin parametrelerini tanımlamak için kullanılır. Burada getAllMedecins uzaktan yöntemi herhangi bir parametre almadığından, hiçbir şey yazmıyoruz. param1 ve param2 gibi parametre kabul eden bir yöntem için ise şunu yazardık:
<mx:Request>
    <param1>{param1}</param1>
    <param1>{param1}</param1>
</mx:Request>

burada param1 ve param2, <mx:Script> etiketinde tanımlanmış ve başlatılmış değişkenlerdir

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

<mx:Script> etiketinde, önceki istemcide incelenen kodla benzer bir ActionScript kodu bulunur. Sadece 13-16. satırlardaki loadMedecins yöntemi farklıdır. Farklılık, uzaktaki [getAllMedecins] yönteminin çağrılma biçimindedir:

  • 15. satır: 35. satırda tanımlanan [wsrdvmedecins] web hizmeti ve 37. satırda tanımlanan [getAllMedecins] işlemi kullanılır. Bu işlemi yürütmek için send yöntemi kullanılır. Bu yöntem, 35. satırda tanımlanan web hizmetinin getAllMedecins yöntemine yönelik asenkron çağrıyı başlatır. send yöntemi, 39. satırdaki <mx:request> etiketiyle tanımlanan parametrelerle çağrıyı gerçekleştirecektir. Burada herhangi bir parametre yoktur. Yöntemin param1 ve param2 parametreleri olsaydı, loadMedecins komut dosyası, send yöntemini çağırmadan önce bu parametrelere değerler atardı.

Artık bu yeni uygulamayı test etmemiz gerekiyor: