Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Arhitecturi de sisteme
distribuite
Curs 1
Structura Internet-ului
Aplicatii
utilizator
TFTP
SNMP
Aplicatii
utilizator
FTP
Nivelul presentare
Telnet
Nivelul aplicatie
Nivelul sesiune
Nivelul transport
TCP
Nivelul retea
IP
UDP
ICMP
Adresarea in Internet
Principala functie a Internet-ului este schimbul de date intre calculatoare.
Pentru aceasta fiecare calculator din Internet are asignata o adresa IP
Versiunea cea mai raspinadita la ora actuala a protocolului IP este IPv4. In
IPv4 adresa unui calculator este un sir de 32 de biti. Acest sir se reprezinta
sub forma unui 4-uplu format din 4 octeti, separati prin cate un punct.
Exemplu: 151.23.40.3. Exista si versiunea IPv6 care foloseste 128 de biti
Multimea de adrese IP este impartita in 4 clase
Clasa A, 0 adresa retea (7) adresa calculator (24)
Clasa B, 10 adresa retea (14) adresa calculator (16)
Clasa C, 110 adresa retea (21) adresa calculator (8)
Clasa D, 1110 adresa multicast (28)
Clasa E
127.0.0.1 = adresa de loopback. Datele trimise aici se intorc inapoi la sursa.
Este utila pentru testarea aplicatiilor de retea folosind un singur calculator
Adresele IP sunt dificil de memorat in format numeric. De aceea s-a
introdus o metoda de a le atasa nume simbolice prin sistemul de numire a
domeniilor (engl.domain name system DNS)
com
edu
gov
mil
net
org
int
uk
ac
kcl
dcs
ro
Clienti si servere
Server = un calculator (program in executie) din cadrul unei retele care furnizeaza servicii
altor calculatoare (programe in executie) din cadrul retelei
Client = un calculator (program in executie) dintr-o retea care beneficiaza de serviciile unui
calculator (sau program) server
In Internet, comunicarea intre un client (program) si un server (program) se face folosind
suita de protocoale TCP/IP. Aceasta se bazeaza pe notiunile de port si soclu (engl.socket)
Port = un canal abstract prin care un calculator (program care ruleaza pe calculator) poate
comunica cu exteriorul. Un port este identificat printr-un numar. Porturile 01023 sunt
rezervate pentru servicii speciale. Cateva dintre acestea sunt:
Port 7:
ECHO
Port 21:
FTP
Port 23:
Telnet
Port 80:
HTTP
Port 25
SMTP
Port 110
POP3
Port 150
SQL-NET
Soclu = a pereche formata dintr-o adresa de IP si un port. Un soclu abstractizeaza notiunea
de canal de comunicatie intr-o retea bazata pe TCP/IP, usurand astfel programarea
Tipuri de servere
Middleware
Arhitectura in 4 straturi
Client
Server
WEB
Server de
aplicatii
Baza de date
Partea dintre logica de prezentare (client) si logica datelor (baza de date) se mai
numeste si strat intermediar (engl.middle layer). El contine printre altele obiectele
problemei (engl.business objects), ce corespund entitatilor din domeniul problemei
Putem avea arhitecturi cu n 4 straturi (engl.n-tiers)
Cu cat numarul de straturi este mai mare, cu atat performantele pot sa scada,
implementarea este mai dificila si cere expertiza mai mare, complexitatea
sistemului este mai mare, costul total al sistemului creste. In consecinta, stabilirea
numarului de straturi trebuie facuta cu grija, in functie de cerintele reale ale
aplicatiei. Cel mai adesea o arhitectura in 3 straturi este suficienta.
Serverele de aplicatii sunt in general foarte scumpe si curba de invatare este foarte
lenta. Exemple de servere de aplicatii:
Proprietare: Weblogic (BEA), Websphere (IBM), ColdFusion (Macromedia),
etc
Disponibile liber: Zope, JBoss
Protocoale
In cadrul acestui model clientii si serverii comunica prin transfer de mesaje de-a
lungul unor canale de comunicatie. Corespunde oarecum cu structura retelei in
care ruleaza clientii si serverii. Scopul acestui model este de a abstractiza detaliile
de nivel coborat si de a face astfel programarea aplicatiilor mai usoara.
Se preteaza in urmatoarele situatii:
Cerintele de comunicare sunt foarte simple
Sunt necesare performante foarte bune; acest model este cel mai eficient dintre
modele discutate; plata pentru aceasta eficienta este cresterea complexitatii
programarii
Exemplu: HTTP, protocolul de comunicare cu un server de WWW
Exista doua clase:
Transfer sincron de mesaje: entiatea A trimite un mesaj catre entitatea B, in
timp ce entitatea B prelucreaza mesajul, entitatea A se opreste si asteapta un
raspuns, dupa ce entitatea B raspunde entitatea A isi continua activitatea
Transfer asincron de mesaje: entiatea A trimite un mesaj catre entitatea B, in
timp ce entitatea B prelucreaza mesajul, entitatea A isi continua activitatea,
cand entiatea B raspunde, entitatea A poate prelua mesajul
Modelul evenimentelor
Acest model presupune asocierea unor portiuni de cod cu anumite
evenimente. Codul va fi executat automat la declansarea evenimentelor
respective.
Acest model de programare este foarte raspandit in programarea
interfetelor grafice. Dezvoltarea unei astfel de interfete presupune
urmatoarele:
Controale grafice, spre exemplu butoane, sunt plasate intr-un
container de tip fereastra principala, numita si cadru (engl.frame)
Fereastra cadru implementeaza o interfata prin intermediul careia va
fi invocata la declansarea unor evenimente. Codul de tratare a
evenimentelor va fi amplasat in metodele ce implementeaza aceasta
interfata.
Fereastra cadru se inregistreaza la controalele grafice ca obiect
ascultator (engl.listener), ceea ce semnifica faptul ca este interesata de a
fi informata la declansarea anumitor evenimente.
La declansarea unui eveniment, controlul grafic informeaza toate
obiectele ascultator inregistrate la el.
Obiect transmitator
Magistrala de obiecte
Intr-o magistrala de obiecte, serverele imping datele catre clienti, din acest motiv
folosindu-se si terminologia push tehnology. Spre deosebire, in obiectele distribuite
clientii extrag datele de la serveri, folosindu-se terminologia pull technology.
In magistrala de obiecte, transmitatorul este server si ascultatorii sunt clienti.
Arhitectura magistrala de obiecte este utila in aplicatiile in care evenimentele se
declanseaza in timp real iar multimea de ascultatori se poate schimba dinamic.
Exemple:
Furnizarea de date despre piata de capital institutiilor financiare interesate
Teleconferinte sau aplicatii conversationale (engl.chat room), unde mesajele intre
participanti se transmit in timp real
Aplicatii multimedia distribuite de tip video la cerere (engl.video on demand), unde un
mare volum de date trebuie transmis in timp real abonatilor
Ascultatori
Transmitatorul trimite date catre dispecer (butuc), iar acesta le distribuie ascultatorilor
inregistrati. Poate exista cate un dispecer pe canal, sau un singur dispecer pentru toate
canalele.
Magistrala cu multitransmisie
Tehnica multitransmisiei permite transferul unui singur mesaj de
la transmitator catre mai multi receptori.
Mesajul este transmis pe o magistrala, de unde este preluat de toti
ascultatorii interesati; ascultatorii sunt activati printr-un
eveniment care ii informeaza ca mesajul este disponibil pe
magistrala.
Un exemplu este iBus de la SoftWired Ltd care poate fi gandita ca
un fel de implementare software a protocolului Ethernet. Astfel
mesajele vor fi preluate numai de destinatarii interesati; daca
mesajul nu este necesar este pur si simplu ignorat si lasat sa treaca
urmatorului destinatar conectat la magistrala.
Modelul tuplelor
Curs 2
WWW
SIT WEB
SITE WEB
Omniprezent
Nu exista autoritate centrala
Colectie de omponente eterogene si autonome
Web semantic
Calcul P2P
Procese
Web pragmatic
Web pragmatic
Modele si tehnologii bazate pe servicii Web, semantica, agenti
care pot fi utilizati pentru a crea sisteme informatice mari,
deschise
Web pragmatic
Negociere: modelare semantica, interactiuni P2P, interactiuni
multiple in procese de business
Directii de dezvoltare:
Terminal
Terminal
Terminal
Terminal
Mainframe
Terminal
Terminal
Terminal
Terminal
Terminal
Terminal
PC
Client
E-Mail
Server
Master-Slave
Workstation
Client
Web
Server
PC
Client
PC
Client
Database
Server
Application
Application
Application
Application
E-Mail
System
Web
System
Database
System
Agent
Application
Application
Application
Agent
Agent
Agent
Application
Agent
E-Mail
System
Agent
Agent
Web
System
(Mediators, Proxies, Aides, Wrappers)
Agent
Database
System
Internet
Intranet: retea privata la nivelul unei intreprinderi
Extranet: retea privata limitata la anumite
intreprinderi selectate
Virtual Private Network (VPN): un mod de a
realiza intranet sau extranet in Internet
Internet computing sau servicii Web toate aceste
posibilitati
Componente autonome
Componente eterogene
Configuratia se modifica dinamic:
comportare, arhitectura, implementare,
interactiuni
intra si ies
Servicii
Semantica
Agenti
Arhitectura WWW
Este o arhitectura client/server tipica.
Un server WWW are sarcina de a gestiona o multime de documente din
cadrul WWW. Aceste documente se numesc si pagini WWW.
Un client generic de WWW este un program care emite cereri catre un
server WWW pentru accesarea paginilor WWW gestionate de acel
server. Exemple de clienti sunt:
Un navigator WWW care permite regasirea si afisarea paginilor
WWW in scopul vizualizarii continutului lor de catre un agent uman.
Un program de tip softbot care localizeaza diverse pagini WWW in
scopul crearii unui index. Indexul poate fi utilizat ulterior de un
motor de cautare.
Conceptele pe care se bazeaza tehnologia WWW sunt:
Schema de denumire a resurselor (engl.uniform resource locator) URL
Protocolul de transfer al documentelor (engl.hypertext transfer protocol)
HTTP
Limbajul de specificare a continutului paginilor WWW (engl.hypertext
markup language) HTML
Introducere in HTTP
Antetele unui mesaj pot fi: antete generale (engl.general header) se refera la mesaj, nu la
entitatea transmisa; antete de entitate (engl.entity header) se refera la entitatea transmisa
sau referita; antete raspuns (engl.response header) serverul comunica clientului informatii
care nu au fost incluse in linia de start.
Cereri Linia de start se numeste linie de cerere (engl.request line) si are structura:
metoda spatiu url_resursa spatiu versiune_http sfarsit_linie
GET /staff/badica/index.html HTTP/1.1
Connection: Keep-Alive
Host: www.dcs.kcl.ac.uk
Accept: text/html
cerere =
linie-de-cerere
(antet-general | antet-cerere | antet-entitate)*
sfarsit-de-linie
[corp-mesaj]
Cookies
HTTP este un protocol fara stare (engl.stateless). Acest lucru inseamna ca HTTP nu
dispune de un mecanism propriu care sa permita unui server WWW sa poata
pastra informatii despre starea utilizatorului..
Termenul de cookie se refera la mecansimul prin care o aplicatie WWW pe partea
de server poate stoca si regasi informatii pe partea de client. El permite adaugarea
adaugarea unei stari a conexiunii stocata la client.
Serverul specifica clientului ca vrea sa stocheze un cookie prin antetul Set-Cookie,
in maniera urmatoare:
Set-Cookie: Nume=Valoare
Ulterior, clientul va include cookie-ul intr-un antet al unei cereri sub forma:
Cookie: Nume=Valoare
Suplimentar, antetul Set-Cookie mai poate contine urmatoarele informatii:
domain: specifica domeniul in care se aplica cookie-ul
expires: specifica data de expirare a cookie-ului
path: specifica URL-urile la care clientul va returna cookie-ul in cererea HTTP
secure: specifica faptul ca cookie-ul va fi returnat de client numai daca conexiunea
este sigura.
Ex: Set-Cookie: Credit=111; secure; expires=Thursday, 07-Dec-2000,
10:00:00 GMT; domains=.comp-craiova.ro; path=/
Paginile de WWW pot fi statice si dinamice. Paginile statice sunt stocate explicit pe
server si returnate clientilor ca raspuns la cereri GET. Paginile dinamice sunt
generate dinamic de server, nefiind stocate explicit. Este posibil ca aceste pagini sa
fie configurate pe baza unor date trimise de la client catre server. Astfel de date pot
fi de exemplu criterii de cautare intr-o baza de date, paginile generate dinamic fiind
in acest caz rapoartele rezultate in urma cautarii.
Exista doua metode de a transmite date de la client la server:
Folosind metoda GET, datele sunt atasate URL-ului sub forma unor perechi variabilavaloare. In acest caz URL-ul reprezinta un program aflat pe server si datele sunt
transmise acestui program in mediul sau de executie (engl.environment). La URL se
adauga un sir de forma:
?nume1=valoare1&nume2=valoare2& &numen=valoaren
Un este codificat prin + si un caracter special printr-un cod hexa precedat de
%. Ex. ?cale=%2Fweb%2 semnifica valoarea /web/ pentru variabila cale.
Folosind metoda POST, datele sunt atasate in corpul cererii, spre deosebire de cazul
anterior, unde sunt atasate URL-ului, in antet. Ele sunt transmise programului prin
intrarea standard.
Curs 3
Clasificare
Programare pe partea de client (engl.client side
programming) = executarea de programe la client in
scopul cresterii gradului de interactivitate al paginilor
WWW. Programele destinate a fi executate la client se pot
transmite de la server catre client fie in format sursa, fie in
format obiect.
Programare pe partea de server (engl.server-side
programming) = executarea de programe la server in
scopul de a genera date si/sau rapoarte care sunt trimise
clientului sau mai general, pentru extinderea
functionalitatii unui server de WWW. Datele si rapoartele
sunt trimise clientului de obicei in format HTML.
Applet-uri
Miniaplicatii Java
O miniaplicatie (engl.applet) Java = un program Java care ruleaza sub controlul unui program
client de navigare WWW. Miniaplicatia este transferata de la server catre client sub forma de
cod obiect (class sau jar).
Conditia ca o miniaplicatie sa poata fi executata pe calculatorul clientului este ca programul de
navigare sa dispuna de un subprogram de interpretare a codului binar al masinii virtuale Java.
Un astfel de program navigator se numeste Java-enabled.
Restrictii: i) o miniaplicatie nu se poate atinge (in citire sau scriere) de discul calculatorului
client pe care ruleaza; din acest motiv se spune metaforic ca ruleaza inside the sandbox; ii)
lansarea in executie a unei miniaplicatii poate dura deoarece descarcarea fisierelor class si apoi
incarcarea lor sub controlul programului client de navigare poate consuma un timp semnificativ
de mare.
O miniaplicatie se include intr-o pagina WWW cu elementele APPLET sau OBJECT.
Initial s-a folosit elementul APPLET, deoarece singurele programe executabile care se
puteau include in paginile WWW sub forma de cod obiect erau miniaplicatiile Java.
Exemplu: <APPLET CODE="Miniaplicatie" CODEBASE="." WIDTH="300"
HEIGHT="200"></APPLET>
Ulterior s-a introdus elementul OBJECT pentru a se permite includerea si a altor aplicatii
sub forma de cod obiect in paginile WWW. Exemplu:
<OBJECT WIDTH="500" HEIGHT="300">
<PARAM NAME="code" VALUE="Miniaplicatie"/>
<PARAM NAME="codebase" VALUE ="."/>
</OBJECT>
Definirea parametrilor
Tag-ul APPLET
BL al = new BL();
Partea a II-a
Ce este JavaScript ?
<SCRIPT LANGUAGE="JavaScript1.3">
<HTML>
<HEAD>
<SCRIPT LANGUAGE ="JavaScript1.3">
<!-- Ascunde scriptul pentru navigatoarele ce nu stiu Javascript.
document.write("Salut !");
// Sfarsitul scriptului. -->
</SCRIPT>
Fisierul js1.js:
</HEAD>
document.write("Salut!");
</HTML>
<HTML>
<HEAD>
<SCRIPT SRC="js1.js"></SCRIPT>
</HEAD>
</HTML>
Obiectul this desemneaza obiectul buton, iar this.form formularul care contine
butonul.
Functia calcul() primeste ca argument un formular, preia expresia de calculat din
campul expr, o evalueaza cu eval() si depune rezultatul in campul rez.
Evenimentul tratat este Click pe buton.
Core JavaScript
Variabilele se declara la initializare sau optional cu var. Pot fi globale sau locale
(definite in corpul unei functii). Cele locale se declara obligatoriu cu var.
Exista tipuri primitive si tipuri compuse. Tipurile primitive sunt: numerele (intregi
si reali), valorile logice, sirurile de caractere, valoarea null si valoarea
undefined. Tipurile compuse sunt vectorii si obiectele.
Pentru specificarea constantelor (numite si valori) se folosesc literali. Exista literali
pentru specificarea numerelor (2, 3.14), valorilor logice (true si false),
vectorilor ([1,2,3,aaa]) si obiectelor ({camp_1:a,camp_2:3}).
Structurile de control sunt cele din Java: secventierea, if-else, switch, for,
while, do-while, label, break si continue. Exista in plus structurile pentru
manipularea obiectelor: for-in si with. Comentariile sunt ca in Java.
Caramizile de baza ale JavaScript sunt functiile. Ele se declara astfel:
function nume(argumente) { corpul functiei }
Functiile pot intoarce optional o valoare cu return si pot fi recursive.
Argumentele functiilor sunt disponibile din vectorul arguments.
Exista o multime de functii predefinite
Functiile si variabilele globale pot fi referite si din alte ferestre daca se prefixeaza
cu numele ferestrei in care au fost definite.
& - si pe biti
| - sau pe biti
Functii predefinite
Tipul Object
Un obiect JavaScript este privit ca o colecie neordonat
de proprieti, fiecare proprietate avnd zero sau mai
multe atribute. Proprietile pot conine fie alte obiecte,
fie valori primitive sau metode. O valoare primitiv are
unul dintre tipurile fundamentale: Undefined, Null,
Boolean, Number i String.
un obiect are tipul de baz Object.
o metod este o funcie asociat unui obiect prin
intermediul unei proprieti.
un obiect este compus din proprieti
fiecare proprietate are un nume, o valoare i o mulime
de atribute
}
obiect = new TipObiect(argumente);
Proprietatile unui obiect se pot accesa cu obiect.prop sau cu obiect["prop"].
Obiecte JavaScript predefinite: Array, Boolean, Date, Function, Math,
Number, RegExp, String.
Ierarhii de obiecte in JavaScript: daca se doreste crearea unui obiect care mosteneste
de la un alt obiect se seteaza valoarea prototype a sa la obiectul de la care se
mosteneste. Notiunea de clasa de baza din limbajele bazate pe clase a fost inlocuita cu
notiunea de obiect prototip.
function Angajat() {
this.nume = "";
this.dept = "general";
}
function Manager() {
this.raporteaza = [];
}
Manager.prototype = new Angajat;
function Muncitor() {
this.proiecte = [];
}
Muncitor.prototype = new Angajat;
function Vanzator() {
this.dept = "vanzari";
this.quota = 100;
}
Vanzator.prototype = new Muncitor;
ion = new Angajat;
adi = new Manager;
gelu = new Muncitor;
gabi = new Vanzator;
Concluzii
Pe cat posibil incercati sa separati partea de continut de partea de
prezentare din paginile Web. Pentru aceasta identificati intai
unitatile de continut pe care trebuie sa le contina pagina si abia apoi
puneti-va problema modului de prezentare al acestora.
Aveti in vedere ca descarcarea unor programe in cod obiect si
rularea lor in programul navigator poate duce la incetinirea
incarcarii paginii.
Folositi scriptingul la client numai atunci cand este absolut necesar.
Scriptingul face sa creasca dependenta paginilor pe care le scrieti de
programul navigator.
Atunci cand doriti sa creati pagini complexe si folosirea scriptingului
la client este absolut necesara, incercati sa identificati cu clientul
dumneavoastra navigatoarele carora le sunt adresate paginile. Un
pas important va fi apoi testarea navigatorului inainte de afisarea
paginilor sau a anumitor parti specifice din pagini.
Servere WWW
Server WWW = un program cu rol de server care este capabil sa
raspunda la cereri HTTP.
Modul de functionare al unui server WWW este foarte important
pentru infrastructura si aplicatiile WWW, desi in acelasi timp este
ascuns utilizatorilor uzuali ai WWW.
Probleme importante referitoare la serverele WWW sunt:
Performanta
Configurarea si administrarea
Extensia si programarea
Executie permanenta
Serverul este pornit manual de utilizator sau automat la pornirea
sistemului si se executa in permanenta. Dupa pornire serverul
asculta cererile HTTP pe portul pe care a fost configurat. Pornirea
manuala este recomandata intr-un mediu de dezvoltare a unei
aplicatii WWW. Pornirea automata este recomandata dupa ce
aplicatia WWW a fost instalata (engl.deployed).
Serverul poate fi pornit de la linia de comanda sau instalat ca
serviciu al sistemului de operare.
Servere de origine
Majoritatea serverelor de WWW sunt configurate ca servere de
origine. In acest caz cerrile HTTP sunt tratate local de server.
1: Cerere catre server
Client
Server de origine
Servere proxy
Un server proxy accepta cereri pentru resurse si fie le rezolva din
memoria cache locala, fie prin inaintarea cererii catre serverul de
origine.
1: Cerere catre proxy
Client
Proxy
2: Cerere catre
server
3: Raspuns catre
proxy
Server de origine
SSI
SSI (engl.Server Side Include) este o tehnologie ce permite includerea de
informatii intr-o pagina WWW inainte de trimiterea paginii la client.
O pagina care foloseste SSI contine instructiuni speciale. Aceste instructiuni
sunt interpretate de server ori de cate ori pagina este ceruta de un client.
Instructiunile pot specifica: includerea unor documente in pagina curenta (de
exemplu un header sau un footer), a datei curente, a valorii unui contor de
acces, etc.
Avantajul SSI fata de CGI este ca este o tehnologie mult mai simpla si ca nu
implica apelul nici unui program extern.
Nu exista un standard de SSI si de aceea fiecare server are o sintaxa si
functionalitate proprie pentru SSI.. Pentru serverul Apache instructiunile SSI
sunt de forma unor comentarii HTML/XML cu structura urmatoare:
<!-- #element atribut1=valoare1 atribut2=valoare2 ... -->
Un exemplu este urmatorul:
<!--#include virtual="/header.html" -->
Apache permite folosirea si a unor facilitati SSI avansate desemnate prin
acronimul XSSI. Un exemplu este posibilitatea definirii unui flux de control ca
in programarea procedurala prin comenzile if, elif, else si endif.
Aplicatii WWW
Aplicatiile de comert electronic au o parte semnificativa pe partea de server.
Pentru a descrie aceasta parte se foloseste frecvent termenul de aplicatie WWW
= extensia dinamica a unui server WWW.
Aplicatiile WWW sunt in general de doua tipuri:
Aplcatii orientate pe prezentare. Contin pagini WWW interactive si sunt
capabile sa genereze continut dinamic ca raspuns la cererile clientilor.
Aplicatii orientate pe serviciu. Implementeaza un punct terminal pentru un
serviciu WWW. Serviciu WWW = un serviciu oferit de o aplicatie altor
aplicatii, prin intermediul platformei WWW.
Aplicatiile WWW contin componente WWW. Componentele WWW sunt
caramizile pe baza carora se poate extinde dinamic functionalitatea unui
server WWW. In tehnologia Java, componentele WWW sunt miniservere sau
pagini JSP.
Componentele WWW sunt suportate de serviciile unei platforme speciale de
executie numita container WWW. Containerul furnizeaza servicii ca:
dispecerizarea cererilor, securitate, concurenta, gestiunea ciclului de viata, etc.
O aplicatie WWW consta in general din: componente WWW, fisiere de
resurse statice si clase/biblioteci de ajutor (engl.helper).
CGI
Arhitectura CGI
Server
Client
Server HTTP
Aplicatie
HTTP
CGI
Obiecte partajate
Componentele WWW in general si miniserverele in particular folosesc
de obicei si alte obiecte pentru a-si indeplini sarcinile. Astfel: i) pot
folosi obiecte private; ii) pot folosi obiecte publice atribute ale unui
domeniu standard; iii) pot accesa baze de date; iv) pot accesa alte
resurse WWW.
Componentele WWW cooperante pot partaja informatii sub forma
unor obiecte definite ca atribute ale unui domeniu standard: context
WWW (aplicatie), sesiune, cerere HTTP si respectiv pagina JSP.
Pentru reprezentarea acestor patru domenii, in pachetul
javax.servlet sunt definite patru clase: ServletContext,
HttpSession, ServletRequest si JspContext.
Accesul la aceste obiecte se face prin metode de tip
[get|set]Attribute.
Gestiunea sesiunii
O sesiune consta in una sau mai multe cereri HTTP catre un server WWW dealungul unei perioade de timp.
Implementarea unei sesiuni foloseste clasa HttpSession. Un obiect sesiune este
pastrat pe server si el stocheaza informatiiile despre un client de-alungul unei
sesiuni a clientului respectiv.
Clasa HttpSession foloseste clasa Cookie pentru stocarea identificatoului
sesiunii la client sub forma unui cookie. Sesiunea este pastrata un interval maxim de
timp intre doua cereri succesive ale clientului.
Informatia se pastreaza in obiectul sesiune sub forma unor perechi variabilavaloare. Pentru accesul la aceste perechi se folosesc metodele setAttribute(),
removeAttribute(), getAttribute(), getAttributeNames();
JSP
JSP (engl.Java Server Pages) este o tehnologie pentru generarea de pagini dinamice
bazata pe ideea mixarii de cod Java cu cod HTML in paginile WWW. Este
recomandata pentru aplicatiile WWW orientate pe prezentare.
O alta tehnologie de pagini dinamice foarte folosita la ora actuala este PHP. PHP este
un limbaj de scripting pentru partea de server, inspirat din C. Codul PHP poate fi
incorporat in paginile WWW.
JSP functioneaza peste o arhitectura de miniservere.
La incarcarea unui JSP, se genereaza automat codul java pentru miniserverul
corespunzator si apoi acesta este compilat si incarcat in containerul de miniservere.
Acest proces se repeta ori de cate ori codul JSP este modificat.
<HTML>
<HEAD> <TITLE> Un exemplu cu JSP </TITLE> </HEAD>
<BODY>
<ul>
<% for (int i=0;i<20;i++) { %>
<li><strong><%= i %></strong>O linie</li></br>
<% } %>.
</ul>
</BODY>
</HTML>
O baza de date
SQL
SQL (engl.Structured Query Language) este un limbaj pentru
definirea, interogarea si actualizarea bazelor de date relationale.
Exista numeroase dialecte de SQL. Cateva dintre cele mai
importante sunt:
ANSI/ISO SQL. Este versiunea standard de SQL definita de organizatiile de
standardizare ANSI si ISO. Exista doua standarde: SQL-89 numit si SQL1 si
SQL-92 numit si SQL2. Standardul de referinta la ora actuala este SQL2
IBM DB2. Este un standard de facto asociat cu sistemul DB2 al lui IBM.
Variante specifice diverselor servere existente pe piata: Ingres, Microsoft SQL
Server, Oracle, etc.
SELECT
Interogarea unei baze de date relationale se face cu comanda select
cu sintaxa:
select campuri from relatii where conditii;
ROLLBACK si COMMIT
Comenzile commit si rollback sunt utile pentru lucrul cu
tranzactii. O tranzactie este o secventa de operatii de acces la o
baza de date, secventa ce are proprietatea de atomicitate. Acest
lucru inseamna ca fie secventa nu se executa, fie trebuie
executata in totalitate pentru pastrarea consistentei datelor.
O baza de date care lucreaza in regim tranzactional se poate afla
in doua stari:
starea de autovalidare (engl.autocommit), caz in care orice cerere de
actualizare declanseaza automat modificarea continutului bazeio de date.
starea de validare manuala (engl.manual commit), caz in care modificarea
continutului bazei de date are loc atunci cand se executa comanda
commit. Pana la executarea acestei comenzi, starea bazei de date
dinaintea tranzactiei poate fi refacuta cu comanda rollback.
GRANT si REVOKE
Comenzile grant si revoke permit administratorilor
de sistem sa creeze utilizatori si sa le dea respectiv ia
drepturi pe urmatoarele patru nivele:
Nivel global: drepturile globale se aplica la toate bazele de
date de pe un anumit server
Nivelul baza de date: drepturile alocate la acest nivel se
aplica tuturor relatiilor unei baze de date.
Nivelul relatie: drepturile alocate la acest nivel se aplica
tuturor coloanelor unei relatii.
Nivelul coloana: dreptuile la acest nivel se aplica individual,
coloanelor unei relatii.
JDBC
JDBC este o interfata de programare si o infrastructura pentru
accesul la o baza de date relationala.
JDBC isi propune sa standardizeze mecanismul de conectare, de
trimitere a cererilor, de lucru cu tranzactii, cat si de reprezentare a
rezultatelor unei cereri.
Programatorul este liber sa foloseasca ce dialect SQL doreste, in
functie de serverul de baze de date cu care lucreaza.
JDBC propune o solutie multinivel:
La nivelul cel mai de sus, o aplicatie Java executa cereri SQL prin intermediul
unei interfete de programare definita in pachetul java.sql. Acest pchet nu
contine altceva decat definitiile unor interfete Java. Implementarile acestor
interfete sunt furnizate separat pentru diversele sisteme de baze de date.
Aplicatia acceseaza baza de date prin intermediul unui program special numit
JDBC driver manger.
Acest program gestioneaza programele specifice de control (engl.driver) pentru
fiecare sistem de baze de date in parte. Un program de control implementeaza
interfata java.sql.Driver.
Infrastructura JDBC
Aplicatie
Interfata de
programare JDBC
Managerul de drivere
JDBC
Baza de date
MySQL
Baza de date
Microsoft Access
Enunturi pregatite
Daca o anumita interogare SQL se executa de un numar repetat de
ori, atunci este mai eficient sa se foloseasca un enunt pregatit
(engl.prepared statement). In esenta un enunt pregatit este o
interogare compilata si optimizata pentru fi executata mai eficient.
Un enunt pregatit este in acelasi timp si un sablon de interogare. Un
astfel de sablon contine niste parametrii specificati prin semnul
intrebarii. Valoarea acestor parametrii se completeaza inaintea
executiei interogarii.
String sablon= "update Angajat set salariu=? where id=?";
PreparedStatement cerere =
conexiune.preparedStatement(sablon);
float[] salarii_noi = getSalariiNoi();
int[] id_angajati = getIdAngajati();
for (int i=0;i< id_angajati.length;i++) {
cerere.setFloat(1,salarii_noi[i]);
cerere.setInt(2,id_angajati[i]);
cerere.execute();
}
Metadate
Metadatele sunt date pentru descrierea altor date. JDBC contine un numar de clase
utile pentru extragerea de metadate referitoare la baze de date, multimi de
raspunsuri, tabele, programe de control, etc.
Metadatele sunt utile in urmatoarele situatii:
Pentru a testa daca sistemul de baza de date are anumite facilitati, a caror lipsa ar putea
produce erori. O astfel de facilitate este spre exemplu disponibilitatea procedurilor
stocate.
Daca nu se cunoaste structura bazei de date.
Tipuri de metadate:
Metadate referitoare la baza de date. Se obtin cu ajutorul clasei DatabaseMetaData.
Aceste metadate includ: numele programului de control, versiunea programului de
control, verificarea disponibilitatii standardului SQL2, verificarea disponibilitatii unor
facilitati specifice ale SQL, etc.
Metadate referitoare la multimea de rezultate. Se obtin cu ajutorul clasei ResultSet.
Aceste metadate includ: numarul de atribute din multimea de rezultate, numele
atributelor, numl relatiei din care s-au obtinut atributele, tipurile acestor atribute, etc.
Rezerve de conexiuni
Deschiderea unei conexiuni la o baza de date este un proces consumator de timp. El poate
dura mult mai mult decat executarea unei cereri.
Din acest motiv se pune problema refolosirii conexiunilor in aplicatiile care se conecteaza de
un numar repetat de ori la o baza de date.
Se foloseste o clasa speciala numita rezerva de conexiuni (engl.connection pool). Aceasta clasa
ruleaza pe un fir separat si are urmatoarele responsabilitati:
Prealocarea conexiunilor pe constructorul clasei. Constructorul mai primeste un numar maxim de
conexiuni, un numar initial de conexiuni si un indicator daca rezerva sa astepte sau nu cand se cere
o conexiune si nu exista nici una libera.
Gestiunea conexiunilor disponibile. Daca se cere o conexiune si exista o conexiune libera, atunci ea
este alocata si trecuta in lista conexiunilor ocupate.
Alocarea de noi conexiuni. Daca se cere o conexiune, nu exista nici una libera si nu s-a atins numarul
maxim de conexiuni, atunci se creaza o noua conexiune pe un fir separat. Daca insa s-a atins limita
maxima, se asteapta sau nu in functie de indicatorul setat in constructor.
Asteptarea pentru eliberarea unei conexiuni.
Inchiderea conexiunilor.
Intr-o aplicatie cu miniservere, rezerva de conexiuni poate fi alocata unui singur miniserver
sau se poate partaja intre mai multe miniservere.
Comert = o multime de tranzactii intre doi sau mai multi participanti cu scopul ca
fiecare participant sa castige ceva din acest schimb. Schimbul presupune bani,
produse (tangibile sau intangibile, servicii) si/sau informatii
Tipuri de comert:
Comertul traditional
Comertul electronic, care include comertul bazat pe tehnologii Internet/Web
E-Commerce (Comert electronic) = procesul de vanzare si/sau cumparare de bunuri
si/sau servicii folosind tehnologia informatiei
Afaceri (engl.business) = modul in care o companie isi organizeaza activitatea astfel
incat sa se autosustina si sa genereze profit (valoare)
E-Business = procesul de realizare a afacerilor folosind tehnologia informatiei
Puncte de vedere:
Unii autori considera ca E-Business E-Commerce, sugerand ca E-Commerce
se refera exclusiv la activitatile de vanzare/cumparare, in timp ce E-Business
include si alte activitati: aprovizionare, marketing, etc
Drept suport tehnologic vom avea in vedere sistemele distribuite, tehnologiile
Internet si WWW si tehnologiile bazate pe limbajul Java
Articole tranzactionate
Articol tranzactionat = o entitate vanduta sau cumparata.
Produse sau servicii. Produsul este o entitate ce poate fi identificata
fizic si poate fi livrata. Serviciul este o actiune ce poate fi intreprinsa.
Articole tranzactionate digital si fizic. Un aricol digital poate fi livrat
printr-o retea de telecomunicatii. Un articol fizic poate fi livrat numai
prin activitati logistice, cum ar fi trasnportul produsului sau diverse
facilitati in cazul unor servicii.
Categorii de produse tranzactionate:
Produse standard = au un identificator de produs si pot fi comandate din
cataloagele vanzatorilor
Marfuri = produse care exista intr-o forma identificabila, in cantitati
considerabile si in forme identice, disponibile la surse variate. Exemple:
produsele primare (cafea, ulei brut).
Produse specializate = sunt proiectate sa satisfaca cerinte particulare ale
anumitor clienti. Exemple: programele.
Produse configurabile = produse standard care trebuie modificate conform
cerintelor unui anumit cumparator particular prin optiuni, extensii,
parametrizari, specializari, etc.
Producator de
containere
Butoaie
Producator de bere
Bere in butoaie
Restaurant
Bere la halba
Consumator de bere
Arhitectura sistemului
Catalogul
cartilor
Server pentru
mailing list
Navigator
client
Server de
WWW
Baza de date cu
stocul
Obiecte
distribuite
Baza de date
cu clientii
Server de e-mail
XML
Curs 8
Ce este XML ?
Utilitatea XML
Avantaje:
Faciliteaza interoperabilitatea datelor intre aplicatii.
Ofera o alternativa la raspandirea formatelor proprietare.
Atat datele cat si marcajele sunt stocate sub forma de text, fapt ce permite manevrarea si
editarea usoara, practic cu orice editor de texte.
Fiind un limbaj de meta-marcare, este configurabil.
Poate fi citit si interpretat relativ usor de un agent uman.
Este standardizat, ceea ce inseamna ca este relativ unanim cunoscut si acceptat.
Este liber in sensul ca specifcatia este disponibila liber, este independent de platforma si
este bine sustinut de unelte software disponbile liber.
Un document XML contine date si marcaje. Datele sunt reprezentate sub forma unor
secvente de caractere (engl.character data). Marcajele indica structura documentului
(sunt metadate). Ele includ:
Marcajele de inceput si sfarsit ale elementelor; Marcajele elmentelor vide; Comentariile;
Referintele la entitati; Delimitatorii sectiunilor CDATA; Definitiile de tip de document
(engl.Document Type Definition DTD); Instructiunile de prelucrare.
in interiorul sau.
DTD-ul poate fi plasat intr-un fisier separat. Daca presupunem ca DTD-ul este plasat
in fisierul arbbin.dtd, atunci va trebui sa schimbam doar specificatia DTD-ului din
documentul XML:
<client>
<nume><prenume>Amelia</prenume>
<initiala_tata>P.</initiala_tata>
<familie>Badica</familie>
<porecla>Costu</porecla>
</nume>
<telefon>0251-145190</telefon>
<companie limba="romana">
Universitatea din Craiova
</companie>
<contact type="prim">
<data>20 Ian 1995</data>
</contact>
<contact type="ultim">
<data>19 Dec 2002</data>
</contact>
<atitudine interes="potrivit"/>
<personal> Ii place fotbalul
<data>23 Nov 1995</data> Ii
place mancarea italiana
</personal>
</client>
Orice procesor de XML trebuie sa distinga intre date si marcaje. Pentru a putea
desemna caracterele < > ' si " ca date trebuie sa folosim entitatile predefinite <
> ' si ". Pentru & se foloseste entitatea predefinita &.
Caracterele speciale UNICODE pot fi referite &#codZecimal; sau
odHexazecimal;. Astfel se specifica prin © sau ©.
Pentru a indica faptul ca un sir de caractere trebuie sa nu fie analizat de procesorul
documentului XML se foloseste o sectiune CDATA:
<INFO><![CDATA[Text intr-un element <INFO>]]></INFO>
SAX
SAX este un standard de facto pentru o interfata de programare a unui
mecanism de analiza sintactica bazat pe evenimente a documentelor
XML. Un programator de aplicatii va putea folosi orice biblioteca de
programe de analiza sintactica conforma cu standardul SAX, fiind
suficient sa cunoasca doar aceasta interfata standard.
Termenul bazat pe evenimente se refera la folosirea unor functii callback. Aceste functii trebuie furnizate de programatorul de aplicatii si
ele trateaza o serie de evenimente de interes primite de la analizorul
sintactic. Un analizor sintactic conform cu SAX va trebui sa
implementeze interfata SAX. Functiile call-back sunt implementate de
obiecte speciale de tratare a evenimentelor (engl.handler). Un astfel de
obiect trebuie sa implementeze niste interfete standard.
O biblioteca conforma cu SAX va trebui sa contina partea de interfete
standard SAX si o implementare particulara a acestor interfete. O astfel
de bibliotca este Xerces.
Interfete SAX
SAX contine trei parti:
Partea de baza org.xml.sax. Aici se definesc interfetele standard ale
obiectelor de tratare a evenimentelor SAX.
ContentHandler evenimente referitoare la continut
DTDHandler evenimente referitoare la DTD
ErrorHandler evenimente de eroare
EntityResolver evenimente de tratare a entitatilor
XMLReader interfata unui analizor sintactic XML orientat pe
evenimente
Attributes interfata pentru o lista de atribute XML
Partea de clase de ajutor org.xml.sax.helpers. Aici se definesc niste
implementari implicite pentru interfetele SAX.
DefaultHandler implementare implicita a tuturor celor 4 interfete
pentru tratarea evenimentelor SAX.
AttributesImpl implementare implicita pt o lista de atribute
XML
...
Partea de extensii org.xml.sax.ext.
Folosirea SAX
Folosirea SAX presupune parcurgerea urmatorilor pasi:
Furnizarea de implementari pentru obiectele de tratare a evenimentelor SAX. O
metoda comoda este extinderea implementarii implicite din clasa
DefaultHandler. Aceasta clasa furnizeaza implementari implicite pentru toate
cele 4 interfete standard SAX. In cadrul acestei implmentari se vor redefini doar
metodele care sunt necesare.
Se creaza o clasa pentru reprezentarea unui analizor sintactic. Pentru aceasta este
util sa se utilizeze o biblioteca care sa dispuna deja de o astfel de implementare.
Spre exemplu, pachetul Xerces dispune de clasa SAXParser.
In programul principal se realizeaza urmatoarele prelucrari:
Se creaza un obiect de tratare a evenimentelor SAX..
Se creaza un obiect pentru reprezentarea unui analizor sintactic.
Se inregistreaza obiectul de tratare a evenimentelor la analizorul sintactic.
Se executa functia de analiza sintactica a obiectului analizor.
In functiile de tratare a evenimentelor de analiza sintactica se realizeaza toate
prelucrarile necesare din cadrul aplicatiei respective. Spre exemplu, se pot folosi
aceste evenimente pentru extragerea informatiilor relevante pentru aplicatie din
cadrul documentului XML si reprezentarea lor sub forma unei structuri
intermediare. Aceasta structura se poate prelucra ulterior.
Pentru citirea unui arbore binar dintr-un document XML si construirea unei reprezentari
interne adecvate vom folosi un analizor sintactic cu validare:
class ValidatingSAXParser extends SAXParser {
public ValidatingSAXParser() throws SAXException {
this.setFeature("http://xml.org/sax/features/validation", true);
}
DOM
Folosirea DOM
La fel ca si pentru SAX, folosirea DOM presupune existenta unei
biblioteci care sa implementeze interfetele DOM. O astfel de biblioteca
este pachetul Xerces.
Folosirea DOM presupune parcurgerea urmatorilor pasi:
Implementarea unui modul de prelucrare a informatiei dintr-un
document XML reprezentat sub forma unui arbore DOM.
In programul principal se realizeaza urmatoarele prelucrari:
Construirea unui obiect pentru reprezentarea unui analizor
sintactic conform cu DOM. Pachetul Xerces furnizeaza pentru
aceasta clasa DOMParser.
Se executa functia de analiza sintactica a obiectului analizor.
Se extrage obiectul document si se prelucreaza.
DOMParser parser = new DOMParser();
parser.parse( ... );
Document doc = parser.getDocument();
Element root = doc.getDocumentElement();
...
Ce este XSL ?
Scurt istoric
Una dintre sursele de inspiratie pentru XSL a fost DSSSL
Document Style Semantics and Specification Language. DSSSL este
un standard ISO referitor la prelucrarea documentelor SGML.
Asemanator cu XSL, DSSSL are doua componente: limbajul de
transformare si limbajul de formatare.
Desi este un standard ISO, numarul de implementari ale DSSSL este
foarte scazut. In plus, expertiza in folosirea DSSSL este foarte saraca.
Totusi, DSSSL are un avantaj cheie fata de XSL: faptul ca ofera un
limbaj de programare, bazat insa pe mai putin popularul Scheme
(derivat din Lisp). Acest lucru poate fi considerat a fi si un
dezavantaj.
O alta sursa de inspiratie pentru componenta de formatare a XSL a
constituit-o CSS. Desi sintaxa XSL-FO se bazeaza pe XML si este
astfel foarte diferita de sintaxa CSS, terminologiile folosite in XSLFO si CSS sunt foarte asemanatoare.
Transformari XSL
XSLT este un limbaj de transformare a unui document XML intr-un alt format.
Formatul de iesire poate fi tot XML (de exemplu XHTML sau WML) sau alt format
text.
Pentru producerea unei transformari este nevoie de trei elemente:
Sursa transformarii, documentul XML de intrare
Specificatia transformarii, un document XSLT
Motorul transformarii, un program numit procesor XSLT. Acest program aplica
specificatia XSLT a transformarii, sursei transformarii.
XSLT
XML
Motor de transformare
(Procesor XSLT)
XPath
XPath = limbaj pentru adresarea unei parti dintr-un
document XML. Un enunt XPath se numeste expresie.
Expresiile XPath se evalueaza la unul din tipurile:
Multime de noduri (engl.node-set). Un exemplu de astfel de xpresie
este o cale de localizare a unor noduri (engl.location path)
Boolean (true sau false)
Numar (numar real reprezentat in virgula mobila)
Sir de caractere (engl.string)
<group id="HR-QA-empl">
<mgr>
<employee id="Amelia"/>
</mgr>
<group id="HR-Amelia">
<employee id="Jane"/>
<employee id="Jake"/>
</group>
</group>
</group>
</group>
<topmgr>
<employee id="Bill"/>
<employee id="John"/>
<employee id="Amelia"/>
</topmgr>
</organization>
/organization/group
Rezultat (toate grupurile de nivel ierarhic 1):
/organization[1]/group[1] (grupul HR).
/organization//group
Rezultat (toate grupurile, indiferent de nivelul ierarhic):
//employee/attribute::id
Rezultat (numele tuturor angajatilor):
/organization/node()
Rezultat (toate nodurile descendente din elementul radacina (element, text, atribut):
/organization[1]/#text[1]
/organization[1]/group[1]
/organization[1]/#text[2]
/organization[1]/topmgr[1]
/organization[1]/#text[3]
count(//employee)
Rezultat (numarul angajatilor):
11
string(//employee/attribute::id)
Rezultat (numele primului angajat in ordinea standard):
Bill
//group/employee[last()]
Rezultat (ultimul angajat din lista fiecarui grup):
/organization[1]/group[1]/group[1]/group[1]/employee[2]
/organization[1]/topmgr[1]/employee[3]
(/organization) | (/organization/group)
Rezultat (organiztaia si grupurile de nivel ierarhic 1):
/organization[1]
/organization[1]/group[1]
Sabloane
O regula este aplicabila unui nod daca nodul se identifica cu
sablonul regulii.
Un sablon specifica o multime de conditii asupra unui nod.
Un nod se identifica (engl.matches) cu sablonul daca
satisface aceste conditii.
Un sablon este un caz particular de expresie XPath care se
evalueaza la o multime de noduri.
Un nod se identifica cu un sablon daca nodul este membru
al rezultatului evaluarii sablonului intr-un context posibil ce
poate fi chiar nodul respectiv sau un stramos al sau.
Spre exemplu un sablon employee se va identifica cu orice
element employee deoarece evaluand expresia employee
avand drept context parintele unui nod employee, nodul va
fi un element al rezultatului.
Reguli
Un document XSLT contine reguli de transformare. O regula de
transformare are sintaxa urmatoare:
<xsl:template match="sablon" mode="valoare">
tipar
</xsl:template>
Variabile si parametri
O variabila poate deveni legata (engl.bound) la o valoare, in
cadrul unei reguli.
Un parametru specifica o valoare implicita care poate fi
suprascrisa in momentul in care primeste o valoare prin
aplicarea unor reguli cu parametrii.
La aplicarea unei reguli cu parametrii, se pot specifica
valorile parametrilor, suprascriind astfel valorile implicite.
Legarea variabilelor se face cu elementul xsl:variable.
Definirea valorilor parametrilor in corpul unei reguli se
face cu elementul xsl:param. Valorile parametrilor la
apelul unei reguli se specifica cu elementul xsl:withparam.
Numele variabilelor si parametrilor se specifica cu atributul
name.
Tematica
Aceasta prelegere trateaza comunicarea intre OD folosind
invocarea metodelor la distanta (engl.remote method
invocation RMI). RMI are o semantica diferita fata de
invocarile locale.
Invocarea procedurilor la distanta (engl.remote procedure
call RPC) este varianta procedurala a RMI.
SD bazate pe evenimente (engl.distributed event-based
systems) permit obiectelor sa se inregistreze la OD de interes
astfel incat sa poata fi instiintate de aparitia unor
evenimente la acele OD. Evenimentele permit comunicarea
asincrona intre OD.
Ca studiu de caz se prezinta o aplicatie Java RMI.
Privire de ansamblu
Applications
Aceasta
prelegere
Middleware
layers
Interfete
Limbajele moderne de programare permit organizarea programelor sub forma unei multimi
de module care comunica intre ele. Comunicarea se face prin definirea unei interfete pentru
fiecare modul in parte.
Interfata unui modul specifica procedurile si variabilele sale ce pot fi accesate din alte
module.
Modulele unui SD pot rula in procese separate. Astfel ca un modul nu va putea accesa
variabilele din alt modul. Chiar daca de exemplu CORBA permite specificarea accesului la
anumite atribute, accesul propriuzis se va face prin medode getter si setter.
Tehnicile clasice de transfer a parametrilor (apel prin valoare si apel prin referinta) nu sunt
potrivite cand apelantul si apelatul sunt in procese diferite. Specificarea unei proceduri sau
metode intr-o interfata a unui modul intr-un SD se face prin parametrii de intrare si/sau de
iesire. Parametrii de intrare sunt transmisi modulului la distanta prin trimiterea valorilor lor
intr-un mesaj de cerere si apoi folosirea lor drept argumente pentru executarea operatiei la
server. Parametrii de iesire sunt returnati in mesajul de raspuns si sunt utilizati drept rezultat
al apelului sau vor inlocui valorile variabilelor corespunzatoare din mediul apelului. Cand un
parametru este atat de intrare cat si de iesire, valoarea corespunzatoare va fi transmisa atat
in mesajul de cerere cat si in cel de raspuns.
Deoarece pointerii dintr-un proces nu sunt valizi intr-un alt proces, ei nu se transmit ca
argumente si nu se returneaza ca rezultate in apeluri la distanta.
In modelul client-server, serverul furnizeaza o interfata pentru servicii IS (engl.service
interface). In SD obiectuale, un OD furnizeaza o interfata la distanta ID (engl.remote
interface). Intre ele exista diferenta ca metodele dintr-o ID pot transmite obiecte si/sau ROD
ca argumente si pot returna obiecte si/sau ROD ca rezultate.
Modelul obiectual
SD obiectuale
Starea unui obiect este multimea valorilor variabilelor membre. In
acest fel starea unui program obiectual este partitionata logic intr-o
multime de obiecte. Distribuirea fizica a acestor obiecte in procese
si/sau calculatoare diferite este o extensie naturala.
SD obiectuale pot adera la o arhitectura client-server. Obiectele sunt
gestionate de servere iar clientii pot invoca metodele acestora folosind
RMI. Obiectele din servere pot fi la randul lor clienti ale unor obiecte
din alte servere.
Obiectele dintr-un SD pot fi replicate pentru cresterea tolerantei la
defecte si imbunatatirea performantelor sau pot migra pentru
cresterea performantei si a disponibilitatii.
Faptul ca obiectele sunt gestionate de procese diferite forteaza
incapsularea. Obiectele pot folosi primitive de sincronizare pentru a-si
asigura accesul concurent corect la propriile variabile membre.
Accesul la obiecte doar prin metode permite independenta fata de
formatul de reprezentare si de platforma gazda.
local
remote
invocation
A
C
local E
invocation
invocation
local
invocation
D
remote
invocation
remote
interface
Data
m1
m2
m3
implementation
of methods
m4
m5
m6
Semantica RMI
Duplicate
filtering
Invocation
semantics
Re-execute procedure
or retransmit reply
No
Not applicable
Not applicable
Yes
No
Re-execute procedure
At-least-once
Yes
Yes
Retransmit reply
At-most-once
Maybe
Transparenta RMI
In general, invocarile la distanta sunt similare cu invocarile locale din
punct de vedere sintactic.
Cu toate acestea, invocarile la distanta sunt mai vulnerabile la erori
decat invocarile locale. Indiferent de semantica adoptata, exista
intotdeauna posibilitatea sa nu se obtina nici un rezultat si in cazul unei
erori sa nu se distinga intre o eroare de retea si o eroare in procesul
server. Din acest motiv trebuie ca obiectele care efectueaza invocari la
distanta sa poata recupera din eventualele erori.
Astfel se apreciaza ca diferentele dintre invocarile locale si invocarile la
distanta trebuie sa existe la nivelul interfetelor. Spre exemplu, in Java
RMI, OD se disting prin faptul ca implementeaza interfata Remote.
Ele pot genera exceptii RemoteException.
Implementatorii OD cu interfetele specificate printr-un IDL vor avea in
vedere faptul ca aceste obiecte pot fi accesate concurent de clienti
multiplii, trebuind sa ia masurile de proiectare corespunzatoare.
O alta varianta o reprezinta RMI tranzactional.
Implementarea RMI
Consta dintr-o multime de obiecte si module ce includ:
Modulul de comunicatie
Modulul de gestiune a ROD
Software-ul de RMI, ce contine obiectele proxy, skeleton si dispatcher.
Request
server
remote
skeleton
object B
& dispatcher
for Bs class
Reply
Communication
Remote
module
reference module
Modulul de comunicatie:
Existe doua module de comunicatie care interactioneaza cu un protocol RR. Aceste module
vor folosi doar primele trei campuri din cadrul mesajelor de cerere-raspuns: messageType,
requestId si objectReference.
Modulele de comunicatie sunt responsabile sa asigura o anumita semantica, de exemplu atmost-once.
Modulul de comunicatie din server selecteaza obiectul dispatcher corespunzator clasei
obiectului invocat. Pentru aceasta el obtine referinta locala a obiectului de la modulul
pentru referinte la distanta, dupa ce i-a transmis ROD din cadrul mesajului de cerere.
Software-ul de RMI
Persistenta obiectelor.
Un obiect care transcede peste activarile/dezactivarile proceselor server se
numeste obiect persistent OP. Un astfel de obiect este in general gestionat de o
memorie de OP MOP care stocheaza starea sa in forma impachetata pe disc.
O MOP gestioneaza un numar foarte mare de OP. Ele sunt activate in momentul
invocarii lor de catre alte obiecte. Activarea este transparenta din punctul de
vedere al obiectului apelant. Cand nu mai sunt necesare in memorie, OP sunt
pasivizate si salvate in MOP. MOP are nevoie de o strategie pentru pasivizarea OP
(de exemplu la sfarsitul unei tranzactii, cand OP au o stare consuistenta, sau la
terminarea programului). MOP realizeaza si o optimizare, salvand doar acele
obiecte care au fost modificate de la ultima salvare.
Modelul evenimentelor
Ideea acestui model este ca anumite obiecte pot fi instiintate astfel incat sa
reactioneze in cazul unor evenimente receptionate de alte obiecte.
De exemplu, in aplicatiile interactive, anumite actiuni ale utilizatorului
asupra obiectelor interfetei grafice sunt privite drept evenimente care
determina schimbari in obiectele ce mentin starea aplicatiei.
Similar, obiectele care sunt responsabile pentru afisarea unei vederi a starii
curente a aplicatiei sunt instiintate (engl.notified) atunci cand aceasta stare se
schimba.
SD bazate pe evenimente extind acest model astfel incat evenimentele sa poata
avea loc la OD. Ele utilizeaza tehnica de publicare-inscriere (engl.publishsubscribe) sau publicare-abonare.
Obiectele care genereaza evenimente isi publica tipurile de evenimente care pot fi
puse sub observatie de catre alte obiecte.
Obiectele care doresc sa primeasca instiintari de la obiectele generatoare de
evenimente trebuie sa se inscrie la ele pentru tipurile de evenimente de interes.
De obicei tipurile diferite de evenimente se refera la metodele care vor fi apelate la
obiectele receptoare.
Obiectele care reprezinta evenimente se numesc instiintari (engl.notifications).
Atunci cand un obiect generator semnaleaza un eveniment, toate obiectele
inregistrate sa primeasca acest eveniment vor fi instiintate.
object of interest
1.
notification
object of interest
2.
object of interest
3.
subscriber
observer
notification
notification
observer
subscriber
notification
Java RMI extinde modelul obiectual Java pentru a furniza suport pentru SD
obiectuale direct in cadrul limbajului Java.
Java RMI permite invocarea OD folosind aceeasi sintaxa ca si invocarile locale.
Un OD este constient de faptul ca va fi apelat de la distanta, el fiind fortat sa
implementeze interfata Remote.
Un obiect ce realizaeaza o invocare la distanta este constient ca apelul este unul la
distanta, fiind obligat sa trateze exceptiile RemoteException.
Spre deosebire de CORBA, nu este nevoie ca programatorul sa invete un IDL.
Probleme specifice ale Java RMI:
Studiu de caz:
Se considera exemplul unei table partajate (engl.shared whiteboard). Este o aplicatie
distribuita care deserveste un grup de utilizatori, furnizandu-le o suprafata comuna de
desenare. Utilizatorii au acces la o vedere comuna a suprafetei, ce prezinta obiectele grafice
desenate (linii, dreptunghiuri, cercuri).
Serverul mentine starea curenta a desenului. El ofera clientilor operatii de informare
asupra ultimelor figuri desenate, gestionand multimea tuturor acestor figuri. Fiecarei
figuri ii este atasat un numar de versiune care se incrementeaza automat de server.
import java.rmi.*;
import java.util.Vector;
public interface ShapeList extends Remote {
Shape newShape(GraphicalObject g)
throws RemoteException;
Vector allShapes()
throws RemoteException;
int getVersion()
throws RemoteException;
}
Clasa GraphicalObject
import java.awt.Rectangle;
import java.awt.Color;
import java.io.Serializable;
public class GraphicalObject implements Serializable {
public String type;
public Rectangle enclosing;
public Color line;
public Color fill;
public boolean isFilled;
public GraphicalObject() { }
public GraphicalObject(String aType, Rectangle anEnclosing,
Color aLine,Color aFill, boolean anIsFilled) {
type = aType;
enclosing = anEnclosing;
line = aLine;
fill = aFill;
isFilled = anIsFilled;
}
public void print(){
System.out.print(type);
System.out.print(enclosing.x + " , " + enclosing.y + " , "
+ enclosing.width + " , " + enclosing.height);
if (isFilled) System.out.println("- filled");
else System.out.println("not filled");
}
}
Clasa ShapeServer
import java.rmi.*;
public class ShapeListServer {
public static void main(String args[]) {
System.setSecurityManager(new RMISecurityManager());
System.out.println("Main OK");
try {
ShapeList aShapelist = new ShapeListServant();
System.out.println("After create");
Naming.rebind("ShapeList", aShapelist);
System.out.println("ShapeList server ready");
} catch(Exception e) {
System.out.println("ShapeList server main " +
e.getMessage());
}
}
}
Clasa ShapeServant
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class ShapeServant
extends UnicastRemoteObject implements Shape {
int myVersion;
GraphicalObject theG;
public ShapeServant(GraphicalObject g, int version)
throws RemoteException{
theG = g;
myVersion = version;
}
public int getVersion() throws RemoteException {
return myVersion;
}
public GraphicalObject getAllState() throws RemoteException {
return theG;
}
}
Clasa ShapeListServant
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;
public class ShapeListServant
extends UnicastRemoteObject implements ShapeList {
private Vector theList;
private int version;
public ShapeListServant() throws RemoteException {
theList = new Vector();
version = 0;
}
public Shape newShape(GraphicalObject g) throws RemoteException {
version++;
Shape s = new ShapeServant(g,version);
theList.addElement(s);
return s;
}
public Vector allShapes() throws RemoteException {
return theList;
}
public int getVersion() throws RemoteException {
return version;
}
}
Clasa ShapeClient
import java.rmi.*;
import java.rmi.server.*;
import java.util.Vector;
public class ShapeListSmallClient {
public static void main(String args[]) {
System.out.println("option = " + option + "shape = " + shapeType);
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
else
System.out.println(
"Already has a security manager,so cant set RMI SM");
ShapeList aShapeList = null;
try {
aShapeList = (ShapeList) Naming.lookup("//localhost/ShapeList");
Vector sList = aShapeList.allShapes();
} catch(RemoteException e) {
System.out.println("allShapes: " + e.getMessage());
} catch(Exception e) {
System.out.println("Lookup: " + e.getMessage());
}
}
}
4.
5.
6.