1. Resurse Internet: specificare,
reprezentare, transfer
1.1. Specificarea de resurse Internet: URI, URN, URL
1.2.1.2. HTML versus XHTML;
studio pe un exemplu
1.2.1.3. Utilizarea în exemplu a
unui CSS
1.2.1.4. Utilizarea JavaScript în
exemplu
1.2.2.1. Un exemplu de document
XML
1.2.2.2. Prezentare generală
XML
1.2.2.3. Definirea sintaxei prin
DTD
1.2.2.4. Specificarea sintaxei
prin XML Schema
1.2.2.5. Transformarea
documentelor XML: XSL şi XSLT
1.2.2.6. Parsarea documentelor
XML: SAX, DOM
1.2.2.7. Exemple de parsări
XML folosind SAX
1.2.2.8. Exemple de parsări
XML folosind DOM
1.2.3.1. Un exemplu de document
JSON
1.2.3.2. Prezentarea
generală JSON
1.2.3.3. Prelucrarea documentelor
JSON
1.3. Transportul
resurselor; protocolul HTTP
1.3.1. Contextul unei tranzacţii HTTP
1.3.2. Structura unei tranzacţii HTTP
1.3.2.1. Formatul cererii şi
al răspunsului
1.3.2.2. Prima linie a unui mesaj
HTTP; coduri de răspuns HTTP
1.3.2.3. Principalele headere
HTTP
1.3.2.4. Codificarea corpului
unui mesaj HTTP; MIME types
1.3.3. Metode de solicitare a unei cereri
HTTP
1.3.3.2. Particularităţi
privind implementarea metodelor
2. Programarea aplicaţiilor Web
2.1. Principalele
componente arhitecturale Web
2.1.5. Robot Web (crawler, agent, spider)
2.2. Arhitectura
generală a unei aplicaţii Web
2.3.1. Acces la resurse Web prin browser
2.3.2. Acces la resurse Web de către
procese
2.3.2.1. Exemplu suport de
aplicaţie Web
2.3.2.2. De la interceptare
socket la cURL şi libURL
2.3.2.3. Clienţi web în
Python ce utilizează httplib
2.3.2.4. Clienţi web în Java
ce utilizează HttpURLConnection şi URLConnection
2.3.2.5. Clienţi web în C#
ce utilizează WebRequest şi WebResponse
2.3.2.6. Clienţi web în PHP
ce utilizează cURL
2.3.3. AJAX (Asinchronous JavaScript And
XML)
2.3.3.2. XMLHttpRequest:
obţinere obiect, metode, proprietăţi, tratare răspuns
2.3.3.3. Scenariul unei
tranzacţii AJAX
2.3.3.4. Exemplu AJAX: manipulare
de stringuri
2.3.3.5. Exemplu AJAX:
răspuns XML
2.3.3.6. Exemplu AJAX:
aplicaţia support ExecAjax
2.4. Extensii
middleware ale părţii server.
2.4.1. CGI – Common Gateway Interface
2.4.1.3. CGI implementat în
Python
2.4.1.4. Servlet – o
alternativă Java la CGI
2.4.2. SSP – Scripting Server Pages
2.4.2.1. Cadrul de utilizare a
SSP
3. Tehnologii middleware şi
servicii web
3.1. Tehnologii
middleware; apelul procedurilor la distanţă
3.1.1. Problematica middleware
3.1.2. Un exemplu suport de serviciu:
Exec___
3.1.2.2. Bibliotecile serviciului
3.1.3. Apelul
procedurilor la distanţă
3.1.3.1. Implementarea ONC-RPC
3.1.3.5. Implementarea Exec în ONC-RPC
high-level
3.1.4.1. Prezentare generală
RMI
3.1.4.2. Implementare Exec prin
RMI- JRMP
3.1.4.3. Implementare Exec prin
RMI-IIOP
3.1.5.1. Prezentare generală
CORBA
3.1.5.2. Implementarea CORBA
pentru Exec prin Java IDL
3.1.5.3. Interoperabilitatea
RmiIiop - CORBA
3.1.6. Tehnologia Pyro – PYthon Remote
Objects
3.1.6.1. Prezentare generală
Pyro
3.1.6.2. Scenariul
utilizării Pyro; implementarea Exec
3.1.7. Hessian – protocol binar pentru
servicii web simple
3.1.7.1. Scurtă prezentare a
protocolului Hessian
3.1.7.2. Implementare serviciu
Exec folosind Hessian4J
3.1.7.3. Implementare în Java a
unui client Hessian Exec
3.1.7.4. Implementare în Python a
unui client Hessian Exec
3.1.7.5. Implementare în PHP a
unui client Hessian Exec
3.1.8. Java Message Services (JMS)
3.1.8.1. Arhitectura unei aplicaţii
JMS
3.1.8.2. Modelul de programare al
JMS
3.1.8.3. Implementarea Exec___
prin JMS folosind ActiveMQ
3.1.8.4. Utilizarea de
clienţi non Java pentru JMS
3.2.1. Componentele
unui serviciu web
3.2.2. Cum
lucrează un serviciu web? Stiva de protocoale
3.2.3. Tipuri de servicii web;
evoluţie, clasificări, caracteristici
3.3. Trei
exemple de clienţi ai unor servicii web existente
3.3.1. Client pentru date terestre
3.3.2. Client de căutare pe google
3.3.3. Client pentru UsersGateway într-o
reţea academică
4. Servicii web de tip XML-RPC
4.1. XML-RPC
comparat cu alte paradigme de apel la distanţă
4.2.1. Scenariul de derulare a
protocolului
4.2.2.1. Tipuri de date simple
4.2.2.2. Tipuri de date compuse
4.3. Implementări
de servicii şi clienţi de tip XML-RPC
4.3.1. Implementarea XML-RPC în C#
4.3.1.1. Distribuţii C# care
implementează XML-RPC
4.3.1.2. Implementarea în C# a
serviciului web Exec__ de tip XML-RPC..
4.3.1.3. Implementarea în C# a
unui client Exec__ de tip XML-RPC
4.3.2. Implementarea XML-RPC în Java
4.3.2.1. Distribuţii Java
care implementează XML-RPC
4.3.2.2. Implementarea în Java a
serviciului web Exec__ de tip XML-RPC..
4.3.2.3. Implementarea în Java a
unui client Exec__ de tip XML-RPC
4.3.3. Implementarea XML-RPC în PHP
4.3.3.1. Distribuţii PHP
care implementează XML-RPC
4.3.3.2. Implementarea în PHP a
serviciului web Exec__ de tip XML-RPC..
4.3.3.3. Implementarea în PHP a
unui client Exec__ de tip XML-RPC
4.3.4. Implementarea XML-RPC în Python
4.3.4.1. Distribuţii Python
care implementează XML-RPC
4.3.4.2. Implementarea în Python
a serviciului web Exec__ de tip XML-RPC
4.3.4.3. Implementarea în Python
a unui client Exec__ de tip XML-RPC
5.1. Prezentarea
generală a tipului de serviciu web SOAP
5.1.1. Scenariul unui apel de serviciu web
tip SOAP
5.1.2. Arhitectura serviciului web
5.1.3. Precizări privind arhitectura
unei aplicaţii.
5.2. Scurte
prezentări SOAP, WSDL, UDDI
5.2.1.1. SOAP – istoric şi
evoluţie
5.2.1.2. Structura unui mesaj
SOAP şi principalele elemente
5.2.1.3. Tipurile de date SOAP
5.2.1.4. Transportul SOAP prin
HTTP
5.2.2.1. WSDL – istoric şi
evoluţie
5.2.2.2. Structura unui document
WSDL
5.2.3.1. UDDI – istoric şi
evoluţie
5.2.4. Triada fundamentală pentru
servicii web de tip SOAP
5.3. Implementări
de servicii şi clienţi SOAP.
5.3.1. Implementare serviciu web tip SOAP
pe o platformă .NET
5.3.1.1. Distribuţia de
suport pentru servicii web în C#
5.3.1.2. Implementarea în C# a
serviciului Exec__ de tip SOAP
5.3.1.3. Implementarea în C# a
unui client Exec__ de tip SOAP
5.3.2. Implementare serviciu web tip SOAP
în Java
5.3.2.1. Distribuţia de
suport pentru servicii web în Java
5.3.2.2. Implementarea în Java a
serviciului Exec__ de tip SOAP
5.3.2.3. Implementarea în Java a
unui client Exec__ de tip SOAP
5.3.3. Implementare serviciu web tip SOAP
în PHP
5.3.3.1. Distribuţia de
suport pentru servicii web în PHP
5.3.3.2. Implementarea în PHP a
serviciului Exec__ de tip SOAP
5.3.3.3. Implementarea în PHP a
unui client Exec__ de tip SOAP
5.3.4. Implementare serviciu web tip SOAP
în Python
5.3.4.1. Distribuţia de
suport pentru servicii web în Python
5.3.4.2. Implementarea în Python
a serviciului Exec__ de tip SOAP
5.3.4.3. Implementarea în Python
a unui client Exec__ de tip SOAP
5.4. Alte
implementări de clienţi Exec__
5.4.1. Alte implementări de
clienţi Exec__ în C#
5.4.2. Alte implementări de
clienţi Exec__ în Java
5.4.3. Alte implementări de
clienţi Exec__ în PHP
6. Servicii web de tip RESTful
6.1. Prezentare
generală a conceptului RESTful
6.1.2. Triada fundamentală pentru
servicii web RESTful
6.1.3. Exemple de proiectare RESTful
pentru servicii web
6.1.3.1. Sistem de rezervare a
locurilor
6.1.3.2. Comandarea
electronică de produse
6.2. Implementări
de servicii şi clienţi RESTful
6.2.1. Proiectarea serviciului Exec__ ca
serviciu REST şi a unui client
6.2.2. Implementare Exec__ în C#
6.2.2.1. Implementare serviciu
Exec__ REST în C#
6.2.2.2. Implementare client
Exec__ REST în C#
6.2.3. Implementare Exec__ în Java
6.2.3.1. Dezvoltarea unui
serviciu folosind distribuţia RESTeasy
6.2.3.2. Implementare serviciu
Exec__ REST în Java
6.2.3.3. Implementare client
Exec__ REST în Java
6.2.4. Implementare Exec__ în PHP
6.2.4.1. Distribuţii
PHP_REST; pachetele Da Silva
6.2.4.2. Implementare serviciu
Exec__ REST în PHP
6.2.4.3. Implementare client
Exec__ REST în PHP
6.2.5. Implementare Exec__ în Python
6.2.5.1. Implementare serviciu
Exec__ REST în Python
6.2.5.2. Implementare client
Exec__ REST în Python
7.1. Implementarea
serviciului UsersGateway
7.1.1. Unde este util UsersGateway?
7.1.2. Rutine de autentificare
7.1.2.1. Autentificare
specifică platformelor Unix
7.1.2.2. Autentificare prin FTP
sau POP3
7.1.2.3. Autentificare folosind
LDAP
7.1.3. Sursele serviciului UsersGateway
7.1.3.1. Clasa principală a
serviciului: UsersGateway
7.1.3.2. Clasele User şi
ParametriUG
7.1.3.3. Clasele Mail şi
MailThread
7.1.4. Configurarea şi punerea în
lucru a serviciului UsersGateway
7.2. Evaluări
de expresii aritmetice folosind mai multe servicii
7.2.1. Descrierea serviciilor; metodele
exportate de către acestea
7.2.2. Bibliotecile care
implementează metodele serviciului
7.2.3. Implementarea serviciilor de tip
RESTful
7.2.3.1. Implementarea
serviciului ServiceRs.cs
7.2.3.2. Implementarea
serviciului ServiceRj.java
7.2.3.3. Implementarea
serviciului ServiceRh.php
7.2.3.4. Implementarea serviciului
ServiceRy.py
7.2.4. Implementarea serviciilor de tip
SOAP
7.2.4.1. Implementarea
serviciului ServiceSs.cs
7.2.4.2. Implementarea
serviciului ServiceSj.java
7.2.4.3. Implementarea
serviciului ServiceSh.php
7.2.4.4. Implementarea
serviciului ServiceSy.py
7.2.5. Implementarea serviciilor de tip
XML-RPC
7.2.5.1. Implementarea
serviciului ServiceXs.cs
7.2.5.2. Implementarea
serviciului ServiceXj.java
7.2.5.3. Implementarea
serviciului ServiceXh.php
7.2.5.4. Implementarea
serviciului ServiceXy.py
7.2.6. Un client Python ce apelează
aleator mai multe servicii
7.2.6.1. Obiectul proxy RyC
pentru serviciile de tip RESTful
7.2.6.2. Obiectul proxy SyC pentru
serviciile de tip SOAP
7.2.6.3. Obiectul proxy XyC
pentru serviciile de tip XML-RPC
7.2.6.4. Un client evaluator de
expresii ce foloseşte mai multe servicii
8. O propunere de uniformizare
8.1. De
ce uniformizare şi automatizare a unor acţiuni?
8.2. WSWrapper
- o propunere de abordare a uniformizării
8.3. Exemple
de specificări WSWrapper pentru Exec
8.4. Câteva
consideraţii privind implementarea WSWrapper
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,