0.       Introducere. 8

1.       Resurse Internet: specificare, reprezentare, transfer. 12

1.1.         Specificarea de resurse Internet: URI, URN, URL. 12

1.2.         Reprezentarea resurselor. 15

1.2.1.      HTML, XHTML. 15

1.2.1.1.     Un exemplu XHTML.. 16

1.2.1.2.     HTML versus XHTML; studio pe un exemplu. 18

1.2.1.3.     Utilizarea în exemplu a unui CSS. 18

1.2.1.4.     Utilizarea JavaScript în exemplu. 19

1.2.2.      XML. 19

1.2.2.1.     Un exemplu de document XML.. 20

1.2.2.2.     Prezentare generală XML.. 21

1.2.2.3.     Definirea sintaxei prin DTD.. 23

1.2.2.4.     Specificarea sintaxei prin XML Schema. 25

1.2.2.5.     Transformarea documentelor XML: XSL şi XSLT. 27

1.2.2.6.     Parsarea documentelor XML: SAX, DOM... 29

1.2.2.7.     Exemple de parsări XML folosind SAX.. 30

1.2.2.8.     Exemple de parsări XML folosind DOM... 33

1.2.3.      JSON.. 36

1.2.3.1.     Un exemplu de document JSON.. 36

1.2.3.2.     Prezentarea generală JSON.. 37

1.2.3.3.     Prelucrarea documentelor JSON.. 40

1.3.         Transportul resurselor; protocolul HTTP. 43

1.3.1.      Contextul unei tranzacţii HTTP. 43

1.3.2.      Structura unei tranzacţii HTTP. 44

1.3.2.1.     Formatul cererii şi al răspunsului 44

1.3.2.2.     Prima linie a unui mesaj HTTP; coduri de răspuns HTTP. 46

1.3.2.3.     Principalele headere HTTP. 47

1.3.2.4.     Codificarea corpului unui mesaj HTTP; MIME types. 48

1.3.3.      Metode de solicitare a unei cereri HTTP. 49

1.3.3.1.     Descrierea metodelor 50

1.3.3.2.     Particularităţi privind implementarea metodelor 51

2.       Programarea aplicaţiilor Web. 53

2.1.         Principalele componente arhitecturale Web. 53

2.1.1.      Proxy HTTP. 53

2.1.2.      Cache HTTP. 53

2.1.3.      Gateway Web. 54

2.1.4.      Tunnel 54

2.1.5.      Robot Web (crawler, agent, spider) 55

2.2.         Arhitectura generală a unei aplicaţii Web. 56

2.3.         Accese clienţi 57

2.3.1.      Acces la resurse Web prin browser 57

2.3.2.      Acces la resurse Web de către procese. 58

2.3.2.1.     Exemplu suport de aplicaţie Web. 58

2.3.2.2.     De la interceptare socket la cURL şi libURL.. 59

2.3.2.3.     Clienţi web în Python ce utilizează httplib. 64

2.3.2.4.     Clienţi web în Java ce utilizează HttpURLConnection şi URLConnection. 65

2.3.2.5.     Clienţi web în C# ce utilizează WebRequest şi WebResponse. 66

2.3.2.6.     Clienţi web în PHP ce utilizează cURL.. 67

2.3.3.      AJAX (Asinchronous JavaScript And XML) 69

2.3.3.1.     Modelul AJAX.. 70

2.3.3.2.     XMLHttpRequest: obţinere obiect, metode, proprietăţi, tratare răspuns. 72

2.3.3.3.     Scenariul unei tranzacţii AJAX.. 74

2.3.3.4.     Exemplu AJAX: manipulare de stringuri 75

2.3.3.5.     Exemplu AJAX: răspuns XML.. 77

2.3.3.6.     Exemplu AJAX: aplicaţia support ExecAjax. 79

2.4.         Extensii middleware ale părţii server. 81

2.4.1.      CGI – Common Gateway Interface. 82

2.4.1.1.     Standardul CGI. 82

2.4.1.2.     CGI implementat în C.. 84

2.4.1.3.     CGI implementat în Python. 85

2.4.1.4.     Servlet – o alternativă Java la CGI. 86

2.4.2.      SSP – Scripting Server Pages. 91

2.4.2.1.     Cadrul de utilizare a SSP. 91

2.4.2.2.     Utilizarea ASP.NET. 92

2.4.2.3.     Utilizarea JSP. 94

2.4.2.4.     Utilizarea PHP. 95

2.4.2.5.     Utilizarea PSP. 97

3.       Tehnologii middleware şi servicii web. 99

3.1.         Tehnologii middleware; apelul procedurilor la distanţă.. 99

3.1.1.      Problematica middleware. 99

3.1.2.      Un exemplu suport de serviciu: Exec___. 101

3.1.2.1.     Metodele serviciului 101

3.1.2.2.     Bibliotecile serviciului 101

3.1.3.      Apelul procedurilor la distanţă. 103

3.1.3.1.     Implementarea ONC-RPC.. 104

3.1.3.2.     Filtre XDR.. 105

3.1.3.3.     ONC-RPC sub Windows. 106

3.1.3.4.     ONC-RPC high-level 107

3.1.3.5.     Implementarea Exec în ONC-RPC high-level 109

3.1.4.      Java RMI şi RMI-IIOP. 111

3.1.4.1.     Prezentare generală RMI. 111

3.1.4.2.     Implementare Exec prin RMI- JRMP. 113

3.1.4.3.     Implementare Exec prin RMI-IIOP. 114

3.1.5.      CORBA.. 117

3.1.5.1.     Prezentare generală CORBA.. 117

3.1.5.2.     Implementarea CORBA pentru Exec prin Java IDL.. 119

3.1.5.3.     Interoperabilitatea RmiIiop - CORBA.. 123

3.1.6.      Tehnologia Pyro – PYthon Remote Objects. 123

3.1.6.1.     Prezentare generală Pyro. 123

3.1.6.2.     Scenariul utilizării Pyro; implementarea Exec. 124

3.1.7.      Hessian – protocol binar pentru servicii web simple. 126

3.1.7.1.     Scurtă prezentare a protocolului Hessian. 126

3.1.7.2.     Implementare serviciu Exec folosind Hessian4J. 127

3.1.7.3.     Implementare în Java a unui client Hessian Exec. 128

3.1.7.4.     Implementare în Python a unui client Hessian Exec. 129

3.1.7.5.     Implementare în PHP a unui client Hessian Exec. 130

3.1.8.      Java Message Services (JMS) 131

3.1.8.1.     Arhitectura unei aplicaţii JMS. 131

3.1.8.2.     Modelul de programare al JMS. 133

3.1.8.3.     Implementarea Exec___ prin JMS folosind ActiveMQ.. 134

3.1.8.4.     Utilizarea de clienţi non Java pentru JMS. 138

3.2.         Ce este un serviciu web?. 139

3.2.1.      Componentele unui serviciu web. 140

3.2.2.      Cum lucrează un serviciu web? Stiva de protocoale. 141

3.2.3.      Tipuri de servicii web; evoluţie, clasificări, caracteristici 143

3.3.         Trei exemple de clienţi ai unor servicii web existente. 145

3.3.1.      Client pentru date terestre. 145

3.3.2.      Client de căutare pe google. 147

3.3.3.      Client pentru UsersGateway într-o reţea academică. 149

4.       Servicii web de tip XML-RPC. 154

4.1.         XML-RPC comparat cu alte paradigme de apel la distanţă.. 154

4.2.         Protocolul XML-RPC. 155

4.2.1.      Scenariul de derulare a protocolului 155

4.2.2.      Tipuri de date. 156

4.2.2.1.     Tipuri de date simple. 156

4.2.2.2.     Tipuri de date compuse. 158

4.2.3.      Formatul cererii 160

4.2.4.      Formatul răspunsului 161

4.3.         Implementări de servicii şi clienţi de tip XML-RPC. 162

4.3.1.      Implementarea XML-RPC în C#. 162

4.3.1.1.     Distribuţii C# care implementează XML-RPC.. 162

4.3.1.2.     Implementarea în C# a serviciului web Exec__ de tip XML-RPC.. 163

4.3.1.3.     Implementarea în C# a unui client Exec__ de tip XML-RPC.. 164

4.3.2.      Implementarea XML-RPC în Java. 166

4.3.2.1.     Distribuţii Java care implementează XML-RPC.. 166

4.3.2.2.     Implementarea în Java a serviciului web Exec__ de tip XML-RPC.. 167

4.3.2.3.     Implementarea în Java a unui client Exec__ de tip XML-RPC.. 168

4.3.3.      Implementarea XML-RPC în PHP. 170

4.3.3.1.     Distribuţii PHP care implementează XML-RPC.. 170

4.3.3.2.     Implementarea în PHP a serviciului web Exec__ de tip XML-RPC.. 171

4.3.3.3.     Implementarea în PHP a unui client Exec__ de tip XML-RPC.. 173

4.3.4.      Implementarea XML-RPC în Python. 174

4.3.4.1.     Distribuţii Python care implementează XML-RPC.. 174

4.3.4.2.     Implementarea în Python a serviciului web Exec__ de tip XML-RPC.. 175

4.3.4.3.     Implementarea în Python a unui client Exec__ de tip XML-RPC.. 175

4.4.         Interoperabilitate. 176

5.       Servicii web de tipul SOAP. 179

5.1.         Prezentarea generală a tipului de serviciu web SOAP. 179

5.1.1.      Scenariul unui apel de serviciu web tip SOAP. 179

5.1.2.      Arhitectura serviciului web. 180

5.1.3.      Precizări privind arhitectura unei aplicaţii. 181

5.2.         Scurte prezentări SOAP, WSDL, UDDI 182

5.2.1.      Scurtă prezentare SOAP. 183

5.2.1.1.     SOAP – istoric şi evoluţie. 183

5.2.1.2.     Structura unui mesaj SOAP şi principalele elemente. 184

5.2.1.3.     Tipurile de date SOAP. 186

5.2.1.4.     Transportul SOAP prin HTTP. 187

5.2.2.      Scurtă prezentare WSDL. 188

5.2.2.1.     WSDL – istoric şi evoluţie. 188

5.2.2.2.     Structura unui document WSDL.. 188

5.2.2.3.     Un exemplu de WSDL.. 191

5.2.3.      Scurtă prezentare UDDI 193

5.2.3.1.     UDDI – istoric şi evoluţie. 193

5.2.3.2.     Modelul de date UDDI. 194

5.2.4.      Triada fundamentală pentru servicii web de tip SOAP. 196

5.3.         Implementări de servicii şi clienţi SOAP. 197

5.3.1.      Implementare serviciu web tip SOAP pe o platformă .NET. 198

5.3.1.1.     Distribuţia de suport pentru servicii web în C#. 198

5.3.1.2.     Implementarea în C# a serviciului Exec__ de tip SOAP. 198

5.3.1.3.     Implementarea în C# a unui client Exec__ de tip SOAP. 199

5.3.2.      Implementare serviciu web tip SOAP în Java. 200

5.3.2.1.     Distribuţia de suport pentru servicii web în Java. 200

5.3.2.2.     Implementarea în Java a serviciului Exec__ de tip SOAP. 201

5.3.2.3.     Implementarea în Java a unui client Exec__ de tip SOAP. 203

5.3.3.      Implementare serviciu web tip SOAP în PHP. 205

5.3.3.1.     Distribuţia de suport pentru servicii web în PHP. 205

5.3.3.2.     Implementarea în PHP a serviciului Exec__ de tip SOAP. 206

5.3.3.3.     Implementarea în PHP a unui client Exec__ de tip SOAP. 207

5.3.4.      Implementare serviciu web tip SOAP în Python. 208

5.3.4.1.     Distribuţia de suport pentru servicii web în Python. 208

5.3.4.2.     Implementarea în Python a serviciului Exec__ de tip SOAP. 209

5.3.4.3.     Implementarea în Python a unui client Exec__ de tip SOAP. 210

5.4.         Alte implementări de clienţi Exec__. 211

5.4.1.      Alte implementări de clienţi Exec__ în C#. 211

5.4.2.      Alte implementări de clienţi Exec__ în Java. 213

5.4.3.      Alte implementări de clienţi Exec__ în PHP. 215

5.5.         Interoperabilitate. 218

6.       Servicii web de tip RESTful. 224

6.1.         Prezentare generală a conceptului RESTful. 224

6.1.1.      Principiile RESTful 224

6.1.2.      Triada fundamentală pentru servicii web RESTful 226

6.1.3.      Exemple de proiectare RESTful pentru servicii web. 226

6.1.3.1.     Sistem de rezervare a locurilor 226

6.1.3.2.     Comandarea electronică de produse. 228

6.2.         Implementări de servicii şi clienţi RESTful. 231

6.2.1.      Proiectarea serviciului Exec__ ca serviciu REST şi a unui client 231

6.2.2.      Implementare Exec__ în C#. 232

6.2.2.1.     Implementare serviciu Exec__ REST în C#. 232

6.2.2.2.     Implementare client Exec__ REST în C#. 234

6.2.3.      Implementare Exec__ în Java. 236

6.2.3.1.     Dezvoltarea unui serviciu folosind distribuţia RESTeasy. 236

6.2.3.2.     Implementare serviciu Exec__ REST în Java. 241

6.2.3.3.     Implementare client Exec__ REST în Java. 244

6.2.4.      Implementare Exec__ în PHP. 246

6.2.4.1.     Distribuţii PHP_REST; pachetele Da Silva. 246

6.2.4.2.     Implementare serviciu Exec__ REST în PHP. 247

6.2.4.3.     Implementare client Exec__ REST în PHP. 249

6.2.5.      Implementare Exec__ în Python. 250

6.2.5.1.     Implementare serviciu Exec__ REST în Python. 250

6.2.5.2.     Implementare client Exec__ REST în Python. 252

6.3.         Interoperabilitate. 253

7.       Aplicaţii cu servicii web. 256

7.1.         Implementarea serviciului UsersGateway. 256

7.1.1.      Unde este util UsersGateway?. 256

7.1.2.      Rutine de autentificare. 257

7.1.2.1.     Autentificare specifică platformelor Unix. 257

7.1.2.2.     Autentificare prin FTP sau POP3. 259

7.1.2.3.     Autentificare folosind LDAP. 262

7.1.3.      Sursele serviciului UsersGateway. 263

7.1.3.1.     Clasa principală a serviciului: UsersGateway. 263

7.1.3.2.     Clasele User şi ParametriUG.. 265

7.1.3.3.     Clasele Mail şi MailThread. 272

7.1.4.      Configurarea şi punerea în lucru a serviciului UsersGateway. 275

7.2.         Evaluări de expresii aritmetice folosind mai multe servicii 276

7.2.1.      Descrierea serviciilor; metodele exportate de către acestea. 276

7.2.2.      Bibliotecile care implementează metodele serviciului 278

7.2.3.      Implementarea serviciilor de tip RESTful 289

7.2.3.1.     Implementarea serviciului ServiceRs.cs. 290

7.2.3.2.     Implementarea serviciului ServiceRj.java. 291

7.2.3.3.     Implementarea serviciului ServiceRh.php. 292

7.2.3.4.     Implementarea serviciului ServiceRy.py. 294

7.2.4.      Implementarea serviciilor de tip SOAP. 295

7.2.4.1.     Implementarea serviciului ServiceSs.cs. 295

7.2.4.2.     Implementarea serviciului ServiceSj.java. 295

7.2.4.3.     Implementarea serviciului ServiceSh.php. 297

7.2.4.4.     Implementarea serviciului ServiceSy.py. 298

7.2.5.      Implementarea serviciilor de tip XML-RPC. 299

7.2.5.1.     Implementarea serviciului ServiceXs.cs. 299

7.2.5.2.     Implementarea serviciului ServiceXj.java. 300

7.2.5.3.     Implementarea serviciului ServiceXh.php. 301

7.2.5.4.     Implementarea serviciului ServiceXy.py. 302

7.2.6.      Un client Python ce apelează aleator mai multe servicii 303

7.2.6.1.     Obiectul proxy RyC pentru serviciile de tip RESTful 304

7.2.6.2.     Obiectul proxy SyC pentru serviciile de tip SOAP. 304

7.2.6.3.     Obiectul proxy XyC pentru serviciile de tip XML-RPC.. 305

7.2.6.4.     Un client evaluator de expresii ce foloseşte mai multe servicii 306

8.       O propunere de uniformizare. 312

8.1.         De ce uniformizare şi automatizare a unor acţiuni?. 312

8.2.         WSWrapper - o propunere de abordare a uniformizării 313

8.3.         Exemple de specificări WSWrapper pentru Exec. 316

8.4.         Câteva consideraţii privind implementarea WSWrapper. 317

9.       Lista de figuri 320

10.     Lista de surse. 322

11.     Bibliografie. 326

 


 

0.  Introducere

 

Fenomenul web este astăzi în prezent parte integrantă din infrastructura socială mondială. Practic nici o organizaţie, societate comercială, instituţie etc. nu există cu adevărat decât dacă este prezentă şi pe reţeaua web. Cu numai câţiva ani în urmă prezenţa însemna doar existenţa unui site web (pagină web) mai simplu sau mai complex care putea fi doar consultat de către clienţi prin intermediul unui browser. La această oră cerinţele sunt de interacţiune peste web. Asta înseamnă că site-ul nu mai este doar o sursă de informaţii, ci permite consultantului – client uman sau proces client – să trimită informaţii spre site, acesta să le prelucreze şi să dea un răspuns, după care clientul să trimită iarăşi date ş.a.m.d.

 

Foarte multe persoane individuale îşi formează sau se ataşează la cercuri de "prieteni virtuali" prin intermediul unor servicii oferite pe web, cum ar fi facebook sau twitter [117], beneficiind astfel de o modalitate alternativă de de socializare (pentru unii fiind chiar singura!). Tot mai multe persoane se fac cunoscute prin intermediul paginilor web personale. Persoane cu mai multe sau mai puţine veleităţi de scriitor şi care doresc să se exprime public fără restricţii (şi fără costuri), apelează la crearea şi întreţinerea propriilor pagini blog [121], în care îşi exprimă opiniile şi la care receptează păreri critice de la diverşi cititori.

 

Toate facilităţile de interacţiune peste web descrise mai sus, şi încă multe altele, presupun existenţa unor programe specializate de procesare, aflate "în spatele" interfeţelor grafice la care operează difuzorii de informaţii. La momentul actual piaţa cere elaborarea de noi şi noi aplicaţii peste Web. Pentru creşterea calităţii acestor aplicaţii se impune respectarea unor metodologii de elaborare şi utilizarea unor concepte standard, indiferent de limbajul de programare în care se implementează. Mai mult, se impune satisfacerea unor cerinţe de interoperabilitate, adică implementarea proceselor partenere la dialogul peste web să nu fie dependentă de limbajul de programare în care se codifică programele, nici de platforma pe care rulează aceste procese. Sau mai simplu spus, dacă avem două procese care rulează pe două calculatoare diferite, chiar de tipuri diferite, ele să poată comunica între ele peste web chiar dacă au fost implementate în limbaje de programare diferite.

 

Dificultăţile de interoperabilitate sunt binecunoscute şi sunt legate în principal de reprezentarea diferită a datelor pe diverse platforme şi în diferite limbaje. Să amintim doar un exemplu simplu care conduce la dificultăţi din cauza reprezentării diferite a datelor. Pe o maşină Windows de versiune mai veche numerele întregi se reprezintă pe doi octeţi în ordinea little endian a octeţilor. Pe o maşină Unix, întregii se reprezintă pe patru octeţi în ordinea big-endian. Dacă Windows trimite un întreg cu valoarea 1 şi apoi unul cu valoarea 2 spre Unix, acesta va putea citi numai primul număr şi va obţine pentru el valoarea 16777216! Vezi lucrarea [7] pentru detalii şi exemple suplimentare. Desigur, tehnologiile middleware [39] au instrumente de rezolvare a acestor dificultăţi, dar ele nu sunt chiar la îndemâna masei largi de utilizatori. Designerii şi implementatorii de astfel de aplicaţii sunt cei care trebuie să ştie să le utilizeze.

 

Comunicarea peste web între procese ridică şi ea probleme. Acest gen de comunicare, după cum se ştie, se face prin socket. Fiecare proces partener aşteaptă mesaje la un anumit port. Dacă procesele partenere nu se află în aceeaşi reţea locală (LAN), atunci este foarte posibil că între reţelele locale ale celor doi parteneri să fie operaţionale procese / echipamente firewall. Ca regulă cvasi-unanim acceptată, firewall-urile acceptă mesaje doar pentru porturile 80 şi 443, respectiv cele de comunicare web respectiv web securizat. Asta înseamnă că tot ce se comunică trebuie să aibă numai suport web.

 

Acestui gen de programe îi este destinată lucrarea de faţă: programe care să comunice peste web cu respectarea interoperabilităţii. Paradigma servicii web presupune existenţa unui serviciu care oferă o serie de funcţionalităţi care pot fi apelate, peste web, de către programe client la fel cum un program apelator apelează un subprogram. Conceptul de serviciu web a apărut în ultimii zece ani. In prezent sunt cunoscute trei modele (tipuri) de servicii web:

 

Pentru a demonstra funcţionalităţile, lucrarea de faţă prezintă elementele strict necesare de natură teoretică, conceptuală şi metodologică. Fiecare astfel de prezentare este exemplificată printr-o serie de exemple, elaborate în următoarele patru limbaje de programare: C#, Java, PHP şi Python. Pe lângă acestea, în lucrare mai apar exemple scrise în C, C++, JavaScript, Shell script Unix, fişiere bat Windows etc.

 

Lucrarea este structurată pe opt capitole. Capitolul 1 se ocupă de fundamentele comunicării web. Este vorba de resursele Internet, specificarea lor prin URI (URN, URL) şi reprezentarea lor folosind HTML, XML, JSON. Capitolul se încheie cu descrierea protocolului HTTP, care este instrumentul esenţial în transportul peste web al resurselor, între procesele protagoniste. Capitolul 2 se ocupă de programarea aplicaţiilor web clasice. Sunt prezentate diferite tipuri de clienţi web care accesează resurse, începând cu accesul direct prin socket până la utilizarea bibliotecilor cURL şi AJAX. Pentru partea de server se prezintă standardul CGI ca element fundamental de interacţiune pe partea de server. Odată cu acesta sunt prezentate şi alte instrumente suplimentare cum ar fi interpretorul PHP, servleturile şi paginile de scripting ASP.NET, JSP, PHP şi PSP.

 

Capitolul 3 prezintă câteva tehnologii care fac trecerea de la paradigmele middleware clasice la serviciile web. Este vorba de apelul procedurilor la distanţă (RPC, Hessian), apelul obiectelor la distanţă (RMI, Pyro, CORBA), apeluri prin mesaje (JMS). Se prezintă conceptul de serviciu web şi se dau câteva esemple de clienţi ai unor servicii web existente în spaţiul Internet.

 

Urmăroarele trei capitole se ocupă, fiecare, de câte un tip de serviciu web: XML-RPC, SOAP, REST. In prima parte a fiecăruia sunt prezentate conceptele care stau la baza modelului de serviciu respectiv: arhitectura, tipurile de date, principiile de bază, problematica implementării serviciului şi a implementării clienţilor. Partea a doua are la rândul ei câte patru secţiuni rezervate implementărilor în cele patru limbaje. Fiecare din capitole se încheie cu o discuţie asupra interoperabilităţii.

 

Capitolul 7 prezintă complet două aplicaţii. Prima este una de extindere a gestiunii utilizatorilor dintr-o reţea. A doua este un evaluator de expresii aritmetice implementat "identic" (ca şi funcţionalităţi) în 12 servicii (trei tipuri de servicii, fiecare implementat în câte patru limbaje). Un client unic selectează aleator câte un serviciu din cele 12 pentru a executa câte o operaţie elementară necesară în evaluarea expresiei.

 

Capitolul 8 constă într-o propunere de uniformizare a definirii şi implementării serviciilor web

 

Nivelul, modul de prezentare, bogăţia de exemple complete şi cantitatea de informaţie prezentată sunt astfel concepute, încât cititorul să poată elabora, numai pe baza lor, servicii web şi clienţi ai acestora oricât de complecşi.

 

Fiecare concept / componentă se prezintă mai întâi ca entitate de sine stătătoare, izolată de restul contextului. După evidenţierea proprietăţilor esenţiale ale lui, se abordează interacţiunile lui cu alte concepte sau componente. Acest mod de abordare ni se pare, din punct de vedere metodic, cel mai potrivit şi mai uşor asimilabil, atât de către începători în domeniu cât şi de utilizatori mai avansaţi sau foarte avansaţi. In susţinerea acestui punct de vedere venim cu un exemplu. Pentru dezvoltarea de aplicaţii web clasice bazate pe PHP este nevoie de un server web cum ar fi Apache [35, 95, 120] sau IIS [58, 28], un interpretor PHP [147, 153] şi eventual un sistem de gestiune a bazelor de date MySql [137], Microsoft Sqlserver [135], Oracle [139], PosgreSQL [140] etc. Dezvoltarea de aplicaţii cu acestea trebuie precedată de înţelegerea separată a funcţionalităţilor fiecărui tip de componente şi abia apoi trebuie tratată interacţiunea dintre ele. Există însă posibilitatea de a utiliza o distribuţie XAMPP [120], extrem de simplă de instalat şi care pune la dispoziţia utilizatorului un server web Apache, un interpretor PHP şi un SGBD MySql. Foarte bine şi foarrte productiv din punct de vedere al industriei software. In schimb, există pericolul ca mulţi useri să vadă XAMPP ca un tot unitar, fără a diferenţia prea mult cele trei componente participante! Practica cu studenţii ne-a reliefat aceste aspecte. Dacă începătorul foloseşte direct XAMPP, atunci va fi foarte greu pentru el să înţeleagă în ce constă conexiunea la un server web, respectiv la o bază de date alta decât MySql! Mai mult, conectarea interpretorului PHP la un alt tip de server web sau la un alt tip de bază de date, devine o problemă extrem de dificilă! Repetăm, totuşi XAMPP este o componentă foarte utilă, dar pentru începători există riscul de a nu înţelege complet rolurile componentelor participante şi mai ales interacţiunile dintre ele.

 

In aceeaşi ordine de idei, pentru implementarea exemplelor noastre nu am folosit medii de dezvoltare - IDE –Integrated development Environment, ci am preferat, pe cât posibil să lucrăm direct în linia de comandă. Să ne explicăm. In industria software, dar nu numai, sunt extrem de folosite aceste IDE mai ales pentru dezvoltarea de proiecte mari. De exemplu, sunt mult folosite mediile Eclipse [126], Netbeans [103] pentru Java, IDEA [134], mediul Visual Studio [102] pentru C C# C++, mediul DevPHP [75] sau unele medii Java pentru PHP, Pyscripter [73] sau unele medii Java pentru Python. Fiecare dintre acestea asigură o mare productivitate în dezvoltarea de aplicaţii, deoarece îl scuteşte pe dezvoltator de conectarea diverselor resurse la proiectul lui. Ok, toate bune şi frumoase, dar dacă dezvoltatorul nu a făcut în viaţa lui o conexiune de resursă la un proiect, este greu de crezut că va fi în măsură să îşi întreţină proiectul fără mediul lui preferat de dezvoltare! De aceea noi folosim doar linia de comandă, eventual fişiere de comenzi shell sau bat, eventual utilitarul ant [37, 69]. Din aceleaşi motive de operare simplificată, am folosit, pentru programele C şi C++ sub Windows, produsul open source mingw [136] în loc de mediul standard Visual Studio.

 

In exemple s-a pus accentul în primul rând pe aspectele de conectivitate şi pe schimbul de informaţii dintre procesele protagoniste, reducând la minimum elementele de business specific al metodelor exportate şi a clienţilor. In acelaşi spirit, am încercat să implementăm acelaşi exemplu pe mai multe platforme şi în mai multe limbaje de programare. Se oferă astfel posibilitatea cititorului să compare (cu instrumente specifice de comparare a fişierelor text) fişierele sursă similare din diverse implementări, putând să vadă mai uşor asemănările şi deosebirile.

 

Codurile sursă, programele sau fragmentele de program sunt numerotate separat în cadrul fiecărui capitol, sub forma: Sursa c.n. Intr-o anexă este prezentată lista acestor programe. Elementele grafice care însoţesc prezentarea textului sunt numerotate în cadrul fiecărui capitol, începând de la 1, sub forma: Figura c.n. Este anexată şi o listă a acestor figuri.

 

Toate sursele prezentate în lucrare pot fi downloadate de către cititor de la adresa:

 

http://www.cs.ubbcluj.ro/~florin/books/SWMPA

 

La aceeaşi adresă pot fi găsite şi alte exemple, diverse documentaţii suplimentare, arhivele cu distribuţiile open-source ale tehnologiilor utilizate etc. Tot aici se vor găsi ultimele versiuni ale implementărilor, rezolvarea anumitor anomalii sau (inerente) buguri etc.

 

Lucrarea se adresează în primul rând informaticienilor: studenţi, programatori şi designeri web, project manageri etc. Este de asemenea utilă tuturor celor care vor să se autoinstruiască în elaborarea de aplicaţii distribuite folosind tehnologii middleware sau servicii web.

 

Autorul mulţumeşte tuturor celor care i-au sprijinit într-un fel sau altul la elaborarea prezentei lucrări: colegi şi studenţi. Este de asemenea recunoscător tuturor cititorilor care vor adresa sugestii, observaţii sau întrebări legate de lucrare, la adresa: florin@cs.ubbcluj.ro,

 

Cluj-Napoca, decembrie 2010                                    Autorul