Tehnologii fundamentale Java
pentru aplicaţii Web
Autori: Florian Mircea Boian, Rareş Florin Boian
C U P R I N S
1.1.1 Programul
standalone Salut
1.1.3 Un program ce
poate rula alternativ standalone sau applet
1.1.4 Acces la
argumentele liniei de comandă
1.2 Scurtă prezentare a limbajului Java
1.2.1 Java comparat
cu C şi C++
1.2.2 Modificatorii
static, final, syncronized şi native
1.2.4 Tipuri de date
primitive
1.3.1 Instanţiere
şi distrugere obiecte; constructori
1.3.2 Definiri
statice (clasă): variabile, metode, iniţializatori
1.4.1 Definirea unei
interfeţe
1.4.2 Implementarea
interfeţelor
1.4.3 Apelul
metodelor prin variabile referinţe la interfeţe
1.5.1 Calcule
aritmetice simple
1.5.1.1 Distanţa între două puncte
1.5.1.2 Calculul unor medii ponderate
1.5.2 Generarea de
elemente aleatoare
1.5.2.2 Generarea de expresii booleene
1.6.1 Elemente de
limbaj Java în contextul thread-urilor
1.6.1.1 Obiecte versus thread-uri
1.6.2 Operaţii
asupra thread-urilor Java; creare, terminare
1.6.2.2 Terminarea unui thread
1.6.2.3 Aşteptarea terminării unui thread
1.6.3 Sincronizarea
thread-urilor Java
1.6.3.1 Conceptul de monitor Java; synchronized
1.6.3.2 Mecanismul wait / notify
1.6.3.3 O schemă exemplu de sincronizări
1.6.4 Un exemplu de
multithreading: alinierea cuvintelor într-un fişier text
1.6.4.1 Clasa RecipientCuvinte
1.6.4.2 Clasa ProducătorCuvinte
1.6.4.3 Clasa ConsumatorCuvinte
1.7 Procese externe lansate din Java
2 Intrări / ieşiri (locale); pachetul
java.io
2.1 Acces prin stream şi acces random
2.2 Gestiunea structurii de fişiere: clasa
File
2.3.1 Principalele
metode pentru citire
2.3.1.1 Metode de citire binară fără interpretare
2.3.1.2 Metode de citire binară cu interpretare
2.3.1.3 Citire text şi conversie
2.3.2 Principalele
metode de scriere
2.3.2.1 Metode de scriere binară fără interpretare
2.3.2.2 Metode de scriere binară cu interpretare
2.3.2.3 Metode de conversie şi scriere text
2.4 Exemple de programe care execută
operaţii I/O
2.4.1.1 Câteva scenarii tipice
2.4.1.2 Rezumatul unui director
2.4.1.3 Tipărirea numerelor cu format
2.4.2.1 Copiere într-o variantă simplă
2.4.2.2 Copiere "complicată", cu multe controale
2.4.2.3 Copiere cu un test EOF mai “deosebit”
2.4.2.4 Copiere prin schema cadru a unui program filtru
2.4.2.5 Copiere prin redirectare din interior
2.4.3 Conversia
tipurilor primitive la tablou de bytes
2.4.3.1 Reprezentări dependente de platformă şi o
uniformizare a lor
2.4.3.2 Implementarea conversiilor în Java
2.4.3.3 Implementarea conversiilor în C
2.4.4.1 Simularea unui vector mare
2.4.4.2 Comprimarea (Zip) a fişierelor
2.4.4.3 Serializarea şi păstrarea persistenţei
obiectelor Java
2.4.4.4 Gruparea fisierelor listabile
2.4.4.5 Afişare ASCII şi hexazecimală
2.4.4.6 Blocarea accesului la (o porţiune dintr-)un
fişier
2.4.4.7 Fragmentarea şi reunirea fişierelor foarte mari
3 Servicii Java de acces la resurse
3.1 JNDI (Java Naming and Directory Interface)
3.1.3 Context şi
InitialContext
3.1.3.1 Proprietăţile de definire a contextului
iniţial
3.1.3.2 Cum se transmit proprietăţile către JNDI?
3.1.3.3 Metode apelabile din obiecte Context
3.1.4 Un exemplu de
utilizare JNDI Naming
3.1.5 JNDI –
introducere în serviciul de directori
3.1.5.1 DirContext şi InitialDirContext; atribute
3.1.5.3 Căutarea după atribute
3.2 JDBC (Java Data Base Connectivity)
3.2.2 Scenariul
conectării prin JDBC la o bază de date
3.2.2.2 Baze de date Note în Access,Oracle, MsSQLServer, MySQL
3.2.2.3 Incărcarea unui driver
3.2.2.4 Creearea unei conexiuni
3.2.2.5 Creearea şi utilizarea obiectelor Statement
3.2.2.6 Exploatarea obiectelor ResultSet
3.2.3 Utilizarea JDBC
împreună cu JNDI
3.2.4 Exemplu: acces
la baze de date prin clasa NivelJDBC
3.2.4.2 Exemplu de utilizare NivelJDBC
4 Comunicaţii Java folosind socket
4.1 Prezentarea generală a pachetului
java.net
4.1.2 Câteva servicii
standard de comunicaţii
4.2 Gestiunea adreselor Internet: InetAddress
4.3 Transmitera si recepţionarea prin UDP
4.3.3 Exemple de
comunicaţii prin UDP
4.3.3.2 Consultarea unui server time
4.3.3.3 Un alt exemplu de comunicaţie prin UDP
4.5 Exemple de comunicaţii TCP
4.5.2 O
aplicaţie rezumat la distanţă: RemoteDir
4.5.2.1 Programul ServerRemoteDir
4.5.2.2 Clientul standalone RemoteDir
4.5.2.3 Clientul applet RemoteDirApp
4.5.2.4 Client RemoteDir scris în C
4.5.3 Folosirea ca
partener a unor servicii standard
4.5.3.1 Consultarea unui server time prin TCP
4.5.3.2 Autentificare folosind un server FTP
4.5.3.3 Autentificarea prin server POP3
4.5.3.4 Un server de comenzi apelabil prin telnet
4.6 Accesul la resurse Internet prin URL
4.6.1 Clasele URL
şi URLConnection
4.6.2 Exemplu de
acces la o resursă Internet
4.7 CGI şi comunicaţii prin
URLConnection
4.7.2 Transformarea
unui şir printr-un CGI
4.7.2.2 Un client Java standalone Stand2CGI
4.7.2.3 Un client applet Applet2CGI
4.7.3 Construcţia
unui contor de pagini Web
4.7.3.1 Iniţializarea fişierului contor
4.7.3.3 Appletul de apel al contorului
4.7.4 Istoricul
consultării unei pagini Web
5 Apelul la distanţă al obiectelor
Java (RMI)
5.1 Scenariul dezvoltării unei
aplicaţii RMI expus pe un exemplu
5.1.1 Componentele
mecanismului RMI
5.1.2 Inregistrarea
obiectelor la distanţă
5.1.3 Interfaţa
la distanţă (Echo)
5.1.4 Implementarea
obiectului servant
5.1.5 Implementarea
serverului (EchoServer)
5.1.6 Utilizarea unui
obiect la distanţă
5.1.6.1 Aplicaţia standalone EchoClient
5.1.6.2 Clientul applet EchoApplet
5.2 Precizări privind "interiorul"
RMI
5.2.2 Parametri si
Valori Returnate
5.2.3 Incărcarea
dinamică a claselor
5.2.4 Implicaţii
de securitate
5.3 RMI peste JRMP cu căutare folosind
serviciul JNDI
5.3.1 Particularităţi
ale RMI cu JNDI
5.3.1.1 Avantajele RMI cu JNDI
5.3.1.2 Modificările necesare rescrierii aplicaţiior
RMI clasic la JNDI
5.3.2 Aplicaţia
Echo rulată cu JNDI
5.3.2.1 Principalele modificări
5.3.2.2 Sursele Echo
pentru JNDI
5.4.2 Scenariul
dezvoltării unei aplicaţii RMI cu activare
5.4.2.1 Crearea unui obiect server cu activare.
5.4.2.2 Programul "Setup" de informare a mecanismului
de activare
5.4.2.3 Paşii de operare necesari activării
5.5 O aplicaţie "Note"
elaborată folosind RMI
5.5.1 Cerinţele
aplicaţiei Note şi arhitectura
5.5.1.1 Arhitectura aplicaţiei
5.5.1.2 Cerinţe asupra sistemelor
5.5.1.3 Autentificări, capturi catch şi stabilirea de
drepturi
5.5.2 Definirea
interfeţelor Remote
5.5.2.1 Clasa auxiliară Perechi
5.5.3 Acţiuni
off-line asupra CATALOG
5.5.3.1 Programul BatchCatalog
5.5.3.2 Programul MaterieProfesor
5.5.4.3 Programul SetupProfesorAct
5.5.5.3 Programul SetupStudentAct
6 CORBA – dezvoltarea aplicaţiilor
distribuite eterogene
6.1 Eterogenitatea - cauza fundamentală a
apariţiei CORBA
6.2.1 Modelul de
referinţă CORBA
6.2.3 Limbajul de
definire a interfeţelor IDL
6.2.3.3 Signaturi de operaţii în IDL
6.2.3.4 Corespondenţa între IDL şi diverse limbaje de
implementare
6.2.4 Etapele
dezvoltării unei aplicaţii în CORBA
6.3 Exemple: implementări CORBA ale
aplicaţiei Echo
6.3.1 Implementările
şi serviciul de nume
6.3.1.1 Implementările CORBA folosite
6.3.2 Echo prin CORBA-Java-IDL
6.3.2.1 Definirea interfeţei IDL şi maparea ei în Java
6.3.2.2 Implementarea clasei servant şi a serverului
6.3.2.3 Implementarea clasei client
6.3.3 Echo prin CORBA
folosind C++
6.3.3.1 Instalarea şi configurarea omniORB
6.3.3.2 Interfaţa şi maparea C++
6.3.3.3 Configurarea mediului Visual C++6.0
6.3.3.4 Implementarea In C++ a servantului şi a serverului
6.3.3.5 Implementarea clasei client
6.3.4 RMI peste IIOP
(RMI-IIOP)
6.3.4.1 Configurarea contextului iniţial
6.3.4.3 Implementarea obiectului servant şi a
serverului
6.3.4.4 Implementarea clientului
6.4 Interoperabilitate CORBA-CORBA şi
CORBA-RMI
6.4.1 Interoperabilităţile
aplicaţiilor CORBA Echo
6.4.1.2 Interoperabilitate CORBA-Java-IDL cu omniORB
6.4.1.3 Interoperabilitate CORBA-Java-IDL cu RMI-IIOP
6.4.1.4 Interoperabilitate RMI-IIOP cu omniORB
6.4.2 Avantaje
şi neajunsuri ale interoperabilităţii
6.4.2.1 Scurte comparaţii RMI - CORBA
6.4.2.3 Client RMI cu server CORBA
6.4.2.4 Client CORBA cu server RMI
6.4.2.5 Avantajele folosirii RMI-IIOP
6.4.2.6 Dificultăţi posibile la RMI-IIOP
6.5 Teste comparative ale implementărilor Echo
6.5.1 Adaptarea
surselor Echo RMI clasic şi Echo RMI-JNDI
6.5.1.1 Sursele adaptate pentru Echo RMI clasic
6.5.1.2 Sursele adaptate Echo JNDI
6.5.1.3 In ce a constat testul?
7.1 Conceptul de servlet; containere de
servleturi
7.1.1 Locul servlet
între tehnologiile Web
7.1.2 Arhitecturile
aplicaţiilor servlet
7.1.3.2 Instalarea şi configurarea Tomcat
7.1.3.4 Contextul unei aplicaţii Servlet: definire şi
creeare
7.1.3.5 Structura de subdirectoare a unui context şi
invocarea de resurse
7.1.3.6 Tomcat conectat la Apache
7.1.4 Funcţionarea
unui servlet
7.1.4.2 Interacţiunea cu clienţii
7.1.4.3 Primul exemplu şi compilarea unui servlet
7.1.4.4 Interacţiunea cu containerul
7.1.4.5 Configurarea şi iniţializarea servleturilor;
exemple
7.1.5 Servlet
vis-a-vis cu CGI
7.1.5.1 Avantajele Servlet faţă de CGI
7.1.5.2 Acces la variabilele de mediu CGI
7.2 Facilităţi specifice servlet
7.2.1 Exemple de
aplicare GET, POST, forward
7.2.1.1 Servletul Maxim, apelat prin GET şi prin POST
7.2.1.2 Servletul DisplayQueryString
7.2.1.3 Servletul MaximForward
7.2.2 Comunicare
applet - servlet
7.2.2.1 Elemente specifice de comunicare
7.2.2.2 Clientul Applet2Servlet
7.2.2.3 Servletul Servlet2Applet
7.2.3.2 Exemplu de utilizare cookies
7.2.4.2 Implementarea unui counter de pagină Web
7.3 Câteva exemple mai complexe
7.3.1 Trimiterea de mesaje email din servlet
7.3.1.2 Clasa Mailer, expeditor de mesaje email
7.3.1.3 Clasa HTML.java, auxiliar pentru servlet
7.3.2 Aplicaţia
Note, versiunea servlet
7.3.2.2 Programul ServletProfesorDB
7.3.2.3 Programul ServletStudentDB
7.3.3 Conectare JDBC
din Tomcat prin JNDI
7.3.3.1 Definirea referinţei la resursa bază de date
7.3.3.2 Utilizarea referinţei în codul Java
7.3.3.3 Definirea resursei baza de date
8.1.1 Privire
generală şi câteva exemple simple
8.1.1.2 Alfabet afişat circular
8.1.1.3 Cinci numere aleatoare
8.1.3 Sumar al sintaxei construcţiilor JSP
8.2 Text static HTML şi comentarii
8.3.1 Elementele de
scripting JSP
8.3.1.5 Exemplu: determinarea maximului a două numere
8.3.2 Directive, includeri, forward
8.4 Utilizarea beanurilor în pagini JSP
8.4.1.1 Sintaxe şi semnificaţii useBean
8.4.2 Un exemplu:
aplicaţia Note în varianta JSP
8.4.2.1 Particularităţi ale implementării JSP
8.5 Extinderea JSP prin taguri utilizator
8.5.1 API şi
posibilităţi de construcţie a unor taguri noi
8.5.1.1 Taguri utilizator şi locuri din context cu
informaţii despre ele
8.5.1.2 Declarare şi descriere formală
8.5.1.3 Descrierea funcţionării unui tag folosind un
bean
8.5.2 Exemplu:
tagurile Semnat şi Ordonat
8.5.2.1 Definirea tagurilor Semnat şi Ordonat
8.5.2.2 Definirea claselor tagurilor
8.5.2.3 Definirea formală a bibliotecii de taguri
8.5.2.4 Declararea tagurilor în web.xml
8.5.2.5 O pagină de utilizare a tagurilor
8.5.2.6 Plasarea fişierelor în context şi relaţii
între ele
8.5.2.7 Utilizarea noilor taguri
Societatea
actuală este puternic influenţată de impactul fenomenului
Internet. Infrastructura Web, ca şi componentă esenţială a
Internet (fără a se confunda cu acesta), oferă un mijloc extrem
de eficient de consultare şi de informare în toate
domeniile. Universul Web poate fi asimilat, fără a greşi deloc,
cu o imensă bibliotecă publică. Puţini dintre cei ce
navighează în Internet ştiu câtă investiţie
intelectuală trebuie depusă de către cei aflaţi “în spatele
scenei”, designerii şi programatorii Web, pentru dezvoltarea
şi funcţionarea eficientă a unor astfel de aplicaţii.
In prezent, piaţa
cere elaborarea rapidă de noi şi noi aplicaţii peste Web. Pentru
creşterea vitezei de elaborare a aplicaţiilor distribuite,
mărirea fiabilităţii şi a securităţii acestora,
se impune ca aspectele de rutină legate de gestiunea reţelelor
să fie efectuate în mod automat de către componente gata preparate.
Tehnologiile Web, parte esenţială a tehnologiilor "middleware", răspund acestor
cerinţe oferind instrumente specifice. Aceste instrumente, bazate în
special pe obiecte abstracte şi pe componente, preiau în mod transparent o
mare parte dintre aspectele de comunicaţii.
Apariţia
limbajului Java şi a tehnologiilor bazate pe Java a condus rapid la
creşterea numărului de aplicaţii peste Web şi a
complexităţii acestora. De asemenea, a crescut viteza de proiectare
şi implementare, ca şi siguranţa în funcţionare a
aplicaţiilor. Java este, figurat vorbind, briliantul şi nicovala
programării Web. Briliant pentru că programarea în Java
satisface cele mai rafinate gusturi (profesionale) ale programatorilor, putând
fi asociată cu o artă. Nicovală pentru că
instrumentele şi tehnologiile de dezvoltare au un pronunţat caracter
tehnologic, operând cu obiecte şi componente (logice) care se
asamblează spre a forma întregul, adică aplicaţia
distribuită.
Acestea sunt premisele
de elaborare a prezentei lucrări, prima de acest fel din literatura
romană. Ea îşi propune să prezinte într-o formă
unitară şi accesibilă tehnologiile fundamentale folosite
în aplicaţiile Web bazate pe Java. Este vorba de tehnologiile socket, CGI,
RMI, CORBA, servlet şi JSP. Peste acestea s-au dezvoltat tehnologiile
avansate Java, printre care amintim EJB, JINI, JavaSpaces, XML, SOAP
ş.a. care vor face obiectul altei lucrări.
Prezenta lucrare este
structurată pe opt capitole. In capitolul 1 se face o trecere în
revistă a elementelor esenţiale ale limbajului Prin exemple potrivit
alese, sunt prezentate (reamintite) elemente specifice Java: compararea cu C++,
tratarea excepţiilor, interfeţe, lucrul cu threaduri etc.
Capitolul 2 tratează operaţiile de intrare /
ieşire, deoarece toate comunicaţiile se reduc, în ultimă
instanţă, la utilizarea de obiecte specializate pe operaţii I/O.
Capitolul 3 abordează prima tehnologie
specifică. Este vorba de accesul la resurse Internet prin tehnologia JNDI
(Java Naming and Directory Interface). Tot aici, datorită
înrudirilor dintre ele, am abordat şi problema accesului la date prin
tehnologia JDBC (Java Data Base Connectivity).
Capitolul 4 abordează temelia Web: comunicarea prin socket.
Java oferă instrumente elegante de comunicare socket, care se
regăsesc mai puţin la celelalte limbaje. Se prezintă mai întâi
aplicaţii client / server prin TCP şi UDP. Este acordată o
atenţie deosebită aplicaţiilor în care unul dintre parteneri
(clientul sau serverul) este un serviciu standard de comunicaţii (FTP,
POP3, telnet, server Web etc.). Tot aici se reia tehnologia clasică Web- CGI (Common Gateway Interface),
cu Java pentru partea de client, deoarece oferă posibilităţi
inaccesibile altor clienţi CGI.
Capitolul 5 prezintă o tehnologia RMI (Remote
Method Invocation). Apărută în 1996, RMI a avut şi are
încă o extrem de mare căutare printre proiectanţi, datorită
simplităţii de dezvoltare a aplicaţiilor distribuite,
combinată cu gradul înalt de abstractizare a abordărilor obiectuale.
In esenţă este vorba de posibilitatea de a apela metode ale unor
obiecte aflate la distanţă, de eventuala activare a obiectelor
înainte de a fi invocate etc. Pe lângă aplicaţiile propriuzise RMI,
majoritatea tehnologiilor avansate (EJB, JINI etc.) folosesc RMI ca suport
pentru generarea automată a unor servicii evoluate.
Capitolul 6 abordează tehnologia CORBA (Common Object Request Broker Architecture), cu accent pe interoperabilitate. Ca studii de
caz sunt tratate două implementări CORBA folosind Java şi una
folosind C++. Una dintre implementările Java este CORBA clasică, iar
cealaltă este o adaptare a RMI. Sunt prezentate exemple de clienţi
şi servere cu toate cele trei tehnologii ca şi apeluri de componente
din implementări CORBA diferite.
Capitolul 7 prezintă tehnologia servlet,
replică Java la tehnologia CGI. Mai întâi sunt prezentate noţiunile
de servlet şi container de servlet. Se compară apoi CGI cu servlet,
competiţie în care servlet este net câştigător. Sunt abordate
apoi elemente mai deosebite legate de servlet: comunicare applet - servlet,
cookies, sesiuni, facilităţi ale containerului relativ la JDBC prin
JNDI.
Capitolul 8 prezintă JSP (Java Server Pages),
una dintre cele mai aplicate tehnologii în aplicaţii Web. După o
scurtă prezentare a elementelor de bază ale JSP, capitolul
insistă asupra a două facilităţi remarcabile de
interacţiune cu obiectele Java: beanurile JSP şi extensii ale JSP
prin definirea de taguri utilizator.
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, aplicaţii Web oricât de mari. S-a pus un accent deosebit pe exemple de aplicaţii, dintre cele mai diverse, de la cele mai simple la cele mai complicate, cu toate sursele expuse în lucrare. Astfel, apar foarte multe texte sursă Java, C, C++, HTML, XML, fişiere de comenzi, mici fişiere de date etc. Toate acestea sunt numerotate separat în cadrul fiecărui capitol, sub forma: Programul c.n. Intr-o anexă este prezentată lista acestor programe. Autorii au creat o arhivă cu aceste surse, accesibile prin anonymous-FTP de la adresa: ftp.ubbcluj.ro.
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ă o listă a acestor figuri.
Lucrarea se adresează în primul rând informaticienilor: studenţi, programatori, data designeri, project manageri etc. Este de asemenea utilă tuturor celor care vor să se autoinstruiască în elaborarea de aplicaţii distribuite.
Autorii mulţumesc tuturor celor care i-au sprijinit într-un fel sau altul la elaborarea prezentei lucrări. Sunt de asemenea recunoscători tuturor cititorilor care le vor adresa sugestii, observaţii sau întrebări legate de lucrare. Adresele e-mail de contact sunt: florin@cs.ubbcluj.ro, rares@cs.ubbcluj.ro
Cluj-Napoca, ianuarie 2004 Autorii