Tehnologii fundamentale Java pentru aplicaţii Web

 

Autori: Florian Mircea Boian, Rareş Florin Boian

 

C U P R I N S

 

0   Introducere. 9

1   Compendiu Java.. 11

1.1      Primele exemple. 11

1.1.1       Programul standalone Salut 11

1.1.2       Appletul SalutAp. 12

1.1.3       Un program ce poate rula alternativ standalone sau applet 13

1.1.4       Acces la argumentele liniei de comandă. 15

1.2      Scurtă prezentare a limbajului Java.. 16

1.2.1       Java comparat cu C şi C++.. 16

1.2.2       Modificatorii static, final, syncronized şi native. 19

1.2.3       Cuvinte cheie. 20

1.2.4       Tipuri de date primitive. 20

1.2.5       Tipul referinţă obiect 21

1.3      Tratarea excepţiilor.. 22

1.3.1       Instanţiere şi distrugere obiecte; constructori 24

1.3.2       Definiri statice (clasă): variabile, metode, iniţializatori 26

1.4      Interfeţe Java.. 27

1.4.1       Definirea unei interfeţe. 27

1.4.2       Implementarea interfeţelor. 28

1.4.3       Apelul metodelor prin variabile referinţe la interfeţe. 28

1.5      Exemple de programe Java.. 28

1.5.1       Calcule aritmetice simple. 28

1.5.1.1     Distanţa între două puncte. 28

1.5.1.2     Calculul unor medii ponderate. 29

1.5.2       Generarea de elemente aleatoare. 30

1.5.2.1     Generarea de parole. 30

1.5.2.2     Generarea de expresii booleene. 30

1.5.3       Ordonare linii 31

1.6      Threaduri Java.. 33

1.6.1       Elemente de limbaj Java în contextul thread-urilor. 33

1.6.1.1     Obiecte versus thread-uri 33

1.6.1.2     Clasa Thread. 34

1.6.2       Operaţii asupra thread-urilor Java; creare, terminare. 35

1.6.2.1     Crearea unui thread. 35

1.6.2.2     Terminarea unui thread. 36

1.6.2.3     Aşteptarea terminării unui thread. 37

1.6.3       Sincronizarea thread-urilor Java. 37

1.6.3.1     Conceptul de monitor Java; synchronized. 37

1.6.3.2     Mecanismul wait / notify. 38

1.6.3.3     O schemă exemplu de sincronizări 39

1.6.4       Un exemplu de multithreading: alinierea cuvintelor într-un fişier text 40

1.6.4.1     Clasa RecipientCuvinte. 41

1.6.4.2     Clasa ProducătorCuvinte. 42

1.6.4.3     Clasa ConsumatorCuvinte. 43

1.6.4.4     Clasa AliniereCuvinte. 45

1.7      Procese externe lansate din Java.. 45

2   Intrări / ieşiri (locale); pachetul java.io.. 48

2.1      Acces prin stream şi acces random... 48

2.2      Gestiunea structurii de fişiere: clasa File. 49

2.3      Citiri şi scrieri 49

2.3.1       Principalele metode pentru citire. 50

2.3.1.1     Metode de citire binară fără interpretare. 50

2.3.1.2     Metode de citire binară cu interpretare. 50

2.3.1.3     Citire text şi conversie. 51

2.3.2       Principalele metode de scriere. 52

2.3.2.1     Metode de scriere binară fără interpretare. 52

2.3.2.2     Metode de scriere binară cu interpretare. 52

2.3.2.3     Metode de conversie şi scriere text 53

2.4      Exemple de programe care execută operaţii I/O.. 54

2.4.1       Exemple simple de I/O.. 54

2.4.1.1     Câteva scenarii tipice. 54

2.4.1.2     Rezumatul unui director 55

2.4.1.3     Tipărirea numerelor cu format 56

2.4.2       Copieri de fişiere. 57

2.4.2.1     Copiere într-o variantă simplă. 57

2.4.2.2     Copiere "complicată", cu multe controale. 57

2.4.2.3     Copiere cu un test EOF mai “deosebit”. 60

2.4.2.4     Copiere prin schema cadru a unui program filtru. 60

2.4.2.5     Copiere prin redirectare din interior 61

2.4.3       Conversia tipurilor primitive la tablou de bytes. 62

2.4.3.1     Reprezentări dependente de platformă şi o uniformizare a lor 62

2.4.3.2     Implementarea conversiilor în Java. 64

2.4.3.3     Implementarea conversiilor în C.. 66

2.4.4       Alte exemple de I/O.. 70

2.4.4.1     Simularea unui vector mare. 70

2.4.4.2     Comprimarea (Zip) a fişierelor 71

2.4.4.3     Serializarea şi păstrarea persistenţei obiectelor Java. 73

2.4.4.4     Gruparea fisierelor listabile. 75

2.4.4.5     Afişare ASCII şi hexazecimală. 77

2.4.4.6     Blocarea accesului la (o porţiune dintr-)un fişier 79

2.4.4.7     Fragmentarea şi reunirea fişierelor foarte mari 81

3   Servicii Java de acces la resurse. 84

3.1      JNDI (Java Naming and Directory Interface) 84

3.1.1       Servicii de nume. 84

3.1.2       Ce este JNDI?. 86

3.1.3       Context şi InitialContext 86

3.1.3.1     Proprietăţile de definire a contextului iniţial 87

3.1.3.2     Cum se transmit proprietăţile către JNDI?. 87

3.1.3.3     Metode apelabile din obiecte Context. 89

3.1.4       Un exemplu de utilizare JNDI Naming. 90

3.1.5       JNDI – introducere în serviciul de directori 92

3.1.5.1     DirContext şi InitialDirContext; atribute. 93

3.1.5.2     Operarea cu atribute. 93

3.1.5.3     Căutarea după atribute. 94

3.1.6       Arhitectura JNDI 95

3.2      JDBC (Java Data Base Connectivity) 96

3.2.1       Arhitectura JDBC.. 96

3.2.2       Scenariul conectării prin JDBC la o bază de date. 97

3.2.2.1     Paşii scenariului 97

3.2.2.2     Baze de date Note în Access,Oracle, MsSQLServer, MySQL. 98

3.2.2.3     Incărcarea unui driver 100

3.2.2.4     Creearea unei conexiuni 100

3.2.2.5     Creearea şi utilizarea obiectelor Statement 102

3.2.2.6     Exploatarea obiectelor ResultSet 102

3.2.3       Utilizarea JDBC împreună cu JNDI 103

3.2.4       Exemplu: acces la baze de date prin clasa NivelJDBC.. 104

3.2.4.1     Clasa NivelJDBC.. 104

3.2.4.2     Exemplu de utilizare NivelJDBC.. 106

4   Comunicaţii Java folosind socket.. 109

4.1      Prezentarea generală a pachetului java.net.. 109

4.1.1       Principalele clase. 109

4.1.2       Câteva servicii standard de comunicaţii 110

4.2      Gestiunea adreselor Internet: InetAddress. 110

4.3      Transmitera si recepţionarea prin UDP. 111

4.3.1       Clasa DatagramPacket 111

4.3.2       Clasa DatagramSocket 112

4.3.3       Exemple de comunicaţii prin UDP.. 113

4.3.3.1     Un talk simplu. 113

4.3.3.2     Consultarea unui server time. 116

4.3.3.3     Un alt exemplu de comunicaţie prin UDP. 119

4.4      Comunicare prin TCP. 120

4.4.1       Clasa Socket 120

4.4.2       Clasa ServerSocket 121

4.5      Exemple de comunicaţii TCP. 122

4.5.1       Un talk simplu (TCP). 122

4.5.2       O aplicaţie rezumat la distanţă: RemoteDir. 123

4.5.2.1     Programul ServerRemoteDir 124

4.5.2.2     Clientul standalone RemoteDir 126

4.5.2.3     Clientul applet RemoteDirApp. 127

4.5.2.4     Client RemoteDir scris în C.. 129

4.5.3       Folosirea ca partener a unor servicii standard. 130

4.5.3.1     Consultarea unui server time prin TCP. 130

4.5.3.2     Autentificare folosind un server FTP. 131

4.5.3.3     Autentificarea prin server POP3. 132

4.5.3.4     Un server de comenzi apelabil prin telnet 134

4.5.3.5     Miniserver Web. 136

4.6      Accesul la resurse Internet prin URL. 142

4.6.1       Clasele URL şi URLConnection. 142

4.6.1.1     Clasa URL. 142

4.6.1.2     Clasa URLConnection. 143

4.6.2       Exemplu de acces la o resursă Internet 144

4.7      CGI şi comunicaţii prin URLConnection.. 145

4.7.1       Tehnologia CGI 145

4.7.2       Transformarea unui şir printr-un CGI 147

4.7.2.1     Programul CGI upcase. 147

4.7.2.2     Un client Java standalone Stand2CGI 148

4.7.2.3     Un client applet Applet2CGI 149

4.7.3       Construcţia unui contor de pagini Web. 151

4.7.3.1     Iniţializarea fişierului contor 151

4.7.3.2     Programul CGI 152

4.7.3.3     Appletul de apel al contorului 152

4.7.4       Istoricul consultării unei pagini Web. 154

4.7.4.1     Programul CGI 154

4.7.4.2     Appletul de acces. 154

5   Apelul la distanţă al obiectelor Java (RMI) 156

5.1      Scenariul dezvoltării unei aplicaţii RMI expus pe un exemplu.. 157

5.1.1       Componentele mecanismului RMI 157

5.1.2       Inregistrarea obiectelor la distanţă. 158

5.1.3       Interfaţa la distanţă (Echo). 159

5.1.4       Implementarea obiectului servant 159

5.1.5       Implementarea serverului (EchoServer). 160

5.1.6       Utilizarea unui obiect la distanţă. 164

5.1.6.1     Aplicaţia standalone EchoClient 164

5.1.6.2     Clientul applet EchoApplet 165

5.2      Precizări privind "interiorul" RMI 167

5.2.1       Stub şi Skeleton. 167

5.2.2       Parametri si Valori Returnate. 168

5.2.3       Incărcarea dinamică a claselor. 169

5.2.4       Implicaţii de securitate. 170

5.2.5       Obiecte Marshalled. 170

5.3      RMI peste JRMP cu căutare folosind serviciul JNDI 171

5.3.1       Particularităţi ale RMI cu JNDI 171

5.3.1.1     Avantajele RMI cu JNDI 171

5.3.1.2     Modificările necesare rescrierii aplicaţiior RMI clasic la JNDI 172

5.3.2       Aplicaţia Echo rulată cu JNDI 173

5.3.2.1     Principalele modificări 173

5.3.2.2     Sursele Echo pentru JNDI 173

5.4      RMI cu activare. 175

5.4.1       Mediul de activare. 175

5.4.2       Scenariul dezvoltării unei aplicaţii RMI cu activare. 176

5.4.2.1     Crearea unui obiect server cu activare. 176

5.4.2.2     Programul "Setup" de informare a mecanismului de activare. 177

5.4.2.3     Paşii de operare necesari activării 180

5.5      O aplicaţie "Note" elaborată folosind RMI 181

5.5.1       Cerinţele aplicaţiei Note şi arhitectura. 181

5.5.1.1     Arhitectura aplicaţiei 181

5.5.1.2     Cerinţe asupra sistemelor 182

5.5.1.3     Autentificări, capturi catch şi stabilirea de drepturi 183

5.5.1.4     Timeout 185

5.5.2       Definirea interfeţelor Remote. 186

5.5.2.1     Clasa auxiliară Perechi 186

5.5.2.2     Interfaţa Profesor 186

5.5.2.3     Interfaţa Student 187

5.5.3       Acţiuni off-line asupra CATALOG.. 188

5.5.3.1     Programul BatchCatalog. 188

5.5.3.2     Programul MaterieProfesor 190

5.5.4       Serverele Profesor. 194

5.5.4.1     ServerProfesor 194

5.5.4.2     ServerProfesorAct 198

5.5.4.3     Programul SetupProfesorAct 200

5.5.5       Serverele Student 202

5.5.5.1     ServerStudent 202

5.5.5.2     ServerStudentAct 203

5.5.5.3     Programul SetupStudentAct 205

5.5.6       Clienţii 206

5.5.6.1     ClientProfesor 206

5.5.6.2     ClientStudent 210

6   CORBA – dezvoltarea aplicaţiilor distribuite eterogene. 215

6.1      Eterogenitatea - cauza fundamentală a apariţiei CORBA.. 215

6.2      Standardul CORBA.. 215

6.2.1       Modelul de referinţă CORBA.. 216

6.2.2       Componentele CORBA.. 216

6.2.3       Limbajul de definire a interfeţelor IDL. 219

6.2.3.1     Module IDL. 219

6.2.3.2     Interfeţe IDL. 220

6.2.3.3     Signaturi de operaţii în IDL. 220

6.2.3.4     Corespondenţa între IDL şi diverse limbaje de implementare. 222

6.2.4       Etapele dezvoltării unei aplicaţii în CORBA.. 224

6.3      Exemple: implementări CORBA ale aplicaţiei Echo.. 225

6.3.1       Implementările şi serviciul de nume. 226

6.3.1.1     Implementările CORBA folosite. 226

6.3.1.2     Servicii de nume. 227

6.3.2        Echo prin CORBA-Java-IDL. 228

6.3.2.1     Definirea interfeţei IDL şi maparea ei în Java. 228

6.3.2.2     Implementarea clasei servant şi a serverului 229

6.3.2.3     Implementarea clasei client 231

6.3.2.4     Punerea în lucru. 231

6.3.3       Echo prin CORBA folosind C++.. 233

6.3.3.1     Instalarea şi configurarea omniORB.. 233

6.3.3.2     Interfaţa şi maparea C++. 234

6.3.3.3     Configurarea mediului Visual C++6.0. 234

6.3.3.4     Implementarea In C++ a servantului şi a serverului 235

6.3.3.5     Implementarea clasei client 238

6.3.3.6     Punerea în lucru. 239

6.3.4       RMI peste IIOP (RMI-IIOP). 240

6.3.4.1     Configurarea contextului iniţial 240

6.3.4.2     Definirea interfeţei 241

6.3.4.3     Implementarea obiectului servant şi a serverului 241

6.3.4.4     Implementarea clientului 242

6.3.4.5     Punerea în lucru. 243

6.4      Interoperabilitate CORBA-CORBA şi CORBA-RMI 244

6.4.1       Interoperabilităţile aplicaţiilor CORBA Echo. 244

6.4.1.1     Care sunt posibile?. 244

6.4.1.2     Interoperabilitate CORBA-Java-IDL cu omniORB.. 245

6.4.1.3     Interoperabilitate CORBA-Java-IDL cu RMI-IIOP. 245

6.4.1.4     Interoperabilitate RMI-IIOP cu omniORB.. 246

6.4.2       Avantaje şi neajunsuri ale interoperabilităţii 246

6.4.2.1     Scurte comparaţii RMI - CORBA.. 246

6.4.2.2     Legare CORBA - CORBA.. 248

6.4.2.3     Client RMI cu server CORBA.. 248

6.4.2.4     Client CORBA cu server RMI 249

6.4.2.5     Avantajele folosirii RMI-IIOP. 250

6.4.2.6     Dificultăţi posibile la RMI-IIOP. 250

6.5      Teste comparative ale implementărilor Echo.. 251

6.5.1       Adaptarea surselor Echo RMI clasic şi Echo RMI-JNDI 252

6.5.1.1     Sursele adaptate pentru Echo RMI clasic. 252

6.5.1.2     Sursele adaptate Echo JNDI 253

6.5.1.3     In ce a constat testul?. 254

6.5.1.4     Rezultatele testului 256

7   Tehnologia Java servlet.. 258

7.1      Conceptul de servlet; containere de servleturi 258

7.1.1       Locul servlet între tehnologiile Web. 258

7.1.2       Arhitecturile aplicaţiilor servlet 259

7.1.3       Containere de servlet 260

7.1.3.1     Probleme generale. 260

7.1.3.2     Instalarea şi configurarea Tomcat 261

7.1.3.3     Gestiunea porturilor 263

7.1.3.4     Contextul unei aplicaţii Servlet: definire şi creeare. 264

7.1.3.5     Structura de subdirectoare a unui context şi invocarea de resurse. 268

7.1.3.6     Tomcat conectat la Apache. 269

7.1.4       Funcţionarea unui servlet 271

7.1.4.1     Cum arată un servlet?. 271

7.1.4.2     Interacţiunea cu clienţii 272

7.1.4.3     Primul exemplu şi compilarea unui servlet 273

7.1.4.4     Interacţiunea cu containerul 276

7.1.4.5     Configurarea şi iniţializarea servleturilor; exemple. 277

7.1.5       Servlet vis-a-vis cu CGI 280

7.1.5.1     Avantajele Servlet faţă de CGI 280

7.1.5.2     Acces la variabilele de mediu CGI 281

7.2      Facilităţi specifice servlet.. 284

7.2.1       Exemple de aplicare GET, POST, forward. 284

7.2.1.1     Servletul Maxim, apelat prin GET şi prin POST.. 284

7.2.1.2     Servletul DisplayQueryString. 286

7.2.1.3     Servletul MaximForward. 287

7.2.2       Comunicare applet - servlet 288

7.2.2.1     Elemente specifice de comunicare. 288

7.2.2.2     Clientul Applet2Servlet 289

7.2.2.3     Servletul Servlet2Applet 290

7.2.3       Utilizare cookies. 291

7.2.3.1     Noţiunea de cookie. 292

7.2.3.2     Exemplu de utilizare cookies. 292

7.2.4       Sesiuni servlet 295

7.2.4.1     Conceptul de sesiune. 295

7.2.4.2     Implementarea unui counter de pagină Web. 295

7.2.4.3     Clientul counter 296

7.2.4.4     ServletCounter 297

7.2.4.5     ServletCounterSession. 298

7.3      Câteva exemple mai complexe. 299

7.3.1       Trimiterea de mesaje email din servlet 299

7.3.1.1     Clientul mail.html 299

7.3.1.2     Clasa Mailer, expeditor de mesaje email 301

7.3.1.3     Clasa HTML.java, auxiliar pentru servlet 304

7.3.1.4     ServletMail 306

7.3.2       Aplicaţia Note, versiunea servlet 307

7.3.2.1     Clasa NoteAccessDB.. 308

7.3.2.2     Programul ServletProfesorDB.. 309

7.3.2.3     Programul ServletStudentDB.. 311

7.3.2.4     Clientul StudentDB.. 313

7.3.2.5     ClientProfesorDB.. 315

7.3.3       Conectare JDBC din Tomcat prin JNDI 319

7.3.3.1     Definirea referinţei la resursa bază de date. 319

7.3.3.2     Utilizarea referinţei în codul Java. 321

7.3.3.3     Definirea resursei baza de date. 321

8   Java Server Pages (JSP) 323

8.1      Introducere. 323

8.1.1       Privire generală şi câteva exemple simple. 323

8.1.1.1     Cum funcţionează JSP?. 324

8.1.1.2     Alfabet afişat circular 325

8.1.1.3     Cinci numere aleatoare. 327

8.1.2       Obiecte predefinite JSP.. 327

8.1.2.1     request 327

8.1.2.2     response. 328

8.1.2.3     out 328

8.1.2.4     session. 328

8.1.2.5     application. 328

8.1.2.6     page. 329

8.1.2.7     config. 329

8.1.2.8     pageContext 329

8.1.2.9     exception. 329

8.1.3       Sumar al sintaxei construcţiilor JSP.. 329

8.2      Text static HTML şi comentarii 331

8.3      Tagurile JSP. 332

8.3.1       Elementele de scripting JSP.. 332

8.3.1.1     Expresii 332

8.3.1.2     Fragmente de cod. 332

8.3.1.3     Declaraţii JSP. 333

8.3.1.4     Exemple cu tabele. 334

8.3.1.5     Exemplu: determinarea maximului a două numere. 336

8.3.2       Directive, includeri, forward. 338

8.3.2.1     Directiva page. 338

8.3.2.2     Directiva include. 340

8.3.2.3     Acţiunea jsp:include. 341

8.3.2.4     Acţiunea forward. 341

8.4      Utilizarea beanurilor în pagini JSP. 342

8.4.1       Acţiunea useBean. 343

8.4.1.1     Sintaxe şi semnificaţii useBean. 343

8.4.1.2     Un exemplu de bean. 344

8.4.1.3     Acţiunea getProperty. 347

8.4.1.4     Acţiunea setProperty. 347

8.4.2       Un exemplu: aplicaţia Note în varianta JSP.. 349

8.4.2.1     Particularităţi ale implementării JSP. 349

8.4.2.2     NoteStudent.jsp. 350

8.4.2.3     NoteProfesor.jsp. 352

8.5      Extinderea JSP prin taguri utilizator.. 355

8.5.1       API şi posibilităţi de construcţie a unor taguri noi 355

8.5.1.1     Taguri utilizator şi locuri din context cu informaţii despre ele. 355

8.5.1.2     Declarare şi descriere formală. 356

8.5.1.3     Descrierea funcţionării unui tag folosind un bean. 357

8.5.2       Exemplu: tagurile Semnat şi Ordonat 358

8.5.2.1     Definirea tagurilor Semnat şi Ordonat 359

8.5.2.2     Definirea claselor tagurilor 359

8.5.2.3     Definirea formală a bibliotecii de taguri 361

8.5.2.4     Declararea tagurilor în web.xml 362

8.5.2.5     O pagină de utilizare a tagurilor 362

8.5.2.6     Plasarea fişierelor în context şi relaţii între ele. 364

8.5.2.7     Utilizarea noilor taguri 365

9   Bibliografie. 367

10 Lista de programe. 371

11 Lista de figuri 375

 

 

 

1       Introducere

 

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