Sunteți pe pagina 1din 87

TPI – Lucrarea de laborator Nr.

INTRODUCERE ÎN LIMBAJUL JAVA

Java nu este numai un limbaj de programare, Java este o tehnologie care ofera suport dezvoltarii
aplicatiilor distribuite, independente de platforma. Java ca limbaj si mediu de programare a fost lansat
de Sun Microsystems si este în continuare sustinut de firma Oracle. Cea mai mare parte a sintaxei de
programare Java este mostenita de la C++, dar unele din conceptele de programare obiectuala prezente
în Java îsi au radacinile în limbajele SmallTalk si Lisp.
Limbajul Java are câteva caracteristici care îl fac un limbaj de succes pe piata actuala de software.
Astfel, limbajul Java poate fi caracterizat ca un limbaj simplu, familiar, robust, orientat pe obiecte,
independent de platforma, adaptat pentru aplicatii distribuite si care asigura un nivel ridicat de securitate.
Spre deosebire de C++, limbajul Java este în intregime orientat pe obiecte. În orice aplicatie
trebuie sa existe cel putin o clasa si nu se pot defini variabile sau functii care sa apartina unei clase. În
plus, Java mareste gradul de siguranta al codului prin existenta a doua nivele de verificare: unul la
compilare si unul la rulare. Accesul la tablourile Java este verificat la rulare eliminand astfel
posibilitatea accesului accidental în afara domeniului tabloului. Conversiile între tipurile de date sunt
restrictionate, evitându-se astfel scrierea nepermisa a unor zone de memorie.
Programele executabile Java, numite si bytecodes sunt rezultatul compilarii unui program sursa.
Pentru a putea fi executate pe o anumita platforma (Windows, Unix) acestea au nevoie de un emulator
Java Virtual Machine (JVM) specific respectivei platforme. Ca urmare a utilizarii emulatorului, un
program Java poate rula pe orice platforma în care se poate executa o masina virtuala Java.
O categorie speciala de programe Java o reprezinta categoria applet-urilor care sunt programe
Java ce se executa în cadrul unui browser Internet (Internet Explorer, Mozilla Firefox, Google Chrome,
etc.).
La baza dezvoltarii unui program Java sta mediul de dezvoltare pus la dispozitie de Oracle (Sun).
Acesta este Java Developers Kit (JDK). Exista medii integrate puternice de dezvoltare, depanare si testare a
unei aplicatii Java, iar în cadrul laboratorului se vor folosi uneltele integrate de programare utilizand mediul
JDK pus la dispozitie de Oracle.
Disponibil (http://www.oracle.com/us/technologies/java/overview/index.html) freeware, în diverse
versiuni si variante în functie de platforma de lucru (Windows, Solaris, etc.), mediul JDK contine pe de o
parte o serie de biblioteci de clase Java necesare scrierii unui program si pe de alta parte un set de utilitare
necesare compilarii, testarii, executiei si documentarii unei aplicatii Java. O clasa, un fisier bytecode cu
extensia .class , reprezinta unitatea fundamentala a unui program executabil Java. O biblioteca de clase
cuprinde o serie de clase ce au functionalitati.
O astfel de biblioteca este cunoscuta în Java sub numele de package. JDK include cateva package-uri
fundamentale care contin clase fara de care nu se pot dezvolta aplicatii Java. De exemplu, package-ul java.lang
contine clasele fundamentale fara de care un program Java nu poate exista. Acest package este inclus automat de
compilator fara a fi nevoie de precizari suplimentare.
Utilizarea unei clase din oricare alt package decat java.lang intr-un program Java se specifica prin
directiva import nume_package.* sau import nume_package.nume_clasa .
Dintre programele de dezvoltare puse la dispozitia programatorului amintim:
javac – este compilatorul Java care transforma sursele text scrise în limbaj de programare Java în cod
executabil pe masina virtuala. Fisierul sursa, cu extensia .java se transmite ca si parametru în programul
javac. Vor rezulta o serie de fisiere cu extensia .class, în functie de numarul de clase definite în fisierul sursa.
java – este interpretorul Java care executa programele Java (fisierele .class). Este util doar pentru
executia aplicatiilor Java stand-alone nu si a applet-urilor. Are ca parametru numele fisierului (fara extensia
.class) rezultat în urma compilarii.

1.1 DEZVOLTAREA SI EXECUTIA UNEI APLICATII INDEPENDENTE JAVA


Etapele în crearea si lansarea în executie a unei aplicatii Java sunt : scrierea codului, compilarea,
interpretarea si lansarea în executie. Editarea unui program Java se poate face utilizand orice editor simplu de text,
care salveaza datele în format text. Un exemplu ar fi folosirea utilitarului Notepad. In acest caz insa, dupa
editarea programului si salvarea lui intr-un fisier cu extensia .java ar urma compilarea si lansarea în
executie prin apelarea explicita a utilitarelor prezentate mai sus (javac si respectiv java).
1
Este mai usor insa sa se foloseasca toolset-uri (sisteme) de dezvoltare, dintre care multe se gasesc
gratuit in Internet, cum sunt Textpad sau Eclipse. Aceste sisteme de dezvoltare ofera mai multe facilitati cum
sunt: editarea fisierelor sursa cu optiuni de highlight a cuvintelor cheie ale limbajului, compilarea si rularea
programelor, cu afisarea erorilor sau a rezultatelor wexecutiei. De asemenea, aceste sisteme de dezvoltare
dispun de comezi care permit adaugarea si selectarea optiunilor de editare, compilare si rulare a programelor.
In cele ce urmeaza se va utiliza mediul de dezvoltare NetBeans.

NetBeans: - este un mediu integrat de dezvoltare care se descarca in mod gratuit de la pagina
https://netbeans.org/ . NetBeans IDE permite dezvoltarea rapida și ușora pentru aplicatii desktop utilizand
limbajul Java, aplicatii pentru mobil și web, precum și aplicații HTML5 cu HTML, JavaScript si CSS.
Mediul de dezvoltare oferă, de asemenea un set mare de instrumente pentru PHP și dezvoltatori care
utilizeaza C/C ++. Este o sursă liberă și deschisă și are o comunitate mare de utilizatori și dezvoltatori din
întreaga lume.

Utilizarea mediului NetBeans IDE 8.1

Se executa programul NetBeans IDE si se creaza un nou proiect utilizand comanda File->New Project.

Tipul selectat al proiectului este Java Application. In fereastra care se deschide se stabilesc numele
proiectului (de exemplu Hello care va corespunde si clasei main din proiect) si calea unde acesta se va

2
salva.

Dupa ce s-a finalizat etapa de creare a proiectului, se obtine urmatoarea fereastra:

Se remarca ca se obtine o clasa Hello (care corespunde cu numele atribuit proiectului si respectiv
fisierului cod sursa Hello.java). Clasa Hello contine metoda main() care se apleleaza la rularea
aplicatiei.

Un exemplu de fisier sursa Java este fisierul Hello.java care contine urmatoarele linii de cod:
/*
* Programul afiseaza textul "Hello " si se incheie */
public class Hello {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here – se introduce linia care permite afisarea la consola
System.out.println("Hello");
}

}
Una din conditiile ca fisierul sursa Java sa poata fi utilizat mai departe (compilat) este sa aiba extensia
.java. In programul de mai sus e cuprins un comentariu “/* */” care se poate extinde pe mai multe
3
linii si pe care compilatorul nu il ia în considerare. Ca si în C++, un alt tip de comentariu este “//”,
comentariu de linie. Fisierul trebuie sa contina o declaratie de clasa. Pe scurt, o clasa este un tip de date
generic, care pe langa date (numite si membri) reprezentand starea, contine si functii (metode) ce
reprezinta functionalitatea. Materializarea (instanta ) unei clase se numeste obiect. Având public
class în declaratia clasei este obligatoriu ca fisierul sa aiba numele clasei. In cazul dezvoltarii
aplicatiilor (nu si a applet-urilor) clasa trebuie sa contina metoda main() de forma :

public static void main (String args[]){. . .}

Aceasta metoda trebuie sa existe în orice aplicatie Java, fiind prima metoda apelata cand se lanseaza
în executie un program (un bytecode) Java. Termenul public este un cuvant cheie al limbajului Java si în
acest context indica faptul ca metoda main() este o metoda publica, adica poate fi apelata din exteriorul
clasei. Datorita cuvântului cheie static, metoda main() este o metoda legata de clasa Hello si nu de un obiect,
de o instanta a ei. args[] este un tablou de siruri de caractere (String) si reprezinta parametrii din linia de
comanda ai programului apelat. In interiorul metodei main se scrie ceea ce se doreste ca programul sa faca,
în acest caz, afisarea sirului Hello. System este o clasa care contine un membru static out caruia i se poate
apela o metoda println() care are ca parametru sirul de tiparit.
Daca operatia de compilare se face cu success (nu apare nici un mesaj de eroare), se obtine un nou
fisier Hello.class, fisier care contine programul executabil Java.

Aceste comenzi se realizeaza utilizand Run->Build Project si respectiv Run->Run Project(Hello).

Rezultatul executiei aplicatiei este prezentat in fereastra de mai jos:

1.2 STRUCTURA LEXICALA A UNUI PROGRAM JAVA


Structura si gramatica unui program Java se aseamana foarte mult cu cea a unui program C++.
Limbajul Java contine urmatoarele unitati lexicale:

� Comentarii – ofera posibilitatea documentarii programului în vederea unei întelegeri mai


usoare a programului sursa. �
4

� Cuvinte cheie – sunt cuvinte care au un sens special în limbaj si insotesc variabilele,
metodele, membrii, clasele etc. Java dispune de urmatoarele cuvinte cheie (keywords): �


abstract default if private throw
boolean do implements protected throws
break double import public transient
byte else instanceof return try
case extends int short void
catch final interface static volatile
char finally long super while
class float native switch
const for new synchronized
continue package this

· Identificatorii – sunt siruri de caractere si reprezinta numele dat unei variabile, clase sau unei
functii. Conditii: sirul începe cu o litera; sirul este diferit de orice cuvânt cheie; sirul este diferit
de null, false, true. Desi nu exista o regula obligatorii pentru scrierea identificatorilor, exista
anumite conventii utilizate: identificatorii numelor de clase încep cu majuscula, fiecare
cuvânt distinct din identificator începe cu majuscula; identificatorii de variabila încep cu
litera mica, fiecare cuvânt care urmeaza începe cu majuscula; identificatorii unei functii
respecta regula de la variabile.
� Literalii – reprezinta valori constante de diferite tipuri de date primitive (întreg, caracter etc). �
· Separatorii – sunt utilizati pentru a separa unitatile lexicale unele de altele. Acestia sunt: ( ) { }
[ ] ; , .
� Operatori- sunt necesari pentru a realiza operatiile care se aplica asupra unor date din program. �

1.3 TIPURI DE DATE, OPERATORI SI INSTRUCTIUNI


Tipurile de date din Java se clasifica în doua categorii:
� Tipuri de date primitive – reprezinta acele date care sunt incluse implicit în limbajul Java.
Sunt tipuri numerice intregi (byte, short, int, long, char), tipuri numerice reale (float,
double) si tipul boolean (boolean). �

· Tipuri de date referinta – sunt clasele, tablourile si interfetele . Ca si în limbajul C++, clasele
reprezinta tipuri generice de date caracterizate printr-o stare definite de atributele clasei si
printr-o functionalitate definite de metodele clasei; tablourile sunt colectii de date de acelasi
tip, iar interfetele sunt un fel de clase abstacte si vor fi studiate în lucrarea urmatoare.
Variabilele de tip primitiv se pot crea numai prin declaratie (care este în acelasi timp si o definitie).
Variabilele de tip referinta se pot crea cu operatorul new, care (spre deosebire de C++) returneaza o referinta.
O referinta Java este un identificator al unui obiect si este, de fapt un pointer ascuns, asemanator cu o
referinta C++, de care se deosebeste în primul rând din punct de vedere sintactic (nu se mai foloseste
operatorul & la definitia unei referinte).

Deoarece nu se pot defini referinte pentru tipurile primitive, în pachetul java.lang sunt definite mai
multe clase care “încconjora” tipurile primitive, adica au ca data membru o variabila de tipul primitiv
respectiv. Aceste clase sunt Byte, Short, Integer, Character, Float, Double etc. Majoritatea acestor clase
(cu exceptia claselor Integer si Character) au aceeasi denumire ca si tipul de date primitive corespunzator,
cu primul caracter modificat în majuscula.
Câteva exemple de creare de variabile de tip primitiv si de tip referinta sunt date în programul
urmator (Tipuri.java)
Pentru a verifica codul de mai jos, se va crea un nou proiect NetBeans procedand ca la exemplul de mai sus.
//
// Tipuri.java

5
//
class Numar{
int n;
Numar(int x){n=x;}
}

public class Tipuri{


public static void main(String[] args)
{ int x = 10;
Integer i1 = new Integer(100);
Byte b1 = new Byte((byte)20);
Character c1 = new Character('A');
Numar n1 = new Numar(7);
System.out.println("int: " + x);
System.out.println("Integer: " + i1);
System.out.println("Byte: " + b1);
System.out.println("Character: " + c1);
System.out.println("Numar: " + n1.n);
}
}

În acest program se creaza o variabila de tip primitiv (întreg - int) prin definitie (declaratie) si mai
multe obiecte de tipul claselor Integer, Byte, Character, Numar, folosind operatorul new.

Fiecare variabila creata se afiseaza la consola folosind functia System.out.println(). Clasa Numar
este o clasa noua creata în program, asa cum se vede în listing. La executia acestui program se obtin
urmatoarele linii afisate la consola .

Clasa Object. În Java este este implementat un mecanism de mostenire simpla, prin care o clasa poate
extinde (deriva) o singura clasa de baza, iar ierarhia de clase care se creeaza are o radacina unica, clasa
Object din pachetul java.lang.
Daca în program se defineste o clasa care nu este derivata din nici o alta clasa, atunci, în mod
implicit, ea extinde clasa Object, ceea ce înseamna ca, de exemplu definitia class X{. . .} este echivalenta cu
definitia class X extends Object{. . .}.

Clasa Object defineste metode de baza pentru manevrarea obiectelor, metode care trebuie sa fie
redefinite în clasele derivate. Cele mai importante dintre a cestea sunt:
public class Object{
public String toString();
public boolean equals(Object obj);
protected Object clone() throws CloneNotSupportedException;
……………………………………………………………………………………………..
}

6
Metoda toString() returneaza un String caracteristic clasei. Metoda trebuie sa fie redefinita în
fiecare clasa derivata din clasa Object. Prin redefinire, metoda equals() poate fi utilizata pentru a compara
doua obiecte (pentru a vedea daca sunt identice din punctul de vedere al atributelor lor).

Prin metoda clone() se creaza (prin copiere) un obiect de aceeasi clasa cu obiectul din care se
apeleaza metoda.
Pentru a putea aplica aceasta metoda trebuie ca acea clasa sa implementeze interfata Cloneable si, în
plus, sa redefineasa metoda clone().

În cazul în care se încearca o copiere a unui obiect, dar clasa obiectului respectiv nu implementeaza
Cloneable, se va arunca o exceptie de tipul CloneNotSupported- Exception.

Operatorii Java se sunt în cea mai mare parte aceeasi cu cei din C++, cu câteva deosebiri.

Operatorii delete, & (addressof), * (dereferentiere) si :: (rezolutie) au disparut.

A aparut un operator nou (instanceof). Acesta este utilizat pentru a testa daca un obiect este o
instanta a unei anumite clase. Forma generala a acestui operator este:
nume_obiect instanceof nume_clasa
Operatorul instanceof returneaza true daca obiectul (cu referinta nume_obiect) este o
instanta clasei nume_clasa sau a unei superclase a acesteia; în caz contrar, returneaza false. Exemplu:
class X {...}
class Y extends X{...}
class Z {...}
X objX = new X();
Y objY = new Y();
Z objZ = new Z();
System.out.println(objX instanceof X); // afiseaza: true
System.out.println(objX instanceof Object); // afiseaza: true
System.out.println(objX instanceof Z); // afiseaza: false

Operatorul de asignare (=) se comporta la fel ca în C++ pentru tipurile primitive (se copiaza valoarea
variabilei). Pentru tipurile referinta, însa, se copiaza referintele, nu obiectele referite, iar pentru copierea
obiectelor trebuie sa se foloseasca functia clone(). Functia clone() care este definita în clasa Object si trebuie
sa fie redefinita în orice clasa pentru care este necesara copierea obiectelor.

Operatorul de comparatie de egalitate (==) se comporta la fel ca în C++ pentru tipurile primitive (se
compara valorile variabilelor). Pentru tipurile referinta, operatorul == compara referintele, nu obiectele
referite, iar pentru comparatia chiar a obiectelor, trebuie sa se foloseasca functia equals(). Functia equals()
este definita în clasa de baza Object si trebuie sa fie redefinita pentru oricare clasa pentru care este necesara
comparatia obiectelor.
Operatorul + supraîncarcat pentru clasa String. În Java nu este admisa supraîncarcarea
operatorilor, cu exceptia operatorului de adunare pentru clasa String. Clasa String (din pachetul java.lang)
contine un sir de caractere si numeroase metode pentru operatii asupra acestora. Operatorul de adunare
supraîncarcat pentru clasa String admite trei forme de apel:
sir + var, var + sir si sir1 + sir2 .
În urma acestei operatii se obtine un obiect sir de caractere (String) care contine un sir de caractere
format prin conatenarea celor doua subsiruri corespunzatoare celor doi operanzi. Se considera ca operandul
denumit sir (sau sir1, sir2) este o constanta (literal) sir de caractere (de exemplu, “abcde”) sau o referinta la
un obiect String. În cazul în care variabila var este o referinta la un obiect, se utilizeaza metoda toString() a
clasei obiectului (daca este redefinita în acea clasa) sau metoda toString() mostenita de la clasa Object pentru
a obtine subsirul care intervine în operatie.

7
Exemple:

String sir1 = ”ABC”, sir2;


int a = 2;
float b=14.32f;
boolean c = true;
Object obj = new Object();
sir2 = sir1 + a;
System.out.println(sir2); // afisare: ABC2
sir2 = ”XYZ” + b;
System.out.println(sir2); // afisare: XYZ14.32
sir2 = c + sir1;
System.out.println(sir2); // afisare: trueABC
sir2 = sir1 + obj;
System.out.println(sir2); // afisare: ABCObject@12123

Metoda toString() mostenita din clasa Object returneaza numele clasei si o valoare de
identificare unica a obiectului (hash code), valoare alocata de masina virtuala în mod unic unui obiect.
De obicei functia toString() se redefineste pentru fiecare clasa.
Instructiunile Java sunt foarte asemanatoare cu instructiunile C/C++ si sunt urmatoarele: if –
else, switch, for, while, do, break, continue, return. Exista doua mari diferente fata de limbajul
C/C++. O deosebire priveste instructunile ce implica expresii conditionale din instructiunile if – else,
for, while, do. Daca în C aceste expresii puteau fi de tip int, în Java ele trebuie sa fie strict de tipul
boolean (în Java nu este posibila conversia din int în boolean). O alta deosebire este legata de
instructiunea goto care lipseste în Java fiind substituita de instructiunile break si continue care pot primi o
eticheta de salt.

1.4 TABLOURI
Un tablou (array) este o lista de elemente de acelasi tip plasate într-o zona continua de
memorie, care pot fi adresate utilizând un nume, un identificator comun. Tipul elementelor din tablou
trebuie sa fie de acelasi tip si poate fi oricare tip primitiv sau tip referinta.
Un tablou Java este un tip referinta, deci identificatorul (numele) unui tablou reprezinta o
referinta (o adresa) la locatia unde se gaseste întregul tablou de elemente. Un tablou Java este un obiect
care contine, în afara de elementele tabloului o variabila membra publica length din care se poate citi
(nu si scrie) dimensiunea tabloului.
Tablourile pot fi definite pentru tipuri primitive sau pot contine referinte la obiecte (clase).
Tablourile de date primitive contin chiar acele date memorate în elementele tabloului, iar tablourile de
obiecte (tip referinta) contin referinse memorate în elementele tabloului. Dimensiunile unui tablou sunt
fixe (nu se mai pot modifica dupa creare).

Prin declararea unui tablou se creaza o variabila referinta având valoarea null (care nu refera
nimic). Nu se aloca spatiu pentru elementele tabloului. Forma generala de declarare a unui tablou
unidimensional este:
tip nume_tablou[]; //sau
tip[] nume_tablou;
Exemple:
int[] tabInt;
String tabString[];
Object[] tabObjects;
Dupa declararea unui tablou urmeaza instantierea lui, adica alocarea zonei de memorie necesara
stocarii elementelor lui. Instantierea unui tablou se poate face în doua moduri. Cel mai utilizat mod este
prin utilizarea lui new astfel:
nume_tablou = new tip[nr_el];

8
În acest mod s-a alocat o zona de memorie necesara stocarii unui numar de nr_el, zona care
poate fi adresata prin referinta nume_tablou. Tot acum se aloca variabila length care va contine
lungimea tabloului (numarul de elemente ale tabloului). Elementele tabloului contin datele de tip
primitiv sau referinte la obiecte si sunt initializate la valori implicite. Elementelor de tip numeric li se va
atribuie valoarea 0, celor de tip boolean valoarea false, celor de tip char valoarea spatiu liber (blanc),
iar celor de tip referinta valoarea null.
Un alt mod de instantiere a unui tablou si care este valabil doar în momentul declaratiei lui este
urmatorul:
tip nume[] = {el1, el2, ....elN};
Prin aceasta constructie se aloca spatiu elementelor tabloului (la fel ca si în cazul utilizarii
operatorului new) si se atribuie elementelor valorile specificate în lista de initializare (altele decât cele
implicite) elementelor din tablou. Dimeniunea tabloului rezulta din numarul de elemente din lista de
initializare.

Elementele unui tablou se pot accesa folosind operatorul de indexare ([]). Exemple:
int[] tabInt = new int[10];
int x = tabInt[2];
long tabLong[] = new long[4];
char tabChar[]={‘t’,‘a’,‘b’,‘l’,‘e’};
Indexul care se foloseste în operatia de indexare trebuie sa aiba o valoare întreaga pozitiva, cuprinsa între
0 si length-1. Daca valoarea indexului nu este pozitiva sau depaseste dimensiunea tabloului, în cursul executiei
se va “arunca” o exceptie java.lang.ArrayIndexOutOfBoundsException.

Un tablou de referinte la obiecte se creeaza la fel ca si un tablou de date de tip primitiv. La


crearea unui astfel tablou cu operatorul new, elementele tabloului (care sunt referinte) sunt initializate
cu valoarea null. La crearea folosind o expresie de initializare, se initializeaza fiecare element al tabloului
cu referinta obiectului respectiv. De exemplu:
Integer []t1 = new Integer[5];
Integer []t2 = {new Integer(0), new Integer(1), new Integer(2)};

Un tablou multidimensional este implementat ca un tablou de tablouri. Pentru a initializa un


tablou multidimensional se poate folosi operatorul new sau o lista de initializare la fel ca si în cazul
tabloului unidimensional.

Exemple:
int [][]tab1;
tab1 = new int[2][3];
int [][]tab2 = {{2,3,4}, {3,4,5}}; // se declara si se instantiaza
// un tablou bidimensional
int [] tab3[]; //declaratie echivalenta cu int[][] tab3;

Clasa Arrays. În pachetul java.util exitsa clasa Arrays care contine mai multe metode statice
care pot fi apelate pentru operatii asupra elementelor din tablouri. Câteva dintre aceste metode sunt:

� fill(tip[], val), pentru umplerea unui tablou de date de tipul tip cu valoarea val (de �
acelasi tip dat). Exista mai multe vesiuni supraîncarcate, pentru tipuri primitive si pentru
referinte (la clasa de baza Object): fill(int[] a, int v), fill(Object[] a, Object
v).

� equals(tip[] a, tip[] v), returneaza true daca cele doua tablouri (de date de acelasi �
tip) au toate elementele egale.
� sort(tip[] a) , sorteaza elementele vectorului a (care contine elemente de tipul tip). �

9
În exemplul urmator (FillingArrays.java) se creeaza câteva tablouri de diferite tipuri (boolean,
int etc.) care se initializeaza folosind metoda fill() a clasei Arrays si se listeaza.
Pentru listarea elementelor s-au scris câteva metode de conversie supraîncarcate pentru tablouri de
elemente de diferite tipuri (metodele toString()).

//
// FillingArrays.java
//
import java.util.*;
class Numar{
int n;
public Numar(int k){ n = k; }
public String toString(){ return "n = " + n;}
}
public class FillingArrays {
public static String toString(boolean[] a) {
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]"); return
result.toString();
}
public static String toString(char[] a) {
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]"); return
result.toString();
}
public static String toString(int[] a) { StringBuffer
result = new StringBuffer("["); for(int i = 0; i
< a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]"); return
result.toString();
}
public static String toString(Numar[] a){
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");

return result.toString();
}

10
public static void main(String[] args) {
int size = 6;
boolean[] a1 = new boolean[size];
char[] a2 = new char[size];
int[] a3 = new int[size];
Numar[] a4 = new Numar[size];
Numar n1 = new Numar(7);
Arrays.fill(a1, true);
Arrays.fill(a2, 'A');
Arrays.fill(a3, 10);
Arrays.fill(a4, n1);
System.out.println(toString(a1));
System.out.println(toString(a2));
System.out.println(toString(a3));
System.out.println(toString(a4));
}
}

La executia acestui program se obtine urmatorul rezultat:

EXERCITII

1.1 Introduceti, compilati si executati programul Tipuri.java. Testati diferite situatii si urmariti erorile de
compilare pe care le obtineti daca adaugati în program linii suplimentare, ca de exemplu:
int y = new int();
Numar & n2 = new Numar();

1.2 Creati un tablou bidimensional de dimensiune 5x5 de numere de tip întreg în care numerele din
prima coloana sunt multipli consecutivi ai lui 10 iar elementele consecutive din linii sunt crescatoare cu o
unitate. Afisati elementele tabloului. Afisati elementul (2,3).

1.3 Se da urmatorul tablou de cuvinte (siruri de caractere): “Martie”,”Aprilie”, ”Luna”, ”An”. Sa se


afiseze câte un mesaj care sa specifice cu ce litera începe fiecare cuvânt dat, folosind instructiunea switch
(aceeasi ca în C++).

1.4 Introduceti, compilati si executati programul Tablouri.java. Comentati liniile de încarcare a


tablourilor cu o valoare data (Arrays.fill(a1, true)...) si observati cum se face initializarea implicita a
elementelor tablourilor. Modificati programul astfel încât fiecare element al tabloului a4 sa refere un obiect
(de clasa Numar) a carui variabila membra (n) are valoarea egala cu indexul elementului.

11
���������������������������������������������������������������������������
���������������������������������������������������������������������������������
�����������������������������������������������������
TPI – Lucrarea de laborator Nr. 2

PROGRAMAREA OBIECTUALA IN JAVA

Limbajul Java este un limbaj în întregime orientat pe obiecte: în Java (spre deosebire de C++) nu exista
variabile sau functii care sa nu fie membre ale unei clase. Conceptele de programare obiectuala sunt aceleasi ca si
în C++: programele sunt organizate ca si colectii de obiecte cooperante, fiecare obiect fiind o instanta a unei clase.
Fiecare clasa reprezinta abstractizarea unui tip de entitate din realitatea modelata, iar clasele sunt membre ale unei
ierarhii de clase, corelate între ele prin relatii de mostenire. Orice obiect este încapsulat, ceea ce înseamna ca
reprezentarea lui (adica structura interna a acelui obiect) nu este vizibila utilizatorilor, care au acces doar la
functiile (metodele ) pe care acel obiect este capabil sa le execute.

3.1. CLASE SI OBIECTE


Forma completa de definire a unei clase este urmatoarea:
lista_modificatori class nume_clasa extends nume_clasa_de_baza
implements lista_interfete
{
// corpul clasei;
}
Definitia unei clase trebuie sa contina în mod obligatoriu cuvântul cheie class, numele clasei si
corpul clasei. Toti ceilalti termeni din definitie sunt optionali. Înainte de cuvântul class poate exista o
lista de modificatori (despartiti prin spatiu) care atribuie anumite proprietati clasei definite. Acesti
modificatori pot fi din categoria cuvintelor cheie: public, abstract si final. Pentru a deriva o clasa
dintr-o clasa de baza (superclasa) se foloseste cuvantul cheie extends urmat de numele clasei de baza.
În Java, spre deosebire de C++, poate exista o singura clasa de baza (Java nu supporta
mostenirea multipla) si în lipsa mostenirii multiple se folosesc interfete Java. O interfata Java
(interface) este un tip de date abstract, un fel de clasa în care nici una din metode nu este definita în
intregime (lipseste corpul metodei, doar s-a declarat metoda). O clasa implementeaza o interfata daca
declara acest lucru în declaratia clasei prin cuvântul cheie implements urmat de numele interfetei si
daca defineste toate metodele declarate în interfata. O clasa poate implementa mai multe interfete
utilizand cuvântul cheie implements urmat de numele interfetelor separate de virgula.
În Java nu poate exista o declaratie de clasa independenta de corpul clasei. Corpul unei clase contine o
serie de declaratii de membrii ai clasei si constructori. Membrii unei clase pot fi atât atribute cât si metode. Un
membru declarat într-o clasa este disponibil prin numele sau oriunde în interiorul acelei clase.
Atributele unei clase (variabile membru) pot fi de orice tip de data primitiv sau referinta (clasa
sau tablou). Declaratia atributelor are urmatoarea forma generala:
lista_modificatori_atribut tip_data lista_declaratori_variabile;
unde lista_declaratori_variabile cuprinde o serie de declaratori de variabila separati prin virgula.
Un declarator de variabila are una din urmatoarele forme generale:
nume_variabila = expresie_initializare;
nume_tablou[] = expresie_initializare;
Expresiile de initializare pot lipsi dintr-un declarator de variabila. Lista modificatorilor poate contine o
serie de cuvinte cheie delimitate prin spatiu. Acesti modificatori stabilesc proprietatile unui atribut si pot fi unul
din urmatoarele cuvinte cheie: public, protected, private, final, static, transient si volatile. Primii
trei sunt modificatori de acces si nu poate exista decât unul dintre ei într-o declaratie.
O metoda are urmatoarea forma generala de definitie:
lista_modificatori tip_returnat nume(lista_parametri)
throws lista_exceptii
{
//corp_metoda
}

1
Modificatori de metoda care definesc proprietatile metodei pot fi urmatoarele cuvinte cheie:
public, protected, private, abstract, static, final, synchronized sau native. Se pastreaza
principiul supraîncarcarii (overloading) metodelor din C++. O functie poate arunca o serie de exceptii. Acest
lucru trebuie specificat prin cuvântul cheie throws urmat de o lista a tipurilor de exceptii care pot fi
aruncate. Corpul metodei defineste operatiile pe care le va executa metoda la apelul ei.
Constructorul este (ca si în C++) metoda cu nume identic cu numele clasei si care nu
returneaza nici un tip de date. Ca orice metoda, si constructorii contin o lista de parametrii formali.
Exista astfel posibilitatea supraîncarcarii constructorilor prin modificarea listei parametrilor formali. În
functie de variabilele (tipurile lor) utilizate ca si parametri la instantierea unui obiect prin operatorul
new, se apeleaza constructorul corespunzator. În cazul în care nu se declara nici un constructor (doar în
acest caz) compilatorul creaza un constructor implicit, având numele clasei, fara nici un parametru
formal si având corpul constructorului gol. Corpul constructorului poate contine ca prima linie (doar ca
prima linie) una din urmatoarele instructiuni:
this(lista_parametri) sau super(lista_parametri)
Cuvântul cheie this reprezinta referinta la obiectul curent. Prin this(lista_parametri) se
poate apela un alt constructor (al aceleiasi clase) cu o lista de parametri diferita de cea a constructorului
curent. Cuvântul cheie super reprezinta referinta la clasa de baza a clasei actuale. Prin instructiunea
super(lista_parametri) se apeleaza constructorul superclasei (clasa de baza directa). Cele doua
instructiuni nu pot exista simultan. Un exemplu de supraîncarcare a constructorilor si utilizare a cuvântului
cheie this într-un constructor este urmatorul:
public class Masina{
public Masina(int nr){. . .} // primul constructor
public Masina(int nr, String marca){ // al doilea constructor
this(nr); // apelul primului constructor
. . . . . .
}
}
Cuvântul cheie this poate fi utilizat nu numai la apelul constructorului, ci si în alte metode. O
situatie mai des întâlnita este aceea de accesare a unui atribut al clasei din interiorul unei metode a clasei
în care exista o variabila (de regula, un parametru formal) cu nume identic cu cel al atributului clasei. Ca
urmare, în doemniul de vizibilitate al metodei, numele respectiv va referi parametrul formal, nu atributul
clasei. Situatia acesta se rezolva în modul urmator:
int width; // atribut al clasei
int setWidth(int width) // parametru formal
{
this.width = width; // this.width refera atributul clasei
// iar width parametrul formal al metodei
}
Obiecte. În crearea unui obiect dintr-o clasa sunt trei etape: declararea, instantierea si
initializarea. Daca declararea unui obiect se poate face separat, instantierea si initializarea sunt operatii
ce au loc simultan prin folosirea operatorului new.
Operatorul new aloca memoria necesara stocarii obiectului respectiv (atributelor lui) si apeleaza
un constructor, care initializeaza obiectul conform operatiilor specificate în corpul constructorului. La
instantierea unei clase se aloca memorie fiecarui atribut din clasa respectiva, se initializeaza la valoarea
implicita (0 pentru tipurile primitive numerice, false pentru tipul boolean, si null pentru tipurile
referinta), se atribuie valoarea din expresia de initializare din declaratia atributului (daca aceasta exista)
si dupa aceea se apeleaza constructorul. Variabilele sunt initializate în ordinea definirii lor si înaintea
apelului oricarei metode inclusiv a constructorului. Doar dupa terminarea executiei constructorului
obiectul este disponibil. În schimb referinta this poate fi utilizata în interiorul lui imediat dupa alocarea
memoriei necesare stocarii lui.
De multe ori este necesara eliberarea unor resurse în momentul distrugerii unui obiect. În limbajul C++
aveam la dispozitie destructorul. În Java, masina JVM contine o componenta numita Garbage Colector care se
ocupa de dezalocarea zonelor de memorie alocate prin new, în momentul în care acele zone nu mai sunt referite de
nici o variabila. Exista cazuri însa în care e nevoie de dezalocarea altor resurse atasate unui obiect decât cele de
2
memorie, ca de exemplu conexiuni la fisiere sau conexiuni în retea.
O solutie este utilizarea metodei finalize mostenita din clasa Object. Metoda finalize este
apelata automat de JVM dupa ce obiectul nu mai este referit, dar înainte de eliberarea zonei de memorie
alocata acestuia.
Membrii statici ai unei clase. Utilizarea modificatorului static la declararea unui atribut sau
la declararea unei metode înseamna apartenenta membrului respectiv la clasa si nu la o instanta a ei (la
un obiect). În cazul unui atribut static, se aloca memorie o singura data, la prima initializare a clasei. La
urmatoarele instantieri ale clasei nu se mai aloca memorie pentru un atribut static, dar toate obiectele
din acea clasa pot accesa aceeasi variabila statica, aflata în aceeasi zona de memorie. Un exemplu de
utilizare a unei variabile statice este de a contoriza obiectele create din acea clasa:
class Contor{
static int contor = 0;
public Contor(){
contor++;
System.out.println(“Acesta este obiectul nr. ” + contor);
}
}
...
Contor c1 = new Contor(); // Acesta este obiectul nr. 1
Contor c2 = new Contor(); // Acesta este obiectul nr. 2
...
Metodele statice ale unei clase sunt un fel de functii globale si se pot folosi fara sa fie necesara
crearea unei instante a clasei (obiect). Un exemplu de metoda statica este metoda main() a clasei
principale a aplicatiilor. Metodele statice nu pot utiliza atribute si metode care nu sunt statice.
Specificatorii de acces. În cazul în care o clasa este declarata de tipul public, ea poate fi utilizata din
exteriorul package-ului în care a fost definita. Specificatorul public permite declararea unui obiect de tipul clasei
respective (referinta obiectului). Pentru a putea fi însa instantiata, clasa trebuie sa aiba si un constructor declarat de
tip public. În cazul în care cuvântul cheie public lipseste din definitia clasei, clasa devine clasa friend si poate fi
accesata doar din interiorul package-ului în care a fost creata.
În cazul metodelor, atributelor si constructorilor unei clase, se poate vorbi despre patru niveluri
de acces, prezentate în tabelul urmator.

Acces În exteriorul
În clasa În clase derviate În package
Specificator package-ului
public DA DA DA DA
DA DA DA NU
protected DA DA NU NU
private DA NU NU NU

3.2. MOSTENIREA CLASELOR


Prin mostenire se pot crea clase noi (numite clase derivate sau subclase) care extind clasa de
baza (superclasa). Clasa derivata mosteneste de la clasa de baza toate metodele si toate atributele.
Constructorii nu se mostenesc. Ca urmare se poate spune ca un obiect din clasa derivata este si un obiect
de tipul clasei de baza. Pe lânga metodele si atributele pe care le mosteneste de la clasa de baza, clasa
derivata poate sa adauge altele noi. Clasa derivata este o specizalizare a clasei de baza.
Derivarea unei clase în Java se face utilizând cuvântul cheie extends urmat de numele clasei de baza.
Dupa cuvântul cheie extends nu poate exista decât o singura clasa deoarece limbajul Java nu admite mostenirea
multipla. În cazul claselor derivate compilatorul adauga la inceputul constructorului un apel al constructorului fara
argumente al clasei de baza daca si numai daca nu exista un apel explicit al unui constructor al clasei de baza
introdus în programul sursa. În cazul în care apelul se face explicit, este obligatoriu ca acest apel sa se faca
înaintea oricaror alte instructiuni. Apelul explicit se face prin intermediul cuvantului cheie super si este util în
cazul în care dorim apelul unui alt constructor al clasei de baza decât cel fara parametru. La instantierea unei clase
derivate, ordinea initializarilor este urmatoarea:

� � Initializarea atributelor statice ale clasei de baza �

3
� Initializarea atributelor statice ale clasei derivate �
� � Initializarea atributelor nestatice ale clasei de baza �
� Apelul constructorului clasei de baza �

� Initializarea atributelor nestatice ale clasei derivate �


� Apelul constructorului clasei derivate �
O clasa derivata poate declara o metoda cu acelasi nume si semnatura cu a unei metode din clasa de baza
si aceasta metoda din clasa derivata substituie metoda din clasa de baza. Tehnica se numeste redefinire sau
dominare (redefinition, overriding). La apelul respectivei metode dintr-un obiect de tip clasa derivata se va
executa metoda declarata în clasa derivata. Accesul la metoda clasei de baza din interiorul clasei derivate se poate
face folosind cuvântul cheie super. Nici atributele statice, nici metodele statice nu pot fi redefinite. În clasa
derivata poate exista o metoda statica sau un atribut cu acelasi nume cu al unei metode sau al unui atribut din clasa
de baza, dar nu le substituie pe acestea din urma.
Modificatorul final. O clasa declarata final nu poate fi derivata. O metoda declarata final
nu poate fi redefinita. Unul din motivele specificarii final al unei metode este eficienta executiei. În
momentul în care compilatorul întâlneste un apel de metoda declarata final, el poate sa substituie
apelul cu secventa de instructiuni din corpul metodei final. Metodele final din Java sunt
corespondentele metodelor inline din C++.
Un atribut declarat final reprezinta o constanta de program. Odata initializat el nu mai poate fi
modificat. De multe ori modificatorul static se utilizeaza împreuna cu modificatorul final pentru a
declara o constanta a clasei.
Clase si metode abstracte. O clasa poate fi declarata de tip abstract, caz în care ea nu poate fi
instantiata. O clasa abstracta poate fi utilizata doar într-o relatie de derivare. O clasa poate contine o
serie de metode abstracte. O clasa care are o metoda abstracta trebuie sa fie declarata abstracta. Clasele
care sunt derivate din clase abstracte trebuie sa implementeze metodele abstracte ale acestora din urma
sau sa fie declarate la rândul lor abstracte. O clasa este declarata abstracta pentru a oferi suport de
implementare a polimorfismului pentru o ierarhie de clase derivate din ea.
Conversii între tipuri referinta. Între tipuri de date referinta între care exista relatii de
mostenire se pot face conversii de tipuri. Conversia unui tip derivat într-un tip de baza se numeste
conversie de largire (widening sau upcasting) si se face implicit. Conversia unui tip de baza într-un tip
derivat se numeste conversie de îngustare (narrowing, downcasting) si se face explicit folosind
operatorul cast. La downcasting pot aparea erori în timpul executie în cazul în care obiectul care se
converteste nu a fost instantiat ca si tip derivat.

3.3. IERARHII DE CLASE


Folosind mostenirea claselor, într-un program se pot crea ierarhii de clase pe mai multe niveluri.
În figura urmatoare este data diagrama UML a claselor unei aplicatii simple de muzica. În
aceasta aplicatie se pot urmari mai multe din aspectele de definire a claselor prezentate în lucrare:
definirea claselor, crearea (instantierea) obiectelor, extinderea claselor, clase abstracte si concrete,
conversie între tipurile derivate si tipul de baza.

4
Clasa de baza a ierarhiei, clasa Instrument (care, la rândul ei este derivata implicit din clasa
Object, dar acest lucru nu s-a mai reprezentat în diagrama) are toate metodele declarate abstract, deci si
ea trebuie sa fie declarata abstract. Clasele derivate din aceasta (clasele Suflatori, Coarde, Percutie)
sunt clase concrete, care definesc toate cele trei metode mostenite de la clasa de baza. Implementarea acestor
metode este foarte simpla, doar scriu la consola numele unei operatii (canta(), ajusteaza()), sau
returneaza numele clasei instrumentului (getNume()). La fel, clasele de pe nivelul al treilea al ierarhiei
create (clasele Vioara si Violoncel, care extind clasa Coarde), redefinesc metodele mostenite canta() si
getNume(). Codul programului (Muzica.java) este urmatorul:

//
// Muzica.java
//
import java.util.*;

abstract class Instrument {


abstract public void canta();
abstract public String getNume();
abstract public void ajusteaza();
}
class Suflatori extends Instrument {
public void canta() {
System.out.println("Suflatori.canta()");
}
public String getNume() { return "Suflatori"; }
public void ajusteaza() {}
}
class Percutie extends Instrument {
public void canta() {
System.out.println("Percutie.canta()");
}
public String getNume() { return "Percutie"; }
public void ajusteaza() {}
}
class Coarde extends Instrument {
public void canta() {
System.out.println("Coarde.canta()");
}
public String getNume() { return "Coarde"; }
public void ajusteaza() {}
}
class Vioara extends Coarde {
public void canta() {
System.out.println("Vioara.canta()");
}
public String getNume() { return"Vioara";}
}
class Violoncel extends Coarde {
public void canta() {
System.out.println("Violoncel.canta()");
}
public String getNume() { return "Violoncel"; }
}
public class Muzica {
static void acordare(Instrument[] e) {
for(int i = 0; i < e.length; i++)
e[i].canta();
}
public static void main(String[] args) {
Instrument[] orchestra = new Instrument[5];
int i = 0;
// Conversie de largire - upcast
5
orchestra[i++] = new Suflatori();
orchestra[i++] = new Percutie();
orchestra[i++] = new Coarde();
orchestra[i++] = new Vioara();
orchestra[i++] = new Violoncel();
acordare(orchestra);
}
}

În diagrama claselor nu este trecuta si clasa Muzica, folosita ca si clasa princpala (care contine
functia main()) si care este legata de toate celelalte clase printr-o legatura de dependenta de utilizare .
Toate metodele claselor reprezentate mai sus sunt metode virtuale, redefinite în fiecare clasa,
care substituie (înlocuiesc, domina) metodele din clasele de baza.
Obiectele create ca instante a diferitelor clase (Suflatori, Coarde, Percutie, Vioara si
Violoncel) sunt organizate ca un tablou de referinte la clasa de baza (Instrument[] orchestra = new
Instrument[5];). La crearea acestor obiecte, referintele returnate de operatorul new sunt convertite
implicit (upcasting) în referinte la clasa de baza (de exemplu, orchestra[i++] = new Suflatori(); ).
La executia programului (utilizand mediul de dezvoltare NetBeans) se obtine urmatorul rezultat:

3.4. INTERFETE JAVA


Interfetele Java reprezinta colectii de metode (fara corp) si constante. O interfata este declarata
prin cuvântul cheie interface. O interfata Java poate mosteni alte interfete Java utilizând cuvântul
cheie extends. Spre deosebire de clase, interfetele suporta mostenire multipla.
La fel ca si o clasa abstracta, o interfata Java nu poate fi instantiata. O interfata java poate fi
implementata insa de o clasa utilizand cuvântul cheie implements. O cla sa poate implementa mai multe
interfete. O clasa care implementeaza o interfata trebuie sa defineasca toate metodele acelei interfete.
Ca exemplu, se poate relua programul precedent si se transforma clasa abstracta Instrument în
interfata, pastrând restul programului aproape nemodificat (Muzica1.java):
//
// Muzica1.java
//
import java.util.*;
interface Instrument {
public void canta();
public String getNume();
public void ajusteaza();
}
class Suflatori implements Instrument {. . .}
class Percutie implements Instrument {. . .} class
Coarde implements Instrument {. . .} class Vioara
extends Coarde {. . .}
class Violoncel extends Coarde {. . .}
public class Muzica1 {. . . }

6
Metodele declarate în interfata sunt implicit abstracte si nu mai este necesar introducerea
specificatorului abstract. La executia acestui program se obtin aceleasi rezultate ca si la programul
precedent.

2.5 COLECTII DE OBIECTE


Java dispune de mai multe metode de pastrare a obiectelor. O prima metoda o reprezinta tablourile, care
sunt tipuri predefinite (built-in) ale limbajului, care au fost studiate în lucrarea precedenta. Pe lânga tablouri,
exista librarii (pachete) care contin mai multe categorii de clase de colectii (clase container) care ofera o mare
varietate de modele de date si structuri de reprezentare a acestora. Într-o colectie, numarul de elemente poate varia
prin introducerea unor elemente noi sau sau prin extragerea unor elemente.
Modelele de date cele mai folosite (si implementate în arhitectura colectiilor Java – Java Collections
Framework) sunt: lista (list - o secventa de elemente, memorate într-o anumita ordine), multimea (set - o grupare
de elemente în care nu exista doua sau mai multe elemente de acelasi fel) si vectorul asociativ (map – o grupare
de elemente, în care fiecare element contine doua parti asociate, cheia si valoarea). La rândul lui, fiecare
model de date (forma colectiei) poate fi realizat prin diferite structuri de date. De exemplu, o lista poate
fi realizata printr-un tablou sau printr-o lista înlantuita; o multime poate fi realizata printr-o lista
înlantuita, printr-un arbore sau printr-o tabela de dispersie etc.
Arhitectura colectiilor Java consta din mai multe interfete, clase abstracte si clase instantiabile în
pachetul java.util, prin care se diferentiaza doua categorii de containere, în functie de numarul de
valori pe care îl contine fiecare element al containerului:
� Tipul Collection defineste câte o valoare în fie care element (denumirea este putin
confuza, dat fiind ca întraga colectie de clase se numeste colectii). Aceast tip cuprinde
mai multe subtipuri (prin interfete derivate), în functie de restrictiile impuse. Tipul List
(List este o interfata care extinde interfata Collection) defineste modelul de date lista,
adica un container care contine o secventa de elemente aflate într-o anumita ordine; tipul
Set (Set este o interfata care extinde Collection) defineste modelul de date multime,
adic[ un container în care nu exista elemente duplicat.
� Tipul Map defineste modelul de date vector asociativ, adica un container în care fiecare
element contine doua parti asociate (cheie, valoare). �
Forma unui container (modelul de date) este impusa prin interfata (List, Set, Map) pe care o
implementeaza clasa containerului, iar structura de date a containerului este definita în clasa, obtinându-
se astfel mai multe clase de colectii care difera atât prin modul de organizare cât si prin structura de date
folosita. În figura urmatoare este reprezentata diagrama partiala a claselor si interfetelor arhitecturii de
colectii Java. Denumirile claselor de colectii sunt formate din doua parti, prima parte reprezinta structura
de date folosita, iar cea de a doua parte reprezinta forma colectiei (interfata implementata). De exemplu,
clasa ArrayList (care este o lista reprezentata printr-un tablou de elemente) si clasa LinkedList (care
este o lista reprezentata printr-o lista înlantuita de elemente) implementeaza interfata List.

Asa cum se vede din figura, interfata Collection este extinsa de interfetele List si Set; clasele
ArrayList si LinkedList implementeaza interfata List; clasele TreeSet si HashSet implementeaza
interfata Set; clasele TreeMap si HashMap implementeaza interfata Map.
7
Interfata Collection contine mai multe declaratii de metode care sunt definite în toate clasele care
implementeaza interfetele List si Set (derivate din interfata Collection). Dintre acestea, metodele
add(Object o) si remove(Object o) permit adaugarea unui nou element, respectiv eliminarea unui element
existent în colectie. Metoda int size() returneaza numarul de elemente al colectiei.
O caracteristica importanta a claselor de colectii îl reprezinta faptul acestea contin referinte la
Object (orice obie ct poate fi referit printr-o astfel de referinta). Acest lucru înseamna ca în aceeasi colectie
se pot introduce obiecte de orice clasa (dat fiind ca toate clasele sunt derivate din clasa Object) si nu se pot
introduce date de tipuri primitive (care nu sunt derivate din nici o clasa). Restrictia colectiilor de a nu admite
date primitive se rezolva utilizând clasele echivalente tipurilor primitive (Character, Integer etc).
Acesta caracteristica a containerelor Java (de a stoca referinte de tip Object) are otusi un
dezavantaj, deoarece, dupa introducerea unui obiect într-o colectie (memorarea referintei acestuia într-
un element al colectiei) se pierde tipul exact al referintei (care se memoreaza ca referinta la Object).
Deoarece informatia de tip a referinte i se pierde, trebuie sa fie facuta o conversie cast atunci când se
utilizeaza elementele din colectie si, daca conversia nu se face pentru tipul exact al obiectului, atunci
poate sa apara exceptii în timpul executiei.

2.5.1 Clasa ArrayList


Clasa ArrayList implementeaza interfata List si, indirect, interfata Collection, definind toate
metodele prevazute în aceste interfete.
Metodele de inserare permit adaugarea unui element la sfârsitul listei (add (Object o)) sau
într-o pozitie dorita (add(int index, Object o)). Metodele de stergere permit eliminarea unui
element de la o pozitie data (remove(int index)), sau eliminarea tuturor elementelor dintr-un interval
dat de pozitii (remove(int fromIndex, int toIndex)). Elementele se pot citi (fara a fi eliminate din
lista) cu metodele get() si get(int index).
Exemplul urmator (Colectie.java) evidentiaza modul de utilizare a unei colectii de tipul
ArrayList, precum si problemele care pot sa apara în cazul conversiilor incorecte.

//
// Colectie.java - Exemplu de container ArrayList
//
import java.util.*;
class Mar {
private int nr; Mar(int
i) { nr = i; }
void print() { System.out.println("Mar #" + nr); }
}
class Para {
private int nr; Para(int
i) { nr = i; }
void print() { System.out.println("Para #" + nr); }
}
public class Colectie {
public static void main(String[] args) {
ArrayList mere = new ArrayList();
for(int i = 0; i < 7; i++)
mere.add(new Mar(i));
// Se adauga pere la mere
mere.add(new Para(7));
for(int i = 0; i < mere.size(); i++)
((Mar)mere.get(i)).print();
// Eroarea este detectata in timpul executiei
}
}

Colectia este creata ca o instanta a clasei ArrayList. În aceasta colectie se intoduc mai multe referinte de
tip Mar si mai multe referinte de tip Par folosind metoda add. Dupa citirea elementelor din colectie (cu functia
get()), trebuie sa fie facuta conversia referintei din referinta la tipul Object (asa cum a fost memorata) la tipul
obiectului. Daca aceasta conversie se face incorect (ca în exemplul de mai sus, când referinta la un obiect de

8
clasa Para este convertita în referinta de clasa Mar), apare o exceptie in cursul executiei. Rezutatul
executiei acestui program se poate vedea în imaginea de mai jos :

2.5.2 Iteratori
Un iterator este un obiect dintr-o clasa care implementeaza interfata Iterator si care permite
parcurgerea elementelor unei colectii. Interfata Iterator prevede trei metode care se pot folosi pentru
parcurgerea colectiilor: hasNext(), next() si remove().
� boolean hasNext() returneaza valoarea true daca mai exista elemente de parcurs.
� � Object next() returneaza referinta la urmatorul element din colectie. �
� void remove() sterge din colectie ultimul element returnat de iterator. �
Un iterator se creeaza cu ajutorul metodei Iterator iterator() apelata pentru un obiect container.
Acesta metoda este declarata în interfata Collection si implementata în fiecare clasa de colectii.
Parcurgerea unei colectii folosind un iterator în locul functiei get()de citire a elementelor este,
în general mai usoara, deoarece nu mai este necesar sa se compare numarul de elemente extrase cu
numarul de elemente disponibile în container (aceasta operatie o face metoda hasNext() a iteratorului).
În plus, interfata Iterator este aceeasi indiferent de tipul containerului, si deci metodele folosite pentru
parcurgerea elementelor colectiei ramân aceleasi chiar daca se schimba tipul containerului.
În exemplul urmator (Iteratori.java) se foloseste un iterator pentru parcurgerea si afisarea
elementelor unei colectii ArrayList.

//
// Iteratori.java
//
import java.util.*;
class Numar{
int n;
public Numar(int k){ n = k; }
public String toString(){ return "n = " + n; }
}
public class Iteratori {
public static void main(String[] args) {
ArrayList numere = new ArrayList();
for(int i = 0; i < 7; i++)
numere.add(new Numar(i));

// Se listeaza elementele folosind un iterator


Iterator it = numere.iterator();
while (it.hasNext()){
Numar nr = (Numar)it.next();
System.out.println(nr);
}
}
}

9
La executia acestui program se obtin urmatoarele date:

2.5.3 Clasa LinkedList


Clasa LinkedList modeleaza o lista (secventa de elemente memorate într-o anumita ordine)
printr-o structura de date de tip lista înlantuita.
Pe lânga metodele de inserare, stergere si citire definite de interfata List (descrise la clasa
ArrayList), clasa LinkedList mai defineste câteva metode utile de acces la elementele colectiei:
adaugarea unui element la începutul listei (void addFirst(Object o) sau la sfârsitul listei (void
addLast(Object o)), eliminarea primului element (Object removeFirst()) sau a ultimului element din
lista (Object removeLast()), citirea primului element (Object getFirst()) si a ultimului element
(Object getLast()).

Clasa LinkedList poate fi folosita pentru crearea altor modele de date mai speciale, cum sunt
stivele (stacks) si cozile (queues).

Implementarea unei stive folosind clasa LinkedList. O stiva (stack) este un container de tipul
ultimul introdus, primul extras – LIFO: Last In, First Out) în care ultimul element (introdus cu operatia
push) este extras cu operatia pop. O stiva se poate realiza foarte simplu folosind clasa LinkedList, asa
cum se poate vedea în exemplul de mai jos (Stiva.java).

//
// Stiva.java
//
import java.util.*;
public class Stiva {
private LinkedList list = new LinkedList();
public void push(Object v) {list.addFirst(v); }
public Object top() { return list.getFirst(); }
public Object pop() { return list.removeFirst();}
public static void main(String[] args) {
Stiva st = new Stiva();
for(int i = 0; i < 5; i++){st.push(new Integer(i));}
System.out.println(st.pop());
System.out.println(st.pop());
System.out.println(st.pop());
System.out.println(st.pop());
System.out.println(st.pop());
}
}

La executia acestui program se obtine urmatorul rezultat:

10
Implementarea unei cozi folosind clasa LinkedList. O coada (queue) este un container de
tipul primul introdus, primul extras – FIFO: First In, First Out) în care primul element (introdus cu
operatia put) este extras cu operatia get.
La fel ca si o stiva, o coada se poate realiza foarte simplu folosind clasa LinkedList, asa cum se
poate vedea în exemplul de mai jos (Coada.java).
//
// Coada.java
//
import java.util.*;
public class Coada {
private LinkedList list = new LinkedList(); public
void put(Object v) { list.addFirst(v);}
public Object get() { return list.removeLast(); }
public static void main(String[] args) {
Coada cd = new Coada();
for(int i = 0; i < 5; i++){ cd.put(new Integer(i)); }
System.out.println(cd.get());
System.out.println(cd.get());
System.out.println(cd.get());
System.out.println(cd.get());
System.out.println(cd.get());
}
}

La executia acestui program se afiseaza numerele exact în ordinea în care au fost introduse (0,
1, 2, 3, 4).

EXERCITII

3.1 Sa se creeze o clasa care sa contina ca data membra privata un vector (tablou unidimensional) de
numere întregi de dimens iune variabila, care se stabileste pentru fiecare obiect la constructia acestuia.
În aceasta clasa redefiniti functia toString(), care sa afiseze numerele continute. În functia main() a
clasei principale construiti un obiect din clasa creata care sa contina numerele 2, 9, 4, 5, 7, 8 si afisati
continutul acestuia folosind functia toString() a clasei respective.

3.2 Sa se creeze o clasa Complex, pentru definirea unui numar complex, cu partea reala si imaginara ca
numere de tip double. Definiti constructorii, functia de afisare (toString()), functia de testare a
egalitatii a doua obiecte (equals()) , o functie care realizeaza adunarea a doua numere complexe. În
functia main() creati doua obiecte din clasa Complex, cu valorile 2, 4, respectiv 5, 6 a partilor reale si
imaginare. Verificati daca cele doua obiecte sunt egale si afisati rezultatul la consola. Calculati si afisati
suma celor doua numere complexe.

3.3 Creati si executati programele Muzica.java si Muzica1.java, asa cum sunt descrise în lucrare.

11
Testati diferitele cerinte de spacificatii ale claselor si metodelor abstracte (daca este posibil ca o metoda
abstracta sa fie definita, ce se întampla daca o clasa derivata nu defineste o metoda abstracta mostenita
etc.). Comparati clasa abstracta cu interfata. Ce diferenta exista ?

3.4 Sa se creeze un program care sa contina urmatoarele clase si interfete:


� Clasa Flori care are o variabila membra private int petale; si functiile necesare pentru
citirea si scrierea acestei variabile, constructori, functii utilitare (de ex. toString(), etc). �
� Interfata Sepale care declara functiile int getSepale() si void setSepale(int s);
� � Clasa Lalea derivata din clasa Flori, care implementeaza interfata Sepale. �
� Clasa Ghiocel derivata din clasa Flori, care implementeaza interfata Sepale. �
În functia main() a programului sa se creeze un vector de referinte în care sa se introduca un obiect Lalea cu 4
petale si 5 sepale si un obiect Ghiocel cu 6 petale si 7 sepale. Afisati la consola obiectele din vector.

3.5 Sa se creeze un program care sa contina urmatoarele clase si interfete:


� Clasa Persoana care contine variabila membra private String nume, functiile necesare
� pentru citirea si scrierea acestei variabile, constructori, etc. �
� Interfata Adresa care declara functiile abstracte String getAdresa() si void �
setAdresa(String s);
� � Clasa Student care extinde clasa Persoana si implementeaza interfata Adresa. �
� Clasa Profesor care extinde clasa Persoana si implementeaza interfata Adresa. �
În functia main() a programului sa se creeze un obiect Student, cu numele Marinescu si adresa
Bucuresti si un obiect Profesor cu numele Popescu si adresa Ploiesti. Afisati la consola datele
celor doua obiecte (numele si adresa).

3.6 Introduceti si executati programele de colectii prezentate în lucrare (Colectie.java,


Iteratori.java, Stiva.java, Coada.java). Modificati programul Colectie.java, astfel încât
elementele din lista sa fie parcurse folosind un iterator.

3.7* Clasa Collections contine mai multe metode statice care opereaza asupra colectiilor (la fel cum
clasa Arrays contine metode statice care opereaza asupra tablourilor). Folosind documentatia Sun
(docs) scrieti un program în care creati o colectie de obiecte de tip String, apoi gasiti si afisati sirul cel
mai mare, cel mai mic sau un sir dat. Încercati aceeasi operatie pentru o colectie de obiecte dintr-o clasa
proprie (de exemplu clasa Mar, din programul Colectie.java). Identificati cauza exceptiei care se
obtine în timpul executiei si completati clasa Mar astfel încât sa suporte operatiile de comparatie
necesare si sa otineti rezultatul corect.

12
���������������������������������������������������������������������������
���������������������������������������������������������������������������������
�����������������������������������������������������
TPI – Lucrarea de laborator Nr.3

INTERFETE GRAFICE JAVA- APPLET-URI

Primul pachet de clase pentru dezvoltarea interfetelor grafice a fost pachetul java.awt, care
a fost introdus din versiunea JDK 1.0. Ulterior acest pachet a fost dezvoltat, iar începând de la
versiunea JDK 1.2 a fost introdus înca un pachet (javax.swing), care ofera mai multe functii si un
aspect mai placut interfetelor dezvoltate.
În momentul de fata, în versiunile JDK se pot folosi ambele pachete pentru interfetele grafice.
În continuare va fi descris modul de creare a interfetelor grafice folosind pachetul AWT (Abstract
Windowing Toolkit).

4.1 INTERFATA GRAFICA AWT


Pachetul AWT pune la dispozitia utilizatorului o serie de componente grafice (components,
widgets, controls), clase pentru evenimente, interfete etc.. Utilizând aceste componente, programatorul
le poate combina pentru a construi o anumita interfata grafica (Graphical User Interface- GUI). Din
punctul de vedere al utilizatorului, componentele grafice AWT sunt caracterizate printr-o forma,
printr-un aspect (look -ceea ce se vede pe ecran) si prin modul de comportare, ca raspuns la actiunile
cu utilizatorulului (feel). La actiunea utilizatorului asupra unei componente grafice, JVM, având ca
suport sistemul de operare, genereaza asa-numitele evenimente (obiecte Java ce contin diferite
informatii despre actiunea utilizatorului asupra componentei). Evenimentele (obiectele) sunt, mai
departe, transmise de JVM unor metode specifice din cadrul programului. Aceste metode sunt scrise
de programator, sunt asociate cu componentele grafice si sunt responsabile de actiunea programului la
aparitia evenimentelor (la actiunile utilizatorului asupra componentei respective). Exista o varietate
mare de componente, si fiecare componenta grafica poate genera anumite tipuri de evenimente.

4.1.1 Ierarhia de componente AWT


La baza ierarhiei componentelor grafice AWT (mai putin componentele de tip meniu) sta
clasa Component, asa cum se vede în figura de mai jos. Din clasele de componente grafice o
categorie aparte sunt componentele de tip Container care permit includerea altor componente
grafice în interiorul lor. Pentru crearea de meniuri exista clasele derivate din clasa MenuComponent.
Clasa Component defineste o serie de metode general valabile pentru componentele grafice
AWT. Printre acestea exista metode legate de pozitionarea si dimensiunea componentei, de culorile
utilizate pentru afisare, de tipurile de fonturi utilizate, de control al afisarii etc.
Pachetul java.awt contine o serie de componente grafice simple, necesare în construirea
unei interfete grafice minimale. Aceste componente sunt: Label (se foloseste doar pentru afisarea
unei linii de text, nu interactioneaza cu utilizatorul), Button (creaza imaginea unui buton asupra
caruia se poate actiona prin “apasare”), Choice (permite selectia numai a unui articol dintr-o lista de
articole), List (liste de selectie), Checkbox (casete de validare) si altele.
În vederea lucrului cu texte, pachetul java.awt contine doua clase instantiabile:
TextField, pentru lucrul cu o singura linie de text, si TextArea pentru lucrul cu texte pe mai
multe linii.
Componentele de tip container sunt componentele care furnizeaza cadru de plasare a
componentelor grafice. Adaugarea de noi componente în interiorul containerelor se face prin metode
add. Pentru dispunerea componentelor în cadrul unui container se asociaza acestuia un administrator
de pozitionare (LayoutManager) care defineste regulile de asezare a componentelor în container.
Clasele disponibile pentru instantierea containerelor sunt clasele: Panel, Applet, ScrollPane,
Window, Dialog, Frame. Componentele de tip Panel, Applet, ScrollPane pot sa fie
adaugate la rândul lor în alte containere. Cele de tip Window, Dialog, Frame nu permit acest
lucru.
Pentru lucrul cu ferestre grafice package -ul java.awt ofera o serie de clase derivate din
clasa Window: Dialog, Frame, FileDialog.

1
Interfata grafica este creata pentru a asigura comunicatia între utilizator si program. În Java
pentru comunicatia între utilizator si program se folosesc evenimente, care sunt generate de
componente (containere sau controale) la actiunile uttilizatorului. În pachetul AWT sunt prezente doua
modele de tratare a evenimentelor: unul introdus în versiunea jdk1.0.2, care mai exista doar din motive
de compatibilitate, si unul nou aparut odata cu jdk1.1, mult mai bine structurat si mai usor de utilizat,
în care tratarea evenimentelor se face prin metoda delegarii. Bineînteles, în lucrare (sectiunea 4.4.) va
fi prezentat noul model de tratare a evenimentelor.
Pentru dezvoltarea interfetelor grafice AWT se parcurg mai multe etape, care vor fi evidentiate
în exemplele urmatoare:
 Se porneste cu crearea unuia sau mai multor containere (obiecte din clase derivate din
clasa Container). 
 Se creaza controalele (cu operatorul new; de exemplu new Button(), new
Choice()). 
 Controalele create se insereaza într-un container, folosind functii add() ale
containerului. Modul de inserare a controalelor trebuie sa tina seama de administratorii de
pozitionare impliciti sau noi creati ai containerului. 

 Se prevede modul de tratare a evenimentelor generate de componente. Pentru aceasta se
creaza clase care implementeaza interfetele care contin metodele necesare tratarii
evenimentelor dorite (clase de ascultare, clase delegat). Dupa aceasta, se creaza obiecte
din clasele de ascultare (delegati) care înregistreaza ca ascultatori ai evenimentelor care
vor fi tratate. 
Componentele si evenimentele AWT se pot folosi atât pentru aplicatiile independente (de sine
statatoare - standalone) cât si pentru applet-uri.

4.2 APPLET-URI
Un applet este un program Java care se descarca o data cu o pagina HTML si este executat
înauntrul unui browser Web, ca de exemplu Netscape Navigator sau Microsoft Internet Explorer.
Pentru ca applet-urile Java sunt programe care se obtin din Internet, se considera ca nu sunt de
încredere si ca prezinta numeroase riscuri: virusarea fisierelor sistem ale unui calculator si extinderea
virusilor si pe alte discuri, distrugerea sau divulgarea informatiilor existente în calculatorul în care se
executa. Din motive de securitate, applet-urilor li se restrictioneaza operatiile pe care le pot efectua:
 Applet-urile nu pot citi sau scrie fisiere pe un disc al unui utilizator. Daca informatia
trebuie salvata pe disc în timp ce un applet este în executie, memorarea informatiei trebuie

2
facuta pe discul de pe care a fost încarcata pagina Web care contine applet-ul. 

 Applet-urile nu pot realiza o conexiune pe retea spre un computer, altul decât cel de la
care a fost încarcata pagina Web, cu exceptia îndreptarii browser-ului catre o noua locatie. 

 Applet-urile nu pot folosi librariile dinamice sau partajate de la orice alt limbaj de
programare. Desi Java poate folosi programe scrise în limbaje ca Visual C++, applet-urile
nu se pot folosi de aceste caracteristici pentru ca nu exista nici o cale pentru o verificare
adecvata a securitatii codului nonJava. 
Un aplet se defineste printr-o clasa publica care extinde clasa Applet din pachetul
java.applet, ca de exemplu:
public class HelloWorld extends java.applet.Applet { /* to do
*/ }
Clasa Applet extinde clasa java.awt.Panel, care este o ferestra si un container Java.
Aceasta definitie permite unui applet sa ocupe un loc fizic în pagina Web din fereastra browser-ului si
sa admita includerea altor componente în interiorul lui.
Metodele clasei Applet. Structura si comportarea unui applet e stabilita prin executia
metodelor acestuia, apelate de browser în diferite situatii. Exista versiuni implicite ale fiecareia dintre
metode în cazul în care nu se opteaza pentru supraîncarcarea lor. Daca un applet trebuie sa execute
functii specifice, atunci una sau mai multe din aceste metode trebuie supraîncarcate.
 init(): metoda de initializare folosita pentru a seta starea unui applet: încarcarea 
imaginilor, initializarea variabilelor, crearea obiectelor.
 start(): porneste executia applet-ului sau îl reporneste daca a fost oprit. 

 stop(): opreste un applet întrerupându-i executia dar îi pastreaza resursele intacte astfel 
încât acesta sa poata porni din nou. Un applet trebuie oprit înainte de a-l distruge. Metoda
poate fi folosita si pentru a opri executia unui applet când este necesara o pauza în
desfasurarea sa.
 destroy(): distruge un applet, eliberând toate resursele (memorie, spatiul de salvare pe 
disc). Aceasta este ultima metoda care este apelata atunci când utilizatorul paraseste
pagina care contine applet-ul.
Alte metode importante pentru un applet sunt metodele paint() si repaint(), mostenite
de apple t din clasa Component. Un applet poate apela direct functia repaint()oricând se doreste
reactualizarea ferestrei. Aceasta metoda apeleaza metoda paint(), care trebuie sa fie redefinita daca
se doreste o anumita desenare (afisare) în ferestra applet-ului. Metoda paint() mai este apelata si de
masina virtuala în mod automat, ori de câte ori este necesara redesenarea applet-ului (la
redimnsionarea ferestrei browserului în care este inclus applet-ul, la descoperirea ferestrei dupa ca a
fost acoperita sau minimizata etc.). Ca exemplu, se defineste applet-ul HelloWorld astfel:

// HelloWorld.java
import java.awt.*;
import
java.applet.*;
public class HelloWorld extends
Applet { public void
paint(Graphics g) {
g.drawString("Hello World !", 10, 10);
}
}

Acest applet afiseaza (deseneaza) sirul “Hello World !” în pozitia (10, 10) în fereastra
de afisare a browserului.
Se creaza un proiect nou utilizand NetBeans. Tipul proiectului este Java Class Library.

3
Numele proiectului va fi de exemplu HelloApplet. Se adauga o noua sursa in proiect (click dreapta pe
numele proiectului) dupa cum urmeaza:

Tipul fisierului introdus in proiect este Applet iar numele va fi HelloWorld. Se completeaza
codul conform cu sursa de mai sus. Se aplica comanda Run->Build Project. Pentru a rula appletul cu
ajutorul AppletViewer se utilizeaza Run->Run File avand selectat fisierul HelloWorld.java.

Pagina HTML pentru applet. În distributia JDK de la Oracle se gaseste un program utilitar
numit AppletViewer, care permite vizualizarea applet-urilor, controlând executia acestora într-un
mod asemanator cu un browser.
La rularea AppletViewer-ului (din NetBeans) se genereaza un fisier HTML,
HelloWorld.html in subdirectorul build al proiectului. Limbajul de Marcare HiperText
(HTML) contine un set de coduri speciale (marcaje) care se insereaza într-un text, pentru a adauga
informatii despre formatare si despre legaturi. Prin conventie, toate marcajele HTML încep cu
caracterul “<” si se termina cu caracterul “>” ( de exemplu <HTML>). Acest control, sau marcaj
HTML, comunica unui interpretor HTML (program de navigare) faptul ca documentul este scris si
formatat în limbajul HTML. Unele dintre controalele HTML sunt de tip pereche, având controale de
început (de deschidere) si de sfârsit (de închidere) ( <HTML>, </HTML>, <BODY>, </BODY>)
Compilarea applet-urilor se face tot cu compilatorul javac deoarece un applet este compus
din clase Java. Pentru introducerea (de fapt, specificarea) unui applet într-o pagina HTML se folosesc
marcajele <APPLET> si </APPLET>. Între aceste marcaje se înscriu mai multe atribute, dintre care
obligatorii sunt numele fisierului care contine clasa applet-ului (atributul CODE) si dimensiunile
ferestrei applet-ului (latimea si înaltimea: width, height).
Ca exemplu, mai jos sunt prezentate pagina HTML care contine applet-ul HelloWorld,
care poate fi creat manual in NetBeans (File -> New File -> Others (Category) -
>HTML File (File Types)) si imaginea care se obtine la încarcarea acestei pagini în browserul
Internet Explorer.
Se completeaza fisierul html generat cu urmatoarea secventa de cod:

<APPLET code="NewApplet.class" height = "250" width = "250">


</APPLET>

intre marcajele <body> si </body>.

4
Observatie. Sunt listate mai jos cazurile in care aplicatiile pot fi rulate doar daca se adauga
url-urile acestora intr-o lista de exceptii:
- daca aplicatia nu este semnata cu un certificat emis de o autoritate de certificare.
- daca aplicatia este gazduita local.
- fisierul .jar nu are atributele de Permission setate.
- aplicatia este semnata cu un certificat expirat.
- certificatul folosit pentru a semna o aplicatie nu poate fi verificat.

Dat fiind ca appletul nostru este unul local si nesemnat pentru rularea acestuia in browser este necesara
adaugarea unei exceptii de securitate. Pasii de urmat:
- se acceseaza Control Panel ->Programs-> Java
- se acceseaza pagina Security
- se adauga in Exception Site List calea catre fisierul html, de forma:
file:///C:/Users/user/Documents/NetBeansProjects/HelloApplet
/build/NewApplet.html

Se incarca pagina html in browserul Internet Explorer (appleturile nu sunt suportate in


Chrome incepand cu versiunea 45).
5
Daca se dau numai atributele de nume si dimensiune ale applet-ului, atunci fisierele class
ale applet-ului trebuie sa se afle în acelasi director cu pagina HTML care îl include pentru a fi gasite si
descarcate la utilizator (browser).
Fisierul html este adaugat la creare in subdirectorul src al proiectului . La reluarea
comenzii Run->Build Project fisierul html este adaugat si in subdirectorul classes al
proiectului (acolo unde se afla fisierul class generat)
Daca appletul se afla în alt director decât pagina HTML care îl include, directorul în care se
afla fisierele class ale acestuia se specifica prin proprietatea CODEBASE a marcajului <APPLET>
sub forma unei locatii relative sau adresa URL (Uniform Resource Locator).
De exemplu, daca am lua in considerare pagina html a apletului din directorul src atunci
marcajul <APPLET> in pagina HTML va arata astfel:
<APPLET code="NewApplet.class" height = "250" width = "250"
codebase="../build/classes" >
</APPLET>

Observatii.
1. Calea catre acest fisier trebuie adaugata in lista de exceptii.(
file:///C:/Users/user/Documents/NetBeansProjects/HelloApplet/sr
c/NewApplet.html)
2. Sunt trei fisiere html (cel generat de catre AppletViewer in build, cel creat in src si
copiat ulterior in build/classes).

Daca applet-ul descris mai sus se afla în subdirectorul Hello a directorului de date publice al
serverului Web (Apache sau alt server) instalat pe statia info.tech.pub.ro, atunci marcajul <APPLET>
dintr-o pagina HTML va arata astfel:
<APPLET code="NewApplet.class" height = "250"
width = "250"
CODEBASE = ”http://info.tech.pub.ro/Hello”>
</APPLET>

Atunci când se descarca un applet din retea, se descarca mai întâi clasa principala (cea care
contine clasa derivata din clasa Applet), dupa care se descarca pe rând celelalte fisiere class ale
applet-ului. Aceasta operatie poate dura mult timp daca applet-ul contine multe clase. Se poate
accelera procesul de descarcare a applet-urilor daca se arhiveaza toate fisierele class ale applet-ului
într-o arhiva jar (Java Archive), care este o arhiva asemanatoare arhivelor zip.
Arhivarea mai multor fisiere se poate face cu programul utilitar jar din distributia
jdk1.8.0_73 (utilitarul e prezent in toate distributiile standard de Java). De exemplu, pentru
crearea unei arhive cu numele Applet1.jar compusa din toate clasele (fisierele class) care se
afla în subdirectorul Applet1, se foloseste comanda:
jar –cf Applet1.jar *.class
Daca applet-ul se prezinta sub forma unei arhive jar, atunci trebuie ca în marcajul
<APPLET> sa fie adaugate atributele CODEBASE si ARCHIVE (pe lânga atributele CODE-
obligatoriu, WIDTH si HEIGHT - optionale). De exemplu , daca applet-ul HelloWorld a fost
arhivat în arhiva HelloWorld.jar, atunci marcajul <APPLET> va arata astfel:
<APPLET CODE = HelloWorld.class height = 250 width
= 250 CODEBASE =
”http://info.tech.pub.ro/Hello”
ARCHIVE =
”HelloWorld.jar”> </APPLET>

Parametrii applet-ului transmisi în pagina HTML. Pentru transmiterea unor date applet-
urilor se poate folosi marcajul <PARAM> din limbajul HTML, care defineste numele si valoarea unui
parametru. Acesti parametri pot fi cititi în functia start() a applet-ului, memorati si apoi folositi în
6
functionarea acestuia.
Ca exemplu, se modifica applet-ul HelloWorld si se obtine applet-ul HelloNume, care
afiseaza un sir de caractere ce include numele si prenumele unei persoane salutate, iar aceste date se
introduc ca parametri în pagina HTML care insereaza applet-ul.

// HelloNume.java
import java.awt.*;
import
java.applet.*;
public class HelloNume extends
Applet { String nume = null;
String prenume =
null; public void
start(){
nume = getParameter("Nume");
prenume =
getParameter("Prenume");
}
public void paint(Graphics g) {
String str = "Hello " + nume + " " + prenume +
" "; g.drawString(str, 20, 20);
}
}

Pagina HTML contine doi parametri (Nume si Prenume), ale caror valori care sunt citite la
pornirea applet-ului (în functia start() a acestuia).

<html>
<body>
<applet
code=”HelloNume.class”>
<PARAM NAME="Nume"
VALUE="Popescu"> <PARAM
NAME="Prenume" VALUE="Ion">
</applet>
</body>
</html>
La încarcarea paginii HTML de mai sus se executa appletul, care afiseaza salutul parametrizat,
asa cum se vede în figura alaturata.

7
4.3 COMPONENTE SI CONTAINERE AWT
La baza ierarhiei de componente grafice sta clasa Component. Clasa Component defineste
o serie de metode general valabile pentru componentele grafice Java. Printre acestea exista metode
legate de pozitionarea si dimensiunea componentei, de culorile utilizate pentru afisare, de tipurile de
fonturi utilizate, de realizare a conexiunii cu alte componente, de control al afisarii etc.
 public void setVisible(boolean b) - seteaza proprietatea de
vizibilitate a unei 
componente.Componentele de tip fereastra (Frame) sunt initial invizibile . De aceea dupa
crearea unei ferestre Java e nevoie întotdeauna de apelul metodei setVisible(true)
pentru a o face vizibila.
 public void setForeground(Color c)- seteaza culoarea cu care se
deseneaza în 
componenta. Color este o clasa definita în pachetul java.awt si care permite lucrul cu
culorile într-un format RGB.
 public void setBackground(Color c)- seteaza culoarea de background (de
fond) 
a componentei.
 public void setFont(Font f)- seteaza tipul de font utilizat pentru
afisarea 
caracterelor. Clasa Font este utilizata pentru lucrul cu diferite tipuri de fonturi utilizate
pentru afisare. Un obiect de tip Font contine o serie de caracteristici ale fontului
(dimensiune, stil, bold, italic etc).

Pentru crearea unor interfete grafice, pachetul java.awt ofera o serie de componente grafice simple,
dintre care o parte vor fi folosite în programele de exemplificare care urmeaza:
 Label- se foloseste doar puntru afisarea unui text; în mod normal nu interactioneaza cu 
utilizatorul, nu raspunde la actiunile utilizatorului asupra ei.
 Button- creaza imaginea unui buton asupra caruia se poate actiona prin “apasare”. 

 Choice- permite selectia unui singur articol dintr-o lista de articole. Articolele care pot fi 
selectate sunt siruri de caractere. La selectia unui element din lista se genereaza un obiect
eveniment de tipul ItemEvent care contine pe lânga alte informatii si unele legate de
elementul selectat.
 List - permite selectia unuia sau mai multor articole dintr-o lista. Articolele sunt
afisate 
într-o componenta de dimensiune fixa, având un scrollbar. Un singur click al mouse-ului
asupra articolului selectat va genera un eveniment de tipul ItemEvent iar un dublu click
un eveniment de tipul ActionEvent.
 Checkbox- poate fi într-una din starile on sau off, reprezentate grafic printr-o forma 
geometrica (cerc, patrat) goala, respectiv bifata. Prin actiunea mouse-ului asupra acestei
componente se schimba starea ei si se genereaza un eveniment de tipul ItemEvent.
Componenta poate fi utilizata singura (ca în exemplul dat) sau într-un grup de astfel de
componente (radio buttons). În cazul unui grup, o singura componenta poate fi în
starea on. Gruparea componentelor de tip Checkbox se face cu ajutorul clasei
CheckboxGroup. Metoda setState(boolean state) seteaza starea
componentei.
Pachetul java.awt contine componente de tip container derivate din clasa abstracta
Container. Scopul lor este de a implementa un cadru grafic în care alte componente (inclusiv alte
componente de tip container) sa poata fi asezate. Adaugarea unor alte componente în interiorul unui
container se face cu ajutorul unor metode add, mostenite din clasa Component.
Clasa Container fiind abstracta nu poate fi utilizata pentru a instantia un obiect. Pentru a
creea efectiv un container sunt puse la dispozitie urmatoarele clase: Panel, Applet, ScrollPane,
8
Window, Dialog si Frame.
Un applet extinde containerul Panel, care este inclus în fereastra browser-ului în momentul
încarcarii applet-ului. O aplicatie însa, în momentul în care este lansata în executie nu are asocia ta nici
o fereastra astfel încât, pentru a avea o interfata grafica, aplicatiile trebuie sa-si creeze si sa-si afiseze
singure ferestrele. În pachetul java.awt exista urmatoarele clase ce implementeaza ferestre grafice:
Window, Frame, Dialog si FileDialog (derivata din clasa Dialog). Clasa Window
este clasa de baza pentru toate celelalte trei clase, fiind dervata la rândul ei din clasa Container. O
instanta a clasei Window genereaza un eveniment de tipul WindowEvent la deschiderea si
închiderea ferestrei grafice. Clasa Frame implementeaza si ea o componenta grafica de tip fereastra
care are în plus o bara de titlu, poate avea o bara de meniuri si se poate crea în mod independent fata
de alte ferestre.

4.3.1 Pozitionarea componentelor grafice în containere


Interfata grafica AWT prevede o modalitate de pozitionare a componentelor grafice în ferestre
(containere) într-un mod independent de platforma de lucru (rezolutia si dimensiunea ecranului).
Acesta modalitate ofera posibilitatea de organizare a unor ierarhii de containere si, în fiecare container
componentele sunt aranjate conform administratorului de pozitionare (layout manager)asociat
containerului. Fiecare container este asociat cu un administrator de pozitionare, care este un obiect
dintr-o clasa care implementeaza interfata LayoutManager. Administratorul de pozitionare al unui
container poate fi cel implicit sau unul nou creat, care îl înlocuieste pe cel existent atunci când se
apeleaza functia de asociere setLayout() a containerului. Cei mai importanti administratori de
pozitionare sunt definiti de clasele FlowLayout si BorderLayout.

Un administrator din clasa FlowLayout prevede dispunerea


componentelor de la stânga la dreapta, de sus în jos, în limita
dimensiunilor ferestrei, în ordinea inserarii în container. Inserarea
unei componente în container se face apelând metoda add() a
containerului, care primeste ca argument referinta componentei
inserate. Orice applet are ca administrator de pozitionare implicit un
administrator de tipul FlowLayout.
Un administator din clasa BorderLayout prevede
împartirea suprafetei containerului în cinci zone: centru, nord, sud,
est, vest, si în fiecare zona se poate insera o componenta. Metoda de
inserare a containerului este o versiune supraîncarcata a metodei
add() careia i se paseaza doua argumente: primul este o constanta
sir de caractere care trebuie sa ia una din valorile ”Center”,
”North”, ”South”, ”East”, ”West”, (în functie de zona în
care se insereaza componenta), iar al doilea argument este referinta
componentei care
se insereaza. Valoarea implicita a primului argument este ”Center”ceea ce înseamna ca, daca se
foloseste versiunea cu un singur argument a functiei add(), atunci componenta se plaseaza în zona
din centru. Dimensiunile componentelor sunt expandate astfel încât sa ocupe întraga suprafata a
containerului. O aplicatie independenta (Frame) are administratorul de pozitionare implicit un obiect
de tipul BorderLayout.
Imaginile din dreapta sunt ale aceleasi aplicatii care contine 5 butoane, dar au pozitionari
diferite (FlowManager si BorderManager). Cele doua versiuni difera doar prin apelul functiei
setLayout(new FlowLayout()); introdus în prima versiune care obtine astfel un administrator
de tip FlowManager..
Ierarhiile de containere se realizeaza folosind containere de tip Panel, care se pot include un
în alte containere, pe oricîte niveluri, rezultând interfete oricât de complexe este necesar. .
Un exemplu simplu de aplicatie Java cu interfata grafica AWT este prezentat în continuare.
Interfata grafica este constituita dintr-un container care este o fereastra cadru (clasa FrameSimplu,
derivata din clasa Frame) care contine 4 butoane (de clasa Button, denumite nord, sud, est,
vest) si un control de editare (de clasa TextField, numit text). Se intentioneaza urmatoarea

9
functionare: la apasarea unui buton, în controlul de editare se va afisa denumirea (eticheta) butonului
apasat.
Dupa crearea controalelor în constructorul clasei FrameSimplu, acestea sunt inserate în
container folosind functii add ale containerului. Urmeaza o parte de cod pentru tratarea evenimentelor
care se genereaza la actionarea butoanelor si care va fi explicata în sectiunea urmatoare.
O aplicatie independenta Java (cu sau fara interfata grafica) este lansata în executie prin apelul
metodei main() a aplicatiei (de catre JVM). Pentru aplicatiile cu interfata grafica, în functia
main() se creaza fereastra cadru (new FrameSimplu (“Exemplu”)), care devine vizibila prin
executia (în constructorul ferestrei) a metodei setVisible(true).

//
// Program FrameSimplu.java pentru testarea interfetei AWT
//
import java.awt.*;
import java.awt.event.*;
class FrameSimplu extends Frame{
Button nord;
Button sud;
Button est;
Button vest;
TextField text;
public FrameSimplu(String str){ super(str);
// Crearea componentelor
nord = new Button("Nord");
sud = new Button("Sud");
est = new Button("Est");
vest = new Button("Vest");
text = new TextField();
// Inserarea componentelor in container
//
add("North", nord);
add("South", sud);
add("East", est);
add("West", vest);
add("Center",
text);
//Tratarea(delegareaevenimentelor
BL bl = new BL ();
nord.addActionListener(bl);
sud.addActionListener(bl);
est.addActionListener(bl);
vest.addActionListener(bl);
addWindowListener(new WA()); setSize(200,90);
setVisible(true);
}
// Clasa pentru tratarea evenimentelor de la
//butoane
class BL implements ActionListener{
public void actionPerformed(ActionEvent event){
Button b = (Button)event.getSource();
String str = b.getLabel(); text.setText(str);
}
}
//Clasa pentru tratarea evenimentului de inchidere a
ferestrei class WA extends WindowAdapter{
public void windowClosing(WindowEvent e){

10
System.exit(0); }
}
public static void main(String[]
args){ new
FrameSimplu("Exemplu");
}
}

La executia acestui program se obtine imaginea din


figura alaturata.

4.4 TRATAREA EVENIMENTELOR


INTERFETEI GRAFICE AWT
Modelul de evenimente introdus odata cu jdk1.1 contine o sursa care poate genera un
eveniment si unul sau mai multi delegati (ascultatori - listeners) care pot actiona la aparitia
evenimentului. Sursa poate fi oricare din componentele grafice. Diferite surse pot genera diferite tipuri
de evenimente. Delegatii care sunt responsabili de raspunsul la eveniment, sunt definiti de programator
si pot fi orice clase ce implementeaza o interfata corespunzatoare (implicit si metodele ei)
evenimentului respectiv. Pentru simplificarea scrierii codului, în loc de implementarea completa a unor
interfete sunt definite clase de tip Adapter, care pot fi extinse în modul dorit.
Pe lânga implementarea clasei delegat, programatorul este responsabil de asocierea ei cu sursa
de evenimente (de delegare). Aceasta asociere se poate face printr-o anumita metoda a sursei (a
componentei grafice), metoda dependenta de tipul delegatului care trebuie conectat (de exemplu
addMouseListener, addActionListener). Acest model prin care programatorul deleaga un
obiect sa se ocupe de anumite evenimente care apar în cadrul altui obiect, se numeste delegare.

4.4.1 Evenimente si interfete de ascultare (delegat)


Clasele pentru evenimente (ActionEvent, ItemEvent etc.) ca si interfetele de ascultare
(ActionListener, ItemListener) sunt continute în pachetul java.awt.event, dar unele
dintre superclasele acestora sunt continute în alte pachete, asa cum se poate vedea în figura de mai jos.
În acesta diagrama a claselor, toate clasele care nu au înscris în numele lor numele pachetului apartin
pachetului java.awt.event.

Urmatorul tabel prezinta evenimentele generate de diferite componente si interfetele pe care


clasele delegat trebuie sa le implementeze pentru fiecare tip de eveniment.

11
Evenimente si interfete de ascultare Componentele care genereaza
(listener) evenimentul

Button, List, TextField, MenuItem


ActionEvent si clasele
ActionListener derivate din aceasta
AdjustmentEvent Scrollbar
AdjustmentListener
ComponentEvent Component si clasele derivate din aceasta
ComponentListener
ContainerEvent Container si clasele derivate din aceasta
ContainerListener
FocusEvent Component si clasele derivate din aceasta
FocusListener
KeyEvent Component si clasele derivate din aceasta
KeyListener
MouseEvent (atât pentru apasare cât si
miscare) Component si clasele derivate din aceasta
MouseListener
MouseEvent (atât pentru apasare cât si
miscare) Component si clasele derivate din aceasta
MouseMotionListener
WindowEvent Window si clasele derivate din aceasta
WindowListener
Checkbox, CheckboxMenuItem,
ItemEvent Choice,
List si orice clasa care imple menteaza
ItemListener interfata
ItemSelectable
Orice clasa derivata din clasa
TextEvent TextComponent
TextListener

Pentru unele interfete, care au mai multe metode (de exemplu, WindowListener) în clasele
de delegare ar trebui implementate toate metodele, nu numai cele care ne intereseaza. Pentru a
simplifica scrierea codului, fiecare interfata de delegare care are mai mult de o metoda este furnizata
împreuna cu cu o clasa adaptor (adapter) care prevede implementari implicite pentru fiecare dintre
metodele interfetei. Extinderea clasei adaptor permite redefinirea numai a functiilor strict necesare, pe
câta vreme implementarea interfetei necesita definirea tuturor functiilor acesteia.
În tabelul urmator sunt prezentate interfetele de ascultare (delegat) (si clasele adaptor
corespunzatoare) precum si metodele fiecarei interfete (sau adaptor).

Interfata delegat / adaptor Metodele interfetei

ActionListener actionPerformed(ActionEvent)
AdjustmentListener adjustmentValueChanged(
AdjustmentEvent)
ComponentListener componentHidden(ComponentEvent)
ComponentAdapter componentShown(ComponentEvent)
componentMoved(ComponentEvent)
componentResized(ComponentEvent
)
ContainerListener componentAdded(ContainerEvent)
12
componentRemoved(ContainerEvent
ContainerAdapter )
FocusListener focusGained(FocusEvent)
FocusAdapter focusLost(FocusEvent)
KeyListener keyPressed(KeyEvent)
KeyAdapter keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener mouseClicked(MouseEvent)
MouseAdapter mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener mouseDragged(MouseEvent)
MouseMotionAdapter mouseMoved(MouseEvent)
WindowListener windowOpened(WindowEvent)
WindowAdapter windowClosing(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
ItemListener itemStateChanged(ItemEvent)
TextListener textValueChanged(TextEvent)

4.4.2 Asocierile dintre obiectele delegat si componente


Pentru tratarea unui eveniment se creaza mai întâi o clasa care implementeaza interfata care
contine functia de tratare a acelui eveniment si se defineste aceasta functie. Dupa aceasta, se
instantiaza un obiect din acea clasa (daca nu exista unul deja instantiat) si se asociaza cu componenta
al carui eveniment trebuie sa îl trateze.
Asocierea se realizeaza prin apelul unei metode a componentei respective. Aceste metode de
asociere (de delegare) sunt prevazute în clasele componentelor în functie de evenimentele pe care
acestea le pot genera si au un nume compus din particula add, urmata de numele interfetei de delegare
a evenimentului. De exemplu, pentru asocierea unui obiect delegat cu tratarea evenimentului de
apasare a unui buton se foloseste metoda (clasei Button) addActionListener(); pentru
asocierea unui obiect delegat cu tratarea evenimentelor de fereastra se foloseste metoda (clasei
Window) addWindowListener() etc.
De exemplu, pentru tratarea evenimentului de apasare a unui buton (ActionEvent) se
creaza o clasa care implementeaza interfata corespunzatoare acestui eveniment (ActionListener)
si se defineste metoda de tratare a evenimentului din interfata implementata
(actionPerformed()). Dupa aceasta se instantiaza un obiect din clasa creata si se asociaza cu
butonul a carui evnimnt se trateaza.
În exemplul din sectiunea precedenta (FrameSimplu) pentru tratarea evenimentelor
butoanelor s-a creat clasa BL care implementeaza interfata ActionListener si defineste metoda
actionPerformed() pentru tratarea evenimentelor de tip ActionEvent care se genereaa la
apasarea unui buton. Obiectul bl (de clasa BL) este obiectul delegat sa execute tratarea evenimentelor.
El se înregistreaza (asociaza) la fiecare dintre butoane prin apelul metodei addActionListener()
a butonului respectiv. Pentru tratarea evenimentului de închidere a ferestrei aplicatiei s-a folosit ca
obiect delegat o instanta a clasei WL care extinde adaptorul WindowAdapter si redfineste doar
metoda pentru tratarea evenimentului de închidere a ferestrei în functia windowClosing().
Asocierile dintre obiectele delegat si componente sunt de tipul M:N, adica un obiect delegat
(ascultator) poate fi ascociat cu oricâte componente, iar un eveniment al unei componente poate fi
tratat de oricâte obiecte delegat. Atunci când o componenta genereaza un eveniment, aceasta apeleaza
13
metodele de tratare ale evenimentului respectiv ale tuturor obiectelor delegat care s-au înregistrat
pentru acel eveniment, transmitând ca parametru evenimentul respectiv.
O clasa delegat poate trata evenimente de un anumit tip de la una sau mai multe componente.
Daca se trateaza evenumentele de la mai multe componente, atunci obiectul delegat se înregistreaza la
fiecare componenta iar functia de tratare implementata de clasa trebuie sa diferentieze operatiile
efectuate în functie de componenta care a generat evenimentul.
Sursa evenimentului se afla prin apelul metodei public Object getSource()
mostenita de orice clasa eveniment de la clasa de baza a tuturor evenimentelor, clasa EventObject.
În exemplul dat, clasa BL trateaza evenimentele de la toate cele 4 butoane si pentru aceasta identifica
componenta sursa prin operatia: Button b = (Button)event.getSource().
Tratarea evenimentelor se poate face de catre orice clasa care implementeaza interfata
evenimentului respectiv. De regula (ca si în exemplul de mai sus) se creaza o clasa noua ca si clasa
interna a clasei containerului. În exemplul dat clasele de delegare BL si WL sunt clase interne ale clasei
containerului (FrameSimplu).
Mai exista si alte posibilitati, de exemplu chiar clasa containerului poate trata evenimentele
emise de componentele pe care le contine daca implementeaza interfetele necesare, defineste functiile
de tratare corespuntatoare si se înregistreaza ca ascultator la fiecare componenta.

4.5 TRANSFORMAREA UNUI APPLET ÎN APLICATIE INDEPENDENTA


Un program Java poate fi scris astfel încât sa poata fi executat atât ca aplicatie independenta,
cât si ca applet. Pentru aceasta, clasa principala a aplicatiei extinde clasa Applet (astfel încât poate fi
executat de un browser), dar contine si functia main(), astfel încât poate fi executat si ca aplicatie
independenta. Toate functiile care trebuie sa fie executate sunt plasate în applet (componente, tratarea
evenimentelor etc.). În functia main() se creaza applet-ul si o fereastra cadru (frame), în care se
înglobeaza applet-ul.
Acest mod de functionare este exemplificat în programul de mai jos. În partea dreapta a
paginii se observa imagin ile obtinute la executia programului ca aplicatie independenta si ca applet în
browserul Internet Explorer.

// FrameApplet.java
import java.awt.*;
import
java.awt.event.*;
import java.applet.*;
public class FrameApplet extends
Applet{ Button b1 = new
Button("B1");
Button b2 = new Button("B2");
TextField text = new
TextField(20);
public void init() {
b1.addActionListener(new B1());
b2.addActionListener(new B2());
add(b1);
add(b2);
add(text);
}
class B1 implements
ActionListener { public void
actionPerformed
(ActionEvent e) {
text.setText("Button
1");
}

14
}
class B2 implements
ActionListener { public void
actionPerformed(
ActionEvent e) {
text.setText("Button
2");
}
}
static class WL extends WindowAdapter {
public void windowClosing(WindowEvent
e) { System.exit(0);
}
}
public static void main(String[] args)
{ FrameApplet applet = new
FrameApplet(); Frame aFrame = new
Frame("FrameApplet");
aFrame.addWindowListener(new WL());
aFrame.add(applet,
BorderLayout.CENTER);
aFrame.setSize(300,200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}

Dupa compilare, programul se poate executa ca aplicatie de sine statatoare (Run->Run


Project) sau ca applet (din mediul NetBeans cu Run->Run File sau inserat într-o pagina
HTML care include clasa principala (FrameApplet) a applet-ului. La încarcarea paginii în browser,
se executa applet-ul, cu aceeasi functionare ca si aplicatia independenta.

EXERCITII

1. Creati si executati programele HelloWorld, HelloNume, FrameSimplu,


FrameApplet. Pentru appleturi creati fisierele .html si rulati-le in browserul Internet
Explorer.

2. Creati si executati aplicatia de pozitionare a componentelor prezentata în sectiunea 4.3.1.


Modificati administratorul de pozitionare in programul FrameSimplu astfel încât sa obtineti
cele doua imagini prezentate. Transformati aplicatia în applet si încercati aceeasi
functionaliate, adaugând administratorii de pozitionare adecvati. Este important ca în orice
aplicatie independenta sa adaugati clasa si functia de tratare a evenimentului de închidere a
15
ferestrei (windowClosing()), altfel ferestra aplicatiei nu se va închide si trebuie sa fie
închisa ferestra DOS din care a fost lansdata aplicatia cu interfata grafica.

3. Scrieti programul care genereaza aplicatia (frame-ul) din


figura alaturata. În controlul de editare se va afisa articolul
selectat în lista de optiuni (Choice).

4. Scrieti programul care genereaza aplicatia (frame-ul) din


figura alaturata. La fiecare apasare a butonului se adauga un
element în lista de optiuni (List).

5. Transformati în applet aplicatiile de la exercitiile 4.8 si 4.9.

16
1
7
TPI – Lucrarea de laborator Nr. 4

LIMBAJE DE PROIECTARE WEB

HYPERTEXT MARKUP LANGUAGE

În această lucrare se va continua studiul limbajul HTML, al cărui marcaj <APPLET> a fost
introdus în lucrarea precedentă. HTML este un limbaj de marcare, un limbaj care descrie cum trebuie să
fie formatate textele. Termenul de „marcare” provine din timpurile vechi, când editorii făceau marcaje
pe documente pentru a indica tipografului ce font-uri să folosească . Limbajele de marcare conŃin
comenzi explicite pentru formatare. De exemplu, în HTML, <B> înseamnă început de mod aldin şi </B>
înseamnă terminarea utilizării modului aldin. Avantajul utilizării unui limbaj de marcare faŃă de unul în
care nu se utilizează marcarea explicită constă din faptul că este simplu de scris un program de navigare
care să interpreteze comenzile de marcare. Documentele scrise într-un limbaj de marcare pot să fie
comparate cu cele obŃinute utilizând procesoare de text de tip WYSIWYG (What You See Is What You
Get – ce vezi este ceea ce obŃii), de ex. MS-Word. Acest tip de sisteme pot să memoreze fişierele
utilizând marcaje ascunse pentru ca formatarea să se poată reface ulterior. Prin standardizarea şi
includerea comenzilor de marcaj în fiecare fişier HTML, devine posibil ca orice program de navigare să
poată să citească şi să formateze orice pagină Web.
Procesoarele de text de tip WYSIWYG comerciale nu pot să fie utilizate pentru Web, deoarece
limbajul lor intern de marcare, dacă există, nu este standardizat între furnizori, calculatoare şi sisteme de
operare. De asemenea ele nu pot să realizeze reformatarea pentru diferite dimensiuni de ferestre sau
rezoluŃii. Pe de altă parte, o serie de procesoare de text permit salvarea documentelor în format HTML
în loc de formatul propriu (de exemplu, MS Word). Când programul Mosaic era singurul program de
navigare, limbajul utilizat de el, HTML 1.0 , reprezenta standardul de facto. Când au apărut programe de
navigare noi, a fost necesar un standard oficial Internet şi aşa au apărut HTML 2.0, HTML 3.0, HTML
4.0, versiunile evoluând odată cu eforturile de cercetare de a adăuga noi facilităŃi versiunilor anterioare,
incluzând tabele, instrumente, formule matematice, forme avansate de descriere a stilului (pentru
descrierea organizării paginilor şi definirea semnificaŃiilor simbolurilor) etc. :
 DHTML –Dynamic HTML – animaŃia paginilor Web;
 XHTML – extensie a HTML pentru obŃinerea compatibilităŃii cu XML – Extensible Markup
Language;
 XHTML+TIME –XHTML Timed Interactive Multimedia Extension – extensie a limbajului
XHTML care oferă documentelor Web suport pentru temporizare şi sincronizare multimedia.

4.1 CARACTERISTICI DE BAZĂ


O pagină Web conŃine o zonă de cap şi o zonă de corp, cuprinse între marcajele (tag-uri)
<HTML> şi </HTML>, dar majoritatea programelor de navigare ignoră absenŃa acestor marcaje. Capul
este cuprins între marcajele <HEAD> şi </HEAD>, iar corpul între marcajele <BODY> şi </BODY>.
Comenzile cuprinse între aceste marcaje se numesc directive. Majoritatea marcajelor HTML au acest
format <....> pentru a indica începutul a „ceva” şi </.....> pentru a marca sfârşitul.
Majoritatea programelor de navigare au o opŃiune View Source (afişarea sursei). Selectarea acestei
opŃiuni afişează pagina curentă în format HTML în loc de forma interpretată. Marcajele pot să fie scrise
cu litere mici sau mari. Adica <HEAD > şi <head > înseamnă acelaşi lucru, dar prima formă este de
preferat pentru cititorii umani. Cum este dispus textul în documentul HTML este nesemnificativ.
Programele de navigare ignoră spaŃiile şi trecerile la rând nou, deoarece textul trebuie să fie formatat
pentru a corespunde zonei de afişare curente. Corespunzător, se pot utiliza spaŃii pentru a face

53
documentele HTML mai uşor de citit, ceea ce ar fi necesar pentru majoritatea documentelor. Liniile albe
nu pot să fie utilizate pentru separarea paragrafelor, deoarece sunt pur şi simplu ignorate. Este necesară
utilizarea unor marcaje explicite.
Unele marcaje au parametri (care au nume), de exemplu <IMG SRC=sursa_imaginii>.
Pentru fiecare marcaj, standardul HTML oferă o listă a parametrilor care pot să fie utilizaŃi, dacă este
cazul şi care este semnificaŃia lor. Deoarece parametrii au nume, ordinea în care se dau valorile
parametrilor nu este semnificativă.
Din punct de vedere tehnic, documentele HTML sunt scrise utilizând setul de caractere ISO
8859-1 Latin-1, dar pentru utilizatorii ale căror tastaturi suportă numai codul ASCII, se pot utiliza
secvenŃe de caractere pentru reprezentarea caracterelor speciale cum ar fi è. Lista caracterelor speciale
este precizată în standard. Toate încep cu caracterul „&” şi se termină cu „;”. De exemplu, &egrave;
produce è iar &eacute; produce é. Deoarece <, > şi & au semnificaŃii speciale, pot să fie
reprezentate numai utilizând secvenŃele speciale de caractere corespunzătoare, &lt; &gt; şi &amp; .
Principalul element din zona de cap este titlul care este cuprins între <TITLE> şi </TITLE>, dar aici
pot să apară şi alte tipuri de informaŃii. Titlul nu este afişat pe pagină. Unele programe de navigare îl
utilizează pentru a eticheta fereastra în care se afişează pagina respectivă.

 Exemplul 0.

<HTML>
<TITLE>Character Entities Example</TITLE>
<BODY BGCOLOR=white>

The following are formatted using &lt;b&gt; for bold

face, and &lt;i&gt; for italics.

<P>

<b>Gibt es ein Caf&eacute; in der N&auml;he? </b><br>

<I>Is there a caf&eacute; nearby?</i><p>

<b>Je voudrais un d&icirc;ner. </b><br>

<I>I want to eat dinner.</i><p>

<b>Y una mesa por ma&ntilde;ana, por favor.</b><br>

<I>And a table for tomorrow, please.</i><p>

<b>Oh! C'&egrave; una specialit&agrave; locale?</b><br>

<i>Oh! Is there a local speciality?</i><p>

</BODY>

</HTML>

54
4.2 MARCAJE HTML
În continuare sunt prezentate cele mai comune marcaje HTML.
Marcajele <Hn> - generează titlurile de capitole; n este o cifră între 1 şi 6. <H1> este titlul cel
mai important, <H6> este cel mai puŃin important. Depinde de programul de navigare să prezinte aceste
titluri în mod diferit pe ecran. De obicei, titlurile cu număr mai mic vor fi afişate utilizând caractere mai
mari. Programul de navigare poate să utilizeze culori diferite pentru fiecare nivel de titlu. De obicei,
pentru titlurile marcate cu <H1> se utilizează litere mari scrise cu aldine cu cel puŃin o linie liberă
înainte şi după. Corespunzător, pentru titlurile marcate cu <H2>, se utilizează caractere mai mici cu mai
puŃin spaŃiu lăsat înainte şi după.

 Exemplul 1.

<HTML>
<HEAD>
<TITLE>The Cool Web Movie Database</TITLE>
</HEAD>

<BODY BGCOLOR=white>

Welcome to the Cool Web Movie Database. So far we offer information on


the many brilliant films of David Lean; soon a lot more will be
online.

<H1>The Early Years</H1>

<H2>In Which We Serve (1942)</H2>

Co-directed and produced by Noel Coward, this film also starred Noel
Coward as Captain Kinross and Celia Johnson as Mrs. Kinross.

<H2>This Happy Breed (1944)</H2>

Based on the play by Noel Coward, this starred Robert Newton and again
featured Celia Johnson.

<H1>Films with Sam Spiegel Productions</H1>

<H2>The Bridge on the River Kwai (1957)</H2>

Produced by Sam Spiegel, this film was the first of the Lean
blockbuster movies and featured a young Alec Guinness, William Holden,
and a brilliant performance from Sessue Hayakawa.

<H2>Lawrence of Arabia (1962)</H2>

One of my personal all-time favorite movies, this epic adventure


really established Lean as the creator of sweeping panoramas.

55
<H1>The Later Years</H1>

<H2>Doctor Zhivago (1965)</H2>

<H2>Ryan's Daughter (1970)</H2>

</BODY>
</HTML>

Marcajele <B> şi <I> sunt utilizate pentru a indica modurile aldin şi respectiv cursiv. Dacă
programul de navigare nu poate să afişeze aceste tipuri de caractere, va utiliza un alt mod de a le
reprezenta, de exemplu utilizând diferite culori. În loc de a utiliza stiluri fizice, autorii pot să utilizeze
stiluri logice, cum sunt <DN> (definiŃie), <EM> (evidenŃiere), <STRONG> (evidenŃiere accentuată) şi
<VAR> (variabile de program). Stilurile logice sunt definite într-un document numit pagină de stil.
Avantajul utilizării unei pagini de stil constă în faptul că la schimbarea unei definiŃii, se vor schimba
toate variabilele, înlocuind de exemplu cursivele printr-un font cu dimensiuni constante.

 Exemplul 2.

<HTML>
<TITLE>Starbucks</TITLE>
<BODY BGCOLOR=white>

It turns out that <B>Starbucks</B>, the popular and


fast-growing coffee chain, got its name from the
coffee-loving first mate in Melville's classic
tale of pursuit and revenge <I>Moby Dick</I>,
though few people realize it.

</BODY>
</HTML>

 Exemplul 3.

<HTML>
<TITLE>Two Points...</TITLE>
<BODY BGCOLOR=white>

I'd like to make two points during this presentation: <em>Things are
okay</em> and <strong>Things are getting better!</strong>.

</BODY>
</HTML>

Marcajul <UL> indică începutul unei liste neordonate. Elementele individuale, care sunt
marcate în sursă cu <LI>, sunt reprezentate precedate de buline (●). O variantă a acestui mecanism este
<OL> care descrie o listă ordonată. Când se utilizează acest marcaj, textele precedate de <LI> sunt
numerotate de către programul de navigare.

56
 Exemplul 4.

<HTML>
<HEAD>
<TITLE>Enchilada Recipe, v1</TITLE>
</HEAD><BODY BGCOLOR=white>

<h2>Enchilada Sauce</h2>

1. Heat a large saucepan and saute the following ingredients until


soft:

<UL>
<LI>Two tablespoons virgin olive oil
<LI>Large onion, chopped
</UL>

2. Add a quart of water.<BR>


3. Sprinkle in a quarter-cup of flour.<br>
4. Jazz it up by adding:

<UL>
<LI>Two tablespoons chili powder
<LI>Two teaspoons cumin
<LI>One teaspoon garlic powder
</UL>

5. Finally, add a teaspoon of salt, if desired.

<BR>

Whisk as sauce thickens; then simmer for 20 minutes.

</BODY>
</HTML>

 Exemplul 5.

<HTML>
<HEAD>
<TITLE>Enchilada Recipe, v1</TITLE>
</HEAD><BODY BGCOLOR=white>

<H2>Enchilada Sauce</H2>

<OL>
<LI>Heat a large saucepan, and saute the following ingredients until
soft:

57
<UL>
<LI>Two tablespoons virgin olive oil
<LI>Large onion, chopped
</UL>

<LI>Sprinkle in a quarter-cup of flour.<BR>


<LI>Jazz it up by adding:

<UL>
<LI>Two tablespoons chili powder
<LI>Two teaspoons cumin
<LI>One teaspoon garlic powder
</UL>

<LI>Add a quart of water.


<LI>Finally, add a teaspoon of salt, if desired.

</OL>

Whisk as sauce thickens; then simmer for 20 minutes.

</BODY>
</HTML>

Marcajele <BR>, <P>, <HR> - indică o separare între diferitele părŃi ale textului. Formatul
precis este descris în pagina de stil. <BR> forŃează trecerea la linie nouă. De obicei programele de
navigare nu inserează o linie liberă după <BR>. <P> reprezintă un început de paragraf, pentru care se
va insera o linie nouă şi eventual se va face o identare. <HR> forŃează trecerea la linie nouă şi desenează
o linie orizontală.

 Exemplul 6.

<HTML>
<HEAD>
<TITLE>Not Yet Ready for Prime Time!</TITLE>
</HEAD>

<BODY BGCOLOR=white>

Dave's Desk<BR>
Somewhere in Cyberspace

<P>
Dear Reader,
<P>

Thank you for connecting to my Web server, but I regret to tell you
that things aren't up and running yet!

58
They will be _soon_, but they aren't today.

<HR>
Sincerely,
<BR>
Dave Taylor
</BODY>
</HTML>

Marcajul <IMG> arată că pe poziŃia curentă din pagină se va include o imagine. Marcajul poate
să aibă o serie de parametri. Parametrul SRC indică URL-ul (sau URI-ul) imaginii. În practică, toate
programele de navigare acceptă fişiere în format GIF sau JPEG. ALLIGN este un parametru pentru
<IMG> care controlează modul în care se aliniază imaginea faŃă de limita de jos a textului (TOP,
MIDDLE, BOTTOM), ALT, care furnizează textul afişat în locul imaginii dacă utilizatorul dezactivează
opŃiunea de afişare a imaginilor.
Marcajul <A> (anchor) şi </A> este marcajul de hiper-legătură cu parametri HREF (URL-ul), NAME
(numele hiper-legăturii) şi METHODS (metodele de acces). Textul cuprins între <A> şi </A> este afişat.
Dacă este selectat, atunci se utilizează hiper-legătura pentru a se aduce o nouă pagină. În locul textului
se poate pune şi un marcaj <IMG>, caz în care, cu un click pe imagine, se va activa legatura.

 Exemplul 7.

<BODY BGCOLOR=white>

<h1>IMG Alignment Options</h1>

<h2>Align=top</h2>

Dare you continue? <a href="box-yes.html">

<img src="button.gif" Alt="only text" Align=top BORDER=0></a>

Be careful! This takes courage! (ALIGN=top)

<h2>Align=middle</h2>

Dare you continue? <a href="box-yes.html">

<img src="button.gif" ALIGN=middle BORDER=0></a>

Be careful! This takes courage! (ALIGN=middle)

<h2>Align=bottom</h2>

Dare you continue? <a href="box-yes.html">

<img src="button.gif" ALIGN=bottom BORDER=0></a>

Be careful! This takes courage! (ALIGN=bottom)

59
</BODY>

Marcajul <TABLE> este marcajul pentru tabele HTML. O tabelă HTML este formată din una sau
mai multe linii, fiecare fiind formată din una sau mai multe celule. Celulele pot să conŃină diferite tipuri
de informaŃii, inclusiv text, figuri şi chiar tabele. Celulele pot să fie alipite, de exemplu, un titlu poate să
se întindă pe mai multe coloane. Autorii paginilor au control asupra modului în care se face afişarea,
inclusiv alinierea, stilul bordurii, marginile celulelor, dar programul de navigare este cel care hotărăşte
de fapt cum se face afişarea. <TABLE> se foloseşte cu următoarele marcaje:
 <CAPTION> - furnizează un titlu tabelei
 <TR> - Table Row, linie în tabelă, precedă fiecare linie
 <TH> - Table Header, titlu de coloană, marchează celulele individuale
 <TD> - Table Data, date în tabelă.
În tabele se pot utiliza şi alte marcaje ce includ posibilitatea de a specifica alinieri orizontale sau
verticale ale celulelor, alinierea în cadrul celulei, margini, gruparea pe celule, unităŃi şi altele.

 Exemplul 8.

<HTML>
<TITLE>Using the TH Tag</TITLE>
<BODY BGCOLOR=#FFFFFF>
<CENTER>
<TABLE BORDER=5 WIDTH=50%>
<TR>
<TD COLSPAN=2 ALIGN=center><FONT SIZE=5>Arts &
Entertainment</FONT></TD>
</TR>
<TH>Show</TH><TH>Day On A&E</TH>
<TR ALIGN=CENTER>
<TD>Sherlock Holmes</TD><TD>Monday</TD>
</TR><TR ALIGN=CENTER>
<TD>Lovejoy</TD><TD>Monday</TD>
</TR>
</TABLE>
</CENTER>

4.3 FORMULARE HTML

Marcajele <FORM> şi </FORM> marchează un formular. Formularele conŃin casete şi


butoane care permit utilizatorilor să completeze informaŃii sau să facă selecŃii şi apoi să transmită
informaŃiile la proprietarul paginii. În acest scop se utilizează marcajul <INPUT>. Acesta are o
varietate de parametrii care determină mărimea, tipul şi modul de afişare a casetei utilizate. Cele mai
obişnuite sunt câmpuri în care utilizatorul poate să introducă text, casete care pot să fie selectate, hărŃi
active, butoane SUBMIT. Textele care nu sunt incluse între marcaje sunt afişate. Într-un formular poate
să fie utilizat orice marcaj obişnuit (de exemplu, marcajul <P> care indică programului de navigare să
afişeze ceea ce urmează pe o linie nouă, chiar dacă mai este loc pe linia curentă, dând astfel creatorului

60
paginii posibilitatea să controleze dispunerea textului sau cum arată formularul pe ecran). Atribute
pentru <INPUT>:
 NAME – un nume pentru variabila în care va fi memorat şirul introdus de utilizator.
 TYPE - tipul casetei care poate fi:
 TEXT - este tipul implicit, deci nu trebuie specificat TYPE=TEXT,
 RADIO - pentru specificarea butoanelor radio ce au proprietatea că selecŃia unuia dintre
ele deselectează pe toate celelalte care fac parte din acelaşi grup; modul de afişare
depinde de interfaŃa grafică pe care o utilizează. Depinde de programul de navigare să
aleagă modul de afişare care corespunde sistemului de ferestre utilizat (de exemplu,
Windows). Dacă există mai multe grupuri de butoane radio, ele se diferenŃiază prin
câmpul NAME.
 CHECKBOX – casete de selecŃie
 PASSWORD – funcŃionează la fel ca o casetă TEXT numai că nu se face afişarea
caracterelor introduse
 TEXTAREA – similară unei casete TEXT numai că va conŃine mai multe linii.
 SUBMIT – buton, când este selectat, informaŃia introdusă de către utilizator este
transmisă la calculatorul de pe care provine formularul. Similar altor tipuri, SUBMIT
este un cuvânt cheie pe care îl înŃelege programul de navigare. Programul de navigare
interpretează şi butonul RESET care selectat aduce formularul la conŃinutul original.
 HIDDEN – este utilizat numai ca rezultat, nu poate să fie selectat sau modificat; de
exemplu, atunci când se parcurg o serie de pagini pentru care s-au făcut selecŃii, selecŃiile
anterioare pot să fie de tip HIDDEN, pentru a împiedica modificarea lor.
 IMAGE – este utilizat pentru hărŃi active (sau alte imagini selectabile); dacă un utilizator
execută clic pe o astfel de imagine, coordonatele (x, y) ale punctului selectat (adică
poziŃia curentă a indicatorului mouse-ului) sunt memorate în variabile şi formularul este
în mod automat transmis posesorului pentru prelucrări ulterioare.
 VALUE – utilizat pentru a arăta care buton a fost apăsat, şirul asociat ca valoare a butonului va fi
asociat variabilei indicate de NAME. Şirul VALUE reprezintă în cazul folosirii cu butonul
SUBMIT eticheta butonului şi se afişează. De asemenea, toate casetele pot să aibă valori. Pentru
casetele TEXT, conŃinutul câmpului VALUE este afişat odată cu formularul, dar utilizatorul
poate să îl modifice sau să îl şteargă. Casetele CHECKBOX şi RADIO pot să fie iniŃializate,
utilizând însă un parametru numit CHECKED (deoarece parametrul VALUE oferă un text dar nu
indică o selecŃie).

Formularele pot să fie transmise în trei moduri: utilizând butonul SUBMIT, executând clic pe
o hartă activă sau utilizând tasta ENTER pentru un formular care conŃine numai un singur câmp de
TEXT. Când se transmite un formular, trebuie să se execute o acŃiune. AcŃiunea corespunzătoare este
specificată în parametrii marcajului <FORM>:
 ACTION – precizează URL-ul pentru a indica unde se face transmiterea
 METHOD – specifică ce metodă se utilizează, valoarea sa determină modul în care variabilele din
formular sunt transmise înapoi la posesorul paginii. Pentru GET, se utilizează un truc, şi anume
se adaugă la URL, separându-le prin semne de întrebare. Această abordare poate conduce la
URI-uri formate din mii de caractere. Totuşi, pentru că este simplă, această soluŃie este frecvent
utilizată. Dacă se utilizează metoda POST, corpul mesajului va conŃine variabilele din formular
şi valorile lor. Pentru a separa câmpurile se utilizează caracterul &; caracterul + reprezintă spaŃiu;
astfel şirul va fi transmis la server ca o singură linie. Dacă un CHECKBOX nu este selectat el este
omis din şir. Este problema serverului să interpreteze şirul respectiv.

61
 Exemplul 9.

<HTML>
<TITLE>The Local Deli Was Never Like This!</TITLE>
<BODY BGCOLOR=white>

<FORM ACTION="http://www.intuitive.com/coolweb/apps/process-form.cgi"
METHOD=GET>

<CENTER>
<IMG SRC=deli-logo.gif ALT="Dave's Virtual Deli -- The Order Menu">
</CENTER>

<HR>
Your Name? <INPUT TYPE=text NAME="name" SIZE=30>
<BR>
Secret Code: <INPUT TYPE=password NAME="password">
<HR>
<B>What kind of Sandwich? </B>

<SELECT NAME="Sandwich">
<OPTION>(none)
<OPTION>Turkey on a croissant
<OPTION>Ham and cheese on wheat
<OPTION>Veggie on nine-grain
</SELECT>

<BR>
<B>Any Soup? </B>

<SELECT NAME="Soup">
<OPTION>(none)
<OPTION>Tomato and Rice
<OPTION>Cream of Asparagus
<OPTION>Lentil Madness!
</SELECT>

<P>
How you'll pay:
<INPUT TYPE=radio NAME="payment" VALUE="visa">VISA
<INPUT TYPE=radio NAME="payment" VALUE="mastercard">MasterCard
<INPUT TYPE=radio NAME="payment" VALUE="account" CHECKED>Account
<INPUT TYPE=radio NAME="payment" VALUE="dishes">Wash dishes

<HR>

<INPUT TYPE=checkbox NAME="firstorder" VALUE="firstorder">First Time


Ordering from the Virtual Deli
<P>

62
<CENTER><INPUT TYPE=image SRC="submit.gif" ALT="Submit Order"
BORDER=0></CENTER>
</FORM>
</BODY>
</HTML>

EXERCIłII

4.1 TestaŃi exemplele prezentate în lucrare.

4.2 CreaŃi un formular care să includă un câmp de text pentru introducerea numelui şi un
câmp pentru specificarea parolei, ambele centrate şi etichetate corespunzător.

4.3 CreaŃi un formular care să includă două grupuri de butoane radio, cu primul buton al
fiecărui grup selectat.

4.4 CreaŃi un document html care să simuleze cuprinsul unei cărŃi (două capitole
principale, fiecare cu câte două subcapitole care au la rândul lor câte două subcapitole.)

4.5 Sa se afiseze intr-o pagina HTML (cu titlul “Laborator TPI, 2016”) urmatoarele
informatii:

4.6 Se afiseze intr-o pagina HTML (cu titlul “Laborator TPI, 2015”) urmatoarele
informatii:

63
4.7 CreaŃi un document html care să conŃină o hiperlegătură „test” către o pagină ce
cuprinde o listă ordonată de două întrebări cu câte trei variante de răspuns fiecare. Prima
întrebare permite selectarea unei singure variante de răspuns, cea de-a doua întrebare
permite selectarea oricâtor variante de răspuns ca fiind corecte.

4.8 CreaŃi un document html care să afişeze textul „Majoritatea marcajelor HTML au
acest format <......> pentru a indica începutul a „ceva” şi <.....> pentru a marca sfârşitul.
Selectati din urmatoarea lista marcajul care genereaza un titlu de capitol: „ urmat de un
element listă ce permite selecŃia uneia din cele 3 variante: <TITLE> <H1> <HTML>.

4.9 CreaŃi fişierul sursă HTML astfel încât afişarea în fereastra browserului să arate ca
mai jos:

64
JAVASCRIPT

În zilele de început ale World Wide Web-ului, HTML era destul de simplu, iar marea majoritate
a informaŃiilor necesare pentru a asambla o pagină Web erau uşor de învăŃat. Odată cu creşterea Web-
ului, au crescut şi aspiraŃiile creatorilor de pagini Web, iar cerinŃele lor în sensul unui control mai mare
asupra aspectului paginii au forŃat limbajul HTML să se modifice şi să devină din ce în ce mai complex.
Întrucât Web-ul este un mediu dinamic, creatorii de pagini Web au dorit ca paginile lor să interacŃioneze
cu utilizatorii şi a devenit în scurt timp clar că limbajul HTML nu putea satisface această cerinŃă.
Netscape a inventat limbajul JavaScript ca o modalitate de a controla browserul şi de a adăuga paginilor
Web interactivitate.
În ciuda numelor asemănătoare, limbajele JavaScript şi Java nu au aproape nimic în comun unul
cu celălalt. Java este un limbaj de programare dezvoltat şi comercializat iniŃial de compania Sun
Microsystems. Principala utilizare a limbajului Java în domeniul client-side, adică în browserul
utilizatorului, este crearea de applet-uri, aplicaŃii care sunt descărcate prin Internet şi rulează în cadrul
browser-ului Web. Applet-urile Java sunt adăugate în pagina Web prin folosirea marcajului HTML
<APPLET>. Când browser-ul întâlneşte acest marcaj, el descarcă applet-ul Java de pe server, iar
appletul va rula în porŃiunea de ecran specificată în marcaj. Când Netscape a adăugat browser-ului său
Web, Navigator, câteva capacităŃi de scriptare rudimentare, specialiştii au numit acest limbaj de scriptare
LiveScript. În aceeaşi perioadă, Java ocupa prima pagină a publicaŃiilor de specialitate, fiind anticipată
ca o revoluŃie în lumea calculatoarelor. Ulterior, Netscape a revizuit browser-ul Navigator pentru a
permite rularea de applet-uri Java în Navigator 2, dar a şi redenumit LiveScript în JavaScript, sperând că
o parte din gloria limbajului Java se va prinde şi de JavaScript. Când Microsoft a văzut că limbajul
JavaScript devenea popular între dezvoltatorii Web, şi-a dat seama că trebuie să introducă facilităŃi de
scriptare şi în propriul browser, Internet Explorer. Ar fi putut adopta JavaScript dar a preferat să-şi
construiască un limbaj propriu, foarte similar limbajului JavaScript. Această versiune de JavaScript
dezvoltată de compania Microsoft s-a numit JScript.

4.4SCRIPTURI JAVASCRIPT
Se fac referinŃe la JavaScript ca fiind „limbaj de scriptare”, cu implicaŃia că un script este mult
mai simplu de scris decât un program. Un script JavaScript este un program inclus într-o pagină HTML.
Deoarece este încadrat de marcajele <SCRIPT> şi </SCRIPT>, textul script-ului nu apare pe ecranul
utilizatorului, iar browser-ele Web ştiu să ruleze acest program JavaScript. Marcajele sunt prezente cel
mai frecvent în secŃiunea <HEAD> ....</HEAD> (scripturi de antet) a paginii HTML. Scripturile care
scriu text pe ecran sau care scriu cod HTML, sunt plasate mai eficient în secŃiunea
<BODY>...</BODY> (scripturi de conŃinut).
JavaScript permite crearea unei interfeŃe activă cu utilizatorul, un exemplu fiind cel al site-urilor
cu butoane care se modifică la trecerea cursorului mouse-ului pe deasupra lor (acest efect implică
folosirea unei tehnici numită rollover). JavaScript poate fi folosit şi pentru a verifica dacă utilizatorul
introduce informaŃii valide în formulare. Dacă în aceste formulare procesarea necesită calcule, acestea
pot fi efectuate prin intermediul comenzilor JavaScript direct pe calculatorul utilizatorului, fără să fie
nevoie de vreo prelucrare de către server. JavaScript controlează browser-ul, astfel că pot fi deschise
ferestre noi, afişate mesaje de avertizare şi chiar mesaje în bara de stare a ferestrei browser-ului.
JavaScript poate fi utilizat şi pentru a verifica prezenŃa unui plug-in în browser sau pentru a redirecŃiona
utilizatorul spre o pagină diferită în cazul în care plug-in-ul respectiv, necesar pentru vizualizarea
paginii, lipseşte.
Deoarece limbajul JavaScript are un set de funcŃii de lucru cu ora şi cu data, se pot genera
ceasuri, calendare şi documente cu timpul înscris.

65
 Exemplul 1

<HTML>
<HEAD>
<TITLE>Today's Date</TITLE>
<SCRIPT LANGUAGE="JavaScript">
// Define a function for use later on.
function print_todays_date()
{
var d = new Date(); // today's date and time.
document.write(d.toLocaleString());
}
</SCRIPT>
</HEAD>
<BODY>
<HR>The date and time are:<BR><B>
<SCRIPT LANGUAGE="JavaScript">
// Now call the function we defined above.
print_todays_date();
</SCRIPT>
</B><HR>
</BODY>
</HTML>

4.5RESTRICłII ALE LIMBAJULUI JAVASCRIPT


JavaScript este un limbaj de tipul client-side, ceea ce înseamnă că rulează pe calculatorul
utilizatorului, nu pe server. Din această cauză, limbajului JavaScript i-au fost impuse o serie de limitări,
majoritatea din raŃiuni de securitate.
JavaScript nu permite citirea sau scrierea de fişiere pe calculatorul utilizatorului (astfel un
vizitator al paginii nu poate citi fişiere aflate pe mediile de stocare din calculatorul gazdă, nu poate scrie
viruşi pe disc). Unica excepŃie o constituie permisiunea acordată limbajului JavaScript de a scrie în
directorul de cookie-uri al browser-ului, dar şi aici îi sunt impuse o serie de limite.
JavaScript nu permite citirea sau scrierea de fişiere pe server. Acest lucru ar putea fi util, de
exemplu pentru stocarea numărului de vizitatori sau scrierea datelor culese dintr-un formular, dar
limbajului JavaScript nu îi sunt permise aceste acŃiuni. Alternativa este existenŃa unui program pe server
care să manevreze şi să stocheze aceste date. Un asemenea program poate fi, de exemplu, un CGI, scris
într-un limbaj precum Perl sau PHP, sau un program Java.
Un script JavaScript nu poate închide o fereastră de browser care nu a fost deschisă de el. Astfel
se evită o situaŃie în care un site ia controlul asupra browser-ului, închizând ferestre care conŃin alte site-
uri. JavaScript nu poate citi informaŃii dintr-un browser care conŃine o pagină Web de pe un alt server.
Cu alte cuvinte, o pagină Web nu poate citi nici o altă informaŃie din alte ferestre deschise, neputând
astfel afla pe ce alte site-uri navighează vizitatorul site-ului din care face ea parte.

66
4.6 JAVASCRIPT – LIMBAJ ORIENTAT PE OBIECT
JavaScript este un limbaj orientat pe obiect. Cele mai răspândite obiecte folosite de JavaSript
sunt documentele, formularele, câmpurile, butoanele radio. De asemenea, o fereastră este un obiect
folosit de un program JavaScript.
O pagină Web obişnuită conŃine mai multe obicte, dintre care multe au acelaşi tip de obiect. De
exemplu, o pagină ar putea să conŃină două formulare, dar chiar dacă formularele au acelaşi tip de
obiect, ele vor fi diferote datorită câmpurilor, butoanelor şi altor elemente de interfaŃă care apar în
formulare. Fiecare obiect trebuie identificat în mod unic printr-un nume sau identificator (formularele de
exemplu, ar putea fi numite form1 şi form2). Câteodată programul JavaScript trebuie să acceadă
rapid la mai multe obiecte, cum ar fi de exemplu afişarea mai multor imagini într-o prezentare. În acest
caz se poate folosi un tablou pentru a numi fiecare obiect.
O proprietate este o valoare asociată unui obiect. Obiectele pot avea mai multe valori, în funcŃie
de tipul de obiect folosit (de exemplu, un obiect formular poate avea un titlu, o lăŃime şi o lungime ca
proprietăŃi).
O metodă este un proces efectuat de către un obiect atunci când acesta primeşte un mesaj (de
exemplu, un buton Submit de pe un formular este un obiect; eticheta Submit şi dimensiunile obiectului
sunt proprietăŃile obiectului buton; dacă se execută clic pe butonul Submit, formularul este trimis către
aplicaŃia server).
La metodele şi proprietăŃile obiectului se accede prin utilizarea sintaxei cu punct (de exemplu,
metoda de scriere în obiectul document, document.write(‘Hello, World!’)).
Alt concept fundamental este tratarea evenimentelor. Un eveniment determină începerea
execuŃiei unui program JavaScript (de exemplu, când se execută clic pe un formular pe care JavaScript îl
afişează pe ecran). Programul JavaScript află despre fiecare eveniment care se petrece în timp ce acesta
rulează. Aceat lucru este posibil prin crearea unei rutine de tratare a evenimentului(de exemplu, rutina
de tratare a evenimentului de executare a unui clic pe butonul Submit va conŃine instrucŃiuni JavaScript
care prelucrează informaŃiile pe care utilizatorul le-a introdus în formular).

 Exemplul 2

<script language=”Javascript” type=”text/javascript”>


alert (‘Hello, World!’)
</script>

SecŃiunea anterioară prezentă într-o pagină HTML semnifică următoarele: eticheta <script>
atrage browser-ului atenŃia că va urma un script, nu cod HTML.
Browser-ul procesează scripturile într-un mod diferit de HTML. A
Atributul HTML language informează browserul că limbajul de scriptare este JavaScript;
atributul HTML type îi comunică browser-ului că scriptul este scris în format text şi că textul este
organizat în formatul JavaScript.
alert este funcŃia de afişare pe ecran a unei casete de dialog de avertizare care apare pe ecran
pentru a afişa mesajul Hello, World! şi rămâne pe ecran până când se execută clic pe butonul OK
afişat în caseta de dialog.

67
4.6.1 ELEMENTE FUNDAMENTALE ALE LIMBAJULUI JAVASCRIPT
InformaŃia inserată în codul unei pagini Web sau în cel JavaScript se numeşte valoare. În HTML
toate valorile sunt interpretate ca text (de exemplu, tastarea valorii 10 nu este interpretată de HTML ca
număr care poate fi folosit în calcule, ci ca un text care poate fi folosit eventual în scrierea unei adrese,
Strada Geniului, 10). JavaScript operează cu 6 tipuri de valori:
- un număr este o valoare numerică, poate fi folosită în calcule.
- un şir este un text încadrat de ghilimele.
- o valoare booleană este o valoare care este fie adevărată (true sau 0), fie falsă (false sau nenulă).
- valoarea null, folosită în situaŃiile în care trebuie folosită o valoare (un simbol de înlocuire pentru
o valoare) pentru a reprezenta o non-valoare (vid) până în momentul în care JavaScript atribuie
variabilei o valoare (de exemplu, se atribuie valoarea null variabilei folosite pentru primul nume
al unui client până în momentul în care clientul introduce numele său în formular).
- valoarea obiect
- o funcŃie efectuează o acŃiune atunci când este apelată într-un program JavaScript; sunt două
tipuri de funcŃii: predefinite (puse la dispoziŃie de JavaScript, de exemplu, alert()) şi
particularizate (definite de programator).

O variabilă este un simbol care înlocuieşte datele ce se pot modifica în timpul execuŃiei
programului. Declararea unei variabile într-un program JavaScript comunică browser-ului să creeze o
variabilă: var nume_variabila . var este unul din cele 25 de cuvinte cheie folosite de
JavaScript:

break do function null typeof


case else if return var
continue export import switch void
default false in this while
delete for new true with

Un nume de variabilă nu poate fi un cuvânt cheie sau un cuvânt rezervat în JavaScript. Un cuvânt
rezervat în JavaScript are un înŃeles special pentru browser, cu toate că nu este neapărat o comandă (aşa
cum este un cuvânt cheie al limbajului JavaScript):

abstract debugger goto package synchronized


boolean double implement private throw
bzte enum instanceof protected throws
catch extends int public transient
char final interface shart try
class finally long static
const float native super

68
De obicei, valoarea unei variabile se schimbă în timpul rulării programului JavaScript, iar valoarea
iniŃială este înlocuită de altă valoare.

 Exemplul 3

<script language=”Javascript” type=”text/javascript”>

var price = 0
alert(price)
price = prompt(‘enter the price’, ‘ ’)
alert(price)

</script>

JavaScript are un mod simplu de a cere utilizatorului să tasteze informaŃii în program prin
apelarea funcŃiei prompt(). Aceasta afişează textul în cadrul unei casete de dialog de notificare, după
care aşteaptă ca utilizatorul să introducă informaŃia şi să execute clic pe butonul OK. Prima informaŃiei a
funcŃiei este mesajul comunicat utilizatorului, a doua este valoarea prestabilită care este valoarea dată
programului în cazul în care utilizatorul nu a introdus nici o valoare în caseta de dialog de notificare sau
‘ ’ (atunci când nu este folosită nici o valoare prestabilită).
JavaScript permite utilizarea atât a apostrofurilor cât şi a ghilimelelor pentru desemnarea unui şir.
Totuşi e indicată folosirea primelor, întrucât ghilimelele ar putea interfera cu ghilimelele folosite în
paginile HTML.
Operatorii (aritmetici, logici, de atribuire, de comparaŃie, condiŃional) în JavaScript şi utilizarea
acestora în expresii sunt similare celor din C++ şi Java. Operatorul de adunare folosit cu şiruri realizează
concatenarea.
De asemenea, instrucŃiunile condiŃionale (if...else, switch...case), instrucŃiunile de ciclare (for,
while, do...while) sunt similare celor din C++ sau Java.
JavaScript permite deasemenea folosirea tablourilor.

 Exemplul 4

//declararea unui tablou:


var products = new Array()

//iniŃializarea tabloului
products[0]=’water’
products[1]=’soda’
products[2]=’beer’

//sau:
//var products = new Array (‘water’, ‘soda’, ‘beer’)

for(var i=0;i<products.length;i++)
{
document.write(products[i]+’<br>’)
}

69
products.sort()

for(var i=0;i<products.length;i++)
{
document.write(products[i]+’<br>’)
}
products.concat()
alert(products)

Numărul elementelor din tablou poate fi determinat utilizând proprietatea length a obiectului tablou
(var len = products.length). Browserul poate afişa elementele tabloului products pe ecran
una sub alta. Un tablou poate fi sortat apelând metoda sort() a obiectului tablou. Elementele de
tablou pot fi unite utilizând metoda concat() sau metoda join()a obiectului tablou.

Definirea unei funcŃii:

function nume_functie(nume_arg1, nume_arg2,…nume_argn)


{
bloc_instructiuni
[return valoare]
}

Cel mai bun loc pentru definirea unei funcŃii este la începutul unui program JavaScript, în
eticheta <head>, deoarece apoi toate programele JavaScript care apar ulterior pe pagina web vor
cunoaşte definiŃia acelei funcŃii. Browser-ul încarcă întotdeauna totul în eticheta <head>, înainte să
înceapă să execute vreun program JavaScript. O funcŃie se apelează ori de câte ori se doreşte ca
browserul să execute instrucŃiuni conŃinute în blocul de program al funcŃiei. Apelul de funcŃie este plasat
în eticheta <body>. Apelul funcŃiei trebuie deasemenea inclus între marcajele <script>..
..</script>. O funcŃie poate fi apelată şi din codul html al paginii Web. De obicei o funcŃie va fi
apelată ca răspuns la un eveniment, cum ar fi încărcarea sau descărcarea paginii web de către browser. În
HTML se atribuie apelul de funcŃie ca valoare a unui atribut al unui mrcaj HTML. De exemplu, apelarea
unei funcŃii când browser-ul încarcă pagina Web: <body onload=’WelcomeMessage()’>

 Exemplul 5

<HTML> <HEAD> <TITLE> Obiecte JavaScript </TITLE>


<SCRIPT LANGUAGE="JavaScript">
function setValues(){
var texte = new Array(3);
for (i = 0;i < 3 ;i++)
texte[i] = "text " + i;
for (i = 0;i < 3 ;i++)
document.form0.elements[i].value = texte[i];
}
</SCRIPT> </HEAD>
<BODY>
<FORM NAME="form0">
<INPUT TYPE="text" NAME="text0" >

70
<INPUT TYPE="text" NAME="text1" >
<INPUT TYPE="text" NAME="text2" >
<P>
<INPUT TYPE = "checkbox" NAME = "check0" > Check 0
<INPUT TYPE = "checkbox" NAME = "check1" > Check 1
<INPUT TYPE = "checkbox" NAME = "check2" > Check 2
</P> <P>
<INPUT TYPE = "radio" NAME = "radio0" > Radio 0
<INPUT TYPE = "radio" NAME = "radio1" > Radio 1
<INPUT TYPE = "radio" NAME = "radio2" > Radio 2
</P> <P>
<TEXTAREA NAME = "area0" ROWS = 7 COLS = 9> </TEXTAREA>
</P>
</FORM>
<SCRIPT> setValues(); </SCRIPT>
</BODY>
</HTML>

Când un utilizator priveşte un formular din cadrul unei pagini Web, probabil nu se gândeşte la modul în
care se leagă formularul de tot ceea ce vede în rest. Totuşi, relaŃiile de pe o pagină Web sunt foarte
importante pentru programatorul de JavaScript. Tot ce se vede într-un sit Web este considerat un obiect.
Primul obiect ce se vede este fereastra, la care se face referire în JavaScript ca window. O fereastră
conŃine un document HTML la care se face referire ca document. Un document poate avea unul sau
mai multe formulare, iar un formular poate avea unul sau mai multe elemente. Obiectele de formular
sunt stocate într-un tablou numit forms şi apare în ordinea în care formularele apar în document. Se
poate face referire la fiecare formular prin indicele formularului. De exemplu, prin
window.document.forms[2] i se comunică browser-ului să meargă la obiectul window şi apoi
obiectul window să meargă la obiectul document şi apoi să facă referire la cel de-al treilea formular.

4.6.2 FORMULARE ŞI TRATAREA EVENIMENTELOR ÎN JAVASCRIPT

Formularele, fie ele formulare de comandă, de abonare, de înscriere, financiar, de sondaj, etc.,
reprezintă un mod practic de a strânge informaŃiile necesare desfăşurării afacerilor pe Internet.
Formularele sunt create utilizând elemente de formular HTML, cum ar fi butoane şi casete de validare.
Formularele folosite de siturile Web comerciale interacŃionează de asemenea cu utilizatorul prin aplicaŃii
JavaScript. O aplicaŃie JavaScript este folosită în diverse scopuri, inclusiv pentru validarea datelor şi
pentru interacŃiunea dinamică cu elementele unui formular.
Aşa cum a fost prezentat în lucrarea precedentă, un formular este o secŃiune de document HTML
care conŃine elemente cum ar fi butoane radio, casete de text, casete de validare şi liste de opŃiuni.
Elementele unui formular HTML sunt deasemenea cunoscute sub denumirea de controale. Elementele
sunt folosite ca un mijloc eficient pentru ca utilizatorul să introducă informaŃii într-un formular.
InformaŃiile introduse într-un formular sunt transmise serverului web pentru a fi prelucrate când
utilizatorul execută clic pe un buton de înaintare. Programul care prelucrează formularul se numeşte
program CGI (Common Gateway Interface). Programele CGI sunt scrise într-unul din mai multe
limbaje de programare, JSP, PHP, Perl şi ASP. Programele CGI interacŃionează de obicei cu aplicaŃii
care nu sunt pentru Web, cum ar fi baze de date şi alte sisteme, necesare prelucrării formularului. După
încheierea prelucrării, programul CGI crează de obicei în mod dinamic o altă pagină Web şi o trimite
browser-ului care a trimis formularul.

71
Reamintim că fiecare element are unul sau mai multe atribute, acestea fiind informaŃii asociate
cu elementul. De exemplu, atributul VALUE este folosit pentru a defini o valoare prestabilită, nu
valoarea introdusă de utilizator. Un exemplu bun în acest caz este atributul NAME, deoarece acest
atribut este utilizat pentru a face referire la element. Multe aplicaŃii necesită ca unele informaŃii
conŃinute într-un formular să fie verificate utilizând un proces de validare. Două moduri frecvente de
validare a datelor dintr-un formular sunt prin intermediul utilizării programelor CGI, respectiv al
aplicaŃiilor JavaScript. Un program CGI validează informaŃiile după înaintarea formularului. O aplicaŃie
JavaScript poate valida informaŃii ori de câte ori are loc unul din mai multe evenimente în timp ce
formularul este afişat pe ecran. Pe lângă informaŃiile de validare, aplicaŃia JavaScript poate schimba în
mod dinamic un formular în timp ce acesta este afişat pe ecran. De exemplu, un program JavaScript
poate activa sau dezactiva elemente pe baza unei valori introduse de utilizator într-un alt element.
Un program JavaScript este executat ca răspuns la un eveniment ce are loc în timp ce un
formular este afişat pe ecran. Evenimentele care au loc de obicei într-un formular sunt enumerate în
tabelul următor:

Eveniment Descriere
onload executat când browser-ul termină de încărcat o fereastră sau toate cadrele dintr-
un set de cadre
onunload executat când browser-ul şterge un document dintr-o fereastră sau cadru
onclick executat la un clic deasupra unui element
ondblclick executat la un dublu clic deasupra unui element
onmousedown executat când butonul mouse-ului este apăsat în timp ce indicatorul mouse-ului
se află deasupra unui element
onmouseup executat când butonul mouse-ului este eliberat în timp ce indicatorul mouse-
ului se află deasupra unui element
onmouseover executat când indicatorul mouse-ului se deplasează ajungând deasupra unui
element
onmousemove executat când indicatorul mouse-ului este deplasat doar deasupra unui element
onmouseout executat când indicatorul mouse-ului este deplasat în afara unui element
onfocus executat când un element este în atenŃie (selectat)
onblur executat când un element iese din atenŃie
onkeypress executat la apăsarea şi eliberarea unei taste
onkeydown executat când o tastă este apăsată
onkeyup executat la eliberarea unei taste
onsubmit executat când este înaintat un formular
onreset executat când un formular este reiniŃializat
onselect executat când într-un câmp de text este selectat text
onchange executat când un element iese din atenŃie şi valoarea elementului s-a modificat
de la intrarea în atenŃie

Un eveniment este asociat cu un element al unui formular, ca atribut definit în cadrul etichetei de
deschidere a elementului. Se asociază acestui atribut numele funcŃiei JavaScript ce se doreşte a fi
executată când are loc evenimentul.
Evenimente de la butoane. Toate tipurile de butoane admise în limbajul HTML: buton simplu,
buton de validare (check), radio buton, buton de trimitere (submit), buton de resetare (reset) generează
unul sau mai multe evenimente care pot fi tratate folosind scripturi JavaScript. Următorul document
defineşte handlerul de eveniment click al unui buton simplu printr-o funcŃie JavaScript dată ca valoare
a atributului onClick al butonului respectiv:

72
 Exemplul 6

<HTML>
<HEAD> <TITLE> Evenimentul Click al unui buton </TITLE>
<SCRIPT LANGUAGE="JavaScript">
function dontclickme(){
// button click handler
alert("I told you not to click me");
}
</SCRIPT>
</HEAD>
<BODY>
<FORM >
<INPUT TYPE="button" NAME="mycheck"
VALUE="HA!" onClick="dontclickme()">
</FORM>
</BODY>
</HTML>

Evenimente de la elemente de text. Elementele HTML text simplu (text) şi ariile de text
(textarea) generează patru evenimente JavaScript: change (atunci când se modifica ceva în text),
select (atunci când se selectează textul din casetă), focus (atunci când se intră în caseta respectivă,
apăsând pe mouse-ul poziŃionat în casetă), blur (atunci când se părăseşte caseta respectivă, apăsând
pe mouse-ul poziŃionat în afara casetei).Elementul de text de tip password nu generează evenimente.
Pentru exemplificare, se consideră un formular cu elemente de introducere a datelor, în care
utilizatorul tastează numele şi prenumele său şi un şir suplimentar. Fişierul include un program
JavaScript care verifică dacă şirul suplimentar include semnul @ când utilizatorul mută cursorul în afara
elementului de introducere a datelor. Acest lucru se realizează utilizând atributul de eveniment onblur
din eticheta de deschidere a elementului <INPUT> şi asociind numele funcŃiei JavaScript cu atributul de
eveniment onblur. Evenimentul onblur are loc când cursorul iese în afara elementului, fapt numit out
of focus (ieşirea în afara atenŃiei).

 Exemplul 7

<html>
<head>
<title>onblur event</title>
<script language=”Javascript” type=”text/javascript”>
function ValidateSir(Sir)
{
var Location= Sir.indexOf(‘@’)
if (Location==-1)
{
alert(‘You entered an inaccurate string.’)
}
}
</script>
</head>

73
<body>
<FORM action=”http://www.jimkeogh.com” method=”post”>
<P>
First Name: <INPUT type=”text” name=”Fname”/><BR>
Last Name: <INPUT type=”text” name=”Lname”/><BR>
Id: <INPUT type=”text” name=”Id”
onblur=”ValidateSir(this.value)”/><BR>
<INPUT name=”Submit” value=”Submit” type=”submit”/>
<INPUT name=”Reset” value=”Reset” type=”reset”/>
</P>
</FORM>
</body>
</html>

FuncŃiei ValidateSir() i se transferă un parametru, care este valoarea elementului Id de


introducere a datelor. În codul evenimentului onblur, numele obiectului este this – face referire la
obiectul curent, care este elementul Id de introducere a datelor. value este atributul asociat cu obiectul
this. De câte ori se utilizează numele unui atribut, i se comunică browser-ului să folosească valoarea
atributului. Aici i se cere browser-ului să folosească valoarea atributului value, care este informaŃia
tastată de utilizator în elementul Id. FuncŃia indexOf() găseşte poziŃia unui caracter din interiorul
unui şir de caractere. FuncŃia returnează -1 dacă şirul nu conŃine caracterul.

4.7ASCUNDEREA PROGRAMULUI JAVASCRIPT


Un program JavaScript poate fi ascuns de ochii unui vizitator stocându-l într-un fişier extern, în
acelaşi server de Web care conŃine pagina Web. Fişierul extern are extensia .js. Browser-ul apelează
ulterior fişierul extern ori de câte ori browserul întâlneşte un element JavaScript din pagina Web. Astfel
în codul sursă al paginii Web, apar trimiteri la fişierul extern .js, dar nu se vede codul sursă al
programului JavaScript.
Comunicarea către browser a faptului că programul JavaScript se află într-un fişier extern de la
server-ul Web şi nu este încorporat în pagina Web se realizează atribuind numele fişierului ce conŃine
fragmentele JavaScript atributului src al marcajului <script>. Pasul final constă în crearea fişierului
JavaScript extern plasând toate definiŃiile de funcŃii într-un fişier cu extensia .js.

 Exemplul 8

// Fisier test.js
// Define a function for use later on.
function print_todays_date()
{
var d = new Date(); // today's date and time.
document.write(d.toLocaleString());
}
<!-- Fisier test.html -->
<HTML>
<HEAD>
<TITLE>Today's Date</TITLE>
<SCRIPT LANGUAGE="JavaScript" SRC="test3.js">

74
</SCRIPT>
</HEAD>
<BODY>
<HR>The date and time are:<BR><B>
<SCRIPT LANGUAGE="JavaScript">
// Now call the function we defined above.
print_todays_date();
</SCRIPT>
</B><HR>
</BODY>
</HTML>

Protejarea programului JavaScript nu constituie principalul motiv pentru stocarea fragmentelor


JavaScript într-un fişier extern. Cel mai important beneficiu al acestei practici este partajarea
programelor JavaScript de către mai multe pagini Web, fără a fi necesară dublarea codului sursă. Orice
modificări asupra codului JavaScript în fişierul extern sunt aplicate automat tuturor paginilor Web care
utilizează fişierul extern ca sursă pentru programe JavaScript.

EXERCIłII

5.1 TestaŃi exemplele prezentate în lucrare.

5.2 Completati functia setValues() din Exemplul 5 astfel încât sa seteze valorile în toate elementele
formularului, iar afisarea din browser sa arate ca în figura de mai jos:

75
5.3 Modificati documentul din Exemplul 5 astfel încât setarea valorilor elementelor formularului să se
execute la comanda click pe un buton inserat în formular.

5.4 CreaŃi o pagina HTML care să conŃină două elemente text şi un element textarea şi definiŃi patru
funcŃii JavaScript care să trateze toate cele patru evenimente posibile ale unui element text. FuncŃiile
handler ale evenimentelor vor afişa în fereastra elementului textarea ce eveniment s-a generat şi în ce
element de text. Ferestra de afisare din browser va arăta ca în figura alăturată, iar o funcŃie handler de
eveniment va arăta, de exemplu, ca în liniile de mai jos:

<SCRIPT LANGUAGE="JavaScript">
function textFocus(index){
var textF = formular.area.value;
var nume =
formular.elements[index].name;
textF = textF+" Eveniment focus
in " + nume;
document.formular.area.value =
textF;
}
</SCRIPT>

5.5 CreaŃi o pagină HTML care să conŃină un element buton la apăsarea căruia să se calculeze şi să se
afişeze în fereastra browserului valorile intermediare ale lui 8! (factorial).

5.6 Realizati un document HTML cu scripturi JavaScript ca sa creeze unui calculator aritmetic simplu,
ca, de exemplu, programul calculator din grupul Accesories al sistemului de operare Windows.

5.7 TransformaŃi exemplul 7 într-o aplicaŃie pentru validarea adresei de e-mail introdusă de utilizator în
al treilea câmp de text.

76
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

Noţiuni Introductive si Aplicatii PHP


PHP permite adăugarea de interactivitate şi dinamism paginilor web. Presupune cunoştinţe in
ceea ce priveste utilizarea HTML. Este o tehnologie server-side.

� PHP ca abreviere a fost initial Personal Home Page. Actualmente este: Hypertext
Preprocessor.
� PHP este o tehnologie open source.

O pagina PHP este un fisier cu extensia *.php si reprezinta o combinatie de cod HTML si
script care ruleaza pe un server web.

Unelte de dezvoltare:
• PHP se poate instala de pe site-ul www.php.net.
• MySQL de pe site-ul www.mysql.com.
• server de web - Apache de pe www.apache.org.

O soluţie practică şi uşor de aplicat este aceea de a instala pachete integrate care conţin toate
cele trei programe, cum ar fi de exemplu:

a) PHPTriad

Se poate descărca de la adresa: http://sourceforge.net/projects/phptriad

PHPTriad este un mediu complet care instalează şi configurează PHP, Apache, MySQL, şi
PHPMyAdmin, Versiunea 2.11 include şi Perl 5.

b) Easyphp www.easyphp.org

Reprezintă un mediu complet de dezvoltare pentru aplicaţii PHP. Este un pachet care conţine
PHP, server-ul web Apache, MySQL precum şi un manager de baze de date PhpMyAdmin,
debugger Xdebug. Avantajul este că nu mai trebuie configurat nimic suplimentar. Pagina de
administrare permite modificarea portului Apache, timpul maxim de execuţie, mărimea
maximă a fişierului la care se poate face upload etc.
EasyPHP este portabil, se poate instala pe un flash drive USB, pe un card de memorie şi se
poate folosi în prezentarea unei aplicaţii, site etc.

1
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

c) XAMPP https://www.apachefriends.org/download.html

XAMPP (distribuţie pentru Windows, Linux, OS X) permite instalarea Apache MySQL, PHP,
şi Perl. Este considerat unul dintre cele mai folosite medii de dezvoltare PHP. Este gratuit, se
instalează şi se foloseşte foarte uşor. Este considerat a fi una dintre soluţiile cele mai bune.
Module incluse în XAMPP:

� Apache.
� MySQL.
� Filezilla.
� Mercury.
� Tomcat.

Modalitatea de lucru:

În cele ce urmează vom folosi XAMPP.

� Se va porni server-ul Apache prin apăsarea butonului Start. Pentru a opri funcţionarea
serverului se va acţiona butonul Stop.

� Calea de lucru implicită (Document Root) va fi: \...\xampp\htdocs\

2
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
� Codul sursa poate fi editat folosind un editor de tipul Notepad++ (http://notepad-plus-
plus.org/)sau putem folosi un mediu integrat de exemplu NetBeans
https://netbeans.org/.

� Toate noţinile de bază PHP, cum ar fi tipuri de date, variabile, operatori, funcţii,
tablouri, clase şi obiecte, aplicaţii de tip formular vor fi învăţate şi exersate pe bază de
exemple.

Exemplul 1: Buna dimineata!


1) Se porneşte serverul Apache cu ajutorul XAMPP

2) Se creaza un proiect de tip PHP->PHP Application cu ajutorul NetBeans.

– numit de exemplu introducere care se salveaza in directorul "c:\xampp\htdocs\introducere”

3
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

Proiectul creat va contine un fisier numit index.php care va avea implicit urmatoarele linii:

<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
// put your code here
?>
</body>
</html>

Scriptul PHP va transmite comenzi serverului. Pentru a delimita blocul de comenzi se folosesc
tag-urile de început şi respectiv de sfârşit <?php şi ?>

<html>
<head>
<meta charset="UTF-8">
<title>Exemplul 1</title>
</head>
<body>
<?php
echo "<h1>Buna dimineata!</h1>";
?>
</body>
</html>

4
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Rezultatul obţinut în browserul folosit (Mozilla Firefox) este:

Acealsi lucru se poate obtine direct din NetBeans la comanda Run care va porni automat
browser-ul default folosit in sistem.

Codul PHP este accesibil numai server-ului. La client in browser se văd numai rezultatele. Prin
urmare, sursa paginii web (pentru cazul cand se foloseşte Mozilla Firefox, putem afişa această
sursă folosind Tools - Web Developer – Page Source ) nu conţine codul PHP.

Exerciţii:

a) Să se modifice afişarea astfel încât mesajul Bună dimineaţa să apară colorat în roşu.

b) Să se modifice afişarea astfel încât încât mesajul Bună dimineaţa să fie micşorat.

c) Să se modifice culoare de fond a paginii. Indicaţie: Acest lucru se poate face din codul html,
sau din secţiunea php - echo "<body style='background-color:yellow'>";

5
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exemplul 2 : Instrucţiuni condiţionale, bucle for, variabile

Variabilele in PHP se definesc folosind semnul "$" şi fără a avea un tip de date definit de la
început. PHP nu are o comandă pentru a declara o variabilă, ea fiind creată la prima atribuire.

Exemple de variabile:
$a = 25; $a = 0x4A; - hexazecimal
$y = 100.25;

$tx = "Un string!" sau $tx = 'Un string';


Exemple de afisare a variabilei:
echo "Afisare text $tx!"; sau echo " Afisare text " . $tx . "!";
Afisarea lungimii şirului de caractere:
echo strlen($tx);
echo str_word_count($tx); // afişează numărul de cuvinte
echo strrev($tx) ; // afişează invers string-ul

tipul boolean:
$c = true;
$d = false;

Tablouri:
$fructe = array("mere","pere","portocale");

Numele de variabile sunt case-sensitive – ($a şi $A sunt două variabile diferite).

a) Instructiunea while

<html>
<head>
<title>Loops</title>

</head>
<body>

<?php

$x = 1;

while ($x <= 20) {


echo "<p>Este frumos afara!</p>";
$x = $x + 1;
}
?>

</body>
</html>

6
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

b) Instructiunea for

<html>
<head>

<title>Exemplu bucla for</title>


</head>
<body>

<?php

for ($a=0; $a<=100; $a=$a+10) {


echo '<p>variabila a este = ' . $a. '</p>';
}
?>

</body>
</html>

c) Listă separată de delimitorul virgulă.

<?php

$rechizite = "stilou, pix, creion, guma, ascutitoare";


?>

<html>
<head>
<title>Alt exemplu practic</title>
</head>
<body>

<?php
// Lista obtinuta intr-o enumerare separata prin virgula
$rechizite = "stilou, pix, creion, guma, ascutitoare";
// Se creaza un array prin separarea listei care are separator virgula
$tablouRechizite = explode(",", $rechizite);
// Se afiseaza elementele tabloului
echo "<p>Rechizitele disponibile sunt:</p>";
echo "<ul>";
echo "<li>" . $tablouRechizite[0] . "</li>";
echo "<li>" . $tablouRechizite[1] . "</li>";
echo "<li>" . $tablouRechizite[2] . "</li>";
echo "<li>" . $tablouRechizite[3] . "</li>";
echo "<li>" . $tablouRechizite[4] . "</li>";
echo "</ul>";
?>
</body>
</html>
7
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

Observaţii:

- Se remarcă modul în care se introduce un comentariu în codul PHP (asemănător cu


modul de lucru din C++) si anume se foloseşte // în faţa liniei de cod care se doreşte a fi
comentată.
- Se observă funcţia explode care se defineşte după cum este prezentat în ( site php
manual)
o array explode ( string $delimiter , string $string [, int $limit ] )

Funcţia returnează un tablou de sub-siruri, format dint-un şir separat de un


delimitator – în cazul de faţă fiind virgula.

Exerciţii:

a) Să se parcurgă, să se analizeze şi să se execute în browser toate exemplele a), b) şi


respeciv c)
b) Să se reia exemplul c), considerînd o listă în care delimitatorul care separă lista de
rechizite este ; (punct şi virgulă)

$rechizite = "stilou; pix; creion; guma; ascutitoare";

� Să se adauge listei de rechizite încă trei elemente (care pot fi: caiet; penar; linie)
care să fie şi afişate in browserul utilizatorului.
� Să se analizeze ce se obţine în browser dacă se foloseşte vizualizarea codului sursă
a paginii încărcate.

8
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exemplul 3: Funcţii

a) Definirea şi apelul funcţiilor

<html>
<head>
<title>Folosirea Functiilor</title>

</head>
<body>

<?php

function Calcul($x,$y,$z, $l) {


$rezultat = $x * $y + $z + $l;
return $rezultat;
}

echo "Expresia aritmetica pentru valorile 1, 2, 3, 4 este: " . calcul(1,2,3,4);

?>
</body>
</html>

9
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exerciţii:

a) Explicaţi si interpretaţi rezultatele la afişarea sursei.


b) Să se introduca o noua funcţie care va fi apelată folosind linia de mai jos:

echo "Noua Expresia aritmetica este: " . nou(5);

Funcţia nou va intoarce ca rezultat o valoare care va fi rezultatul funcţiei calcul la care toare
argumentele au aceeaşi valoare preluată din argumentul funcţiei nou.

c) Să se afişeze cele două mesaje pe 2 linii.

b) Transmiterea argumentelor prin referinţă

Pentru a permite unei funcţii să modifice argumentele, acestea vor fi transmise prin referinţă.
Pentru aceasta, se va folosi ampersand & inainte de numele argumentului.

<html>
<head>
<title>Folosirea Functiilor si a referintelor</title>

</head>
<body>

<br>

<?php
function A(&$x)
{
$x .= 'si inca un sir de caractere.';
}
$a = 'Acesta este un sir, ';
A($a);
echo $a;
?>

</body>
</html>

Exerciţii:

a) Experimentaţi următoarele modificări în cod:


function A(&$x)
{
$x = 'si inca un sir de caractere.';

10
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
}
Observaţi rezultatul în browser. Explicaţi.

b) function A(&$x)
{
$x. = 'si inca un sir de caractere.';
}
Observaţi rezultatul în browser. Explicaţi.

c) Folosiţi următoarea implementare:


function A($x)
{
$x .= 'si inca un sir de caractere.';
}
Observaţi rezultatul în browser. Explicaţi.

Exemplul 4 :Clase şi Obiecte

a) Definirea şi utilizarea unei clase

<?php
class Televizor{
private $pret; /* variabile membre */
private $model;
public function setPret($a){ /* functii membre */
$this->pret = $a;
}
public function getPret(){
echo $this->pret ."<br/>";
}
public function setModel($b){
$this->model = $b;
}
public function getModel(){
echo $this->model ." <br/>";
}
}
?>

$this este o variabila specială care se referă la obiectul curent.

Obiecte în PHP: Obiectele se crează folosind operatorul new.

$x = new Televizor;
$y = new Televizor;
$z = new Televizor;

Apelarea funcţiilor membre:


$x->setModel( "Toshiba" );
$x->setPret(1500);

11
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
$y->setModel( "Samsung" );
$y->setPret(1550);

$z->setModel( "Philips" );
$z->setPret(1570);

Exerciţii:

a) Să se completeze programul de mai sus cu cele 3 obiecte x,y şi z şi să se apeleze


corespunzător funcţiile necesare pentru a obţine următorul ecran:

b) Să se completează programul cu următoarea linie:

$x->pret = 12345;
Să se analizeze rezultatele obţinute în browser.

b) Funcţii constructor-destructor

Sunt funcţii speciale care se apelează automat când este creat un obiect şi permit iniţializarea
datelor membre.

În PHP se foloseşte scrierea __construct() pentru a defini un constructor.

De exemplu, pentru clasa Televizor definită mai sus se foloseşte:

function __construct( $arg1, $arg2 ){


$this->pret = $arg1;
$this->model = $arg2;
}

Funcţia constructor mai poate fi definită ca având numele clasei. (Tratată ca funcţie
constructor în PHP 5.3.0-5.3.2, dar tratată ca o metodă obişnuită începând cu PHP 5.3.3)

12
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

De exemplu pentru clasa Televizor.


function Televizor( $arg1, $arg2 ){
$this->pret = $arg1;
$this->model = $arg2;
}

PHP 5 introduce funcţia destructor similară cu cel din (C++). Metoda destructor va fi apelată
cînd un mai sunt referinţe la un obiect.

void __destruct ( void )

Exerciţii:

a) Să se completeze clasa Televizor cu funcţia constructor care permite iniţializarea celor


două date membre pret şi model.
b) Să se creeze obiectele x,y şi z şi să se apeleze funcţiile corespunzătoare pentru a obţine
acelaşi rezultat în browser. (din figura )

c) Moştenirea

La modul general, dacă o clasă A moştenete o clasa B se foloseşte scrierea:

class A extends B {
//implementarea clasei
}

Exerciţii:

a) Din clasa Televizor să se deriveze o nouă clasă (de exemplu denumită Telnou) care să
conţină o dată membră tehnologie. Funcţiile membre vor fi: funcţia constructor care permite
iniţializarea datei membre şi respectiv funcţia getTehnologie care permite afişarea datei
membre. Să se creeze 2 noi obiecte care vor permite afişarea celor 2 mesaje LED TV şi LED
SMART TV corespunzător figurii de mai jos.

13
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
b) Să se modifice funcţia constructor a clasei Telnou după cum urmează:

function Telnou($pret, $model, $tehnol) {


Televizor::Televizor($pret, $model);
$this->tehnologie = $tehnol;
}

Să se creeze două obiecte de clasă Telnou folosind noua funcţie constructor cu trei argumente.
Să se apeleze funcţiile corespunzătoare astfel încât să se obţină ecranul de mai jos:

Exemplul 4 : Formulare

Să se realizeze o aplicaţie care să arate ca în figura de mai jos:

La încărcarea paginii (denumită form_simplu.php) vor putea fi disponibile căsuţele de editare


Nume, Prenume şi respectiv Varstă.

După completarea acestora va fi acţionat butonul Submit!. Această acţiune va determina


încărcarea fişierului activ.php care va afişa datele transmise, precum si ziua curentă.

14
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Fişierul form_simplu.php:

<html>
<head>
<title>Formulare</title>
</head>
<body>
<h1>Formular de inscriere</h1>
<hr>
<form action="activ.php" method="post">
<p>Nume: <input type="text" name="nume"></p>
<p>Prenume: <input type="text" name="prenume"></p>
<p>Varsta: <input type="text" name="varsta" ></p>
<p><input type="submit" value="Submit!"></p>
</form>

</body>

</html>

Fişierul care răspunde la acţiunea din formular: activ.php este după cum urmează:

Buna <?php echo htmlspecialchars($_POST['prenume']); ?>.<p></p>


<b>Datele transmise:</b><br><br>
<b>Nume:</b> <?php echo htmlspecialchars($_POST['nume']); ?>.<br>
<b>Prenume:</b> <?php echo htmlspecialchars($_POST['prenume']); ?>. <br>
<b>Varsta:</b> <?php echo (int)$_POST['varsta']; ?> ani.<br>
<hr>
<?php
echo "Datele au fost transmise azi: " . date("d/m/Y") . "<br>";
?>

Observaţii:

� Folosirea htmlspecialchars() (http://php.net/manual/en/function.htmlspecialchars.php .)


Asigură ca orice character special în html este codat correct şi nu se pot insera tag-uri
HTML sau Javascript în această pagină.
� Folosirea metodei POST pentru a colecta datele din formular.
� Nu s-au folosit metode de verificare a datelor din formular. S-a pus accent doar pe
trimiterea şi respectiv recuperarea acestora.

15
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exercitii:

a) Să se completeze formularul de mai sus cu o casuţă de editare în care utilizatorul să


introducă o adresa de e-mail. De asemenea, să se introducă 2 butoane radio care să permită
selectarea a doua opţiuni. Noul formular va fi după cum se arată în figura de mai jos:

Indicaţie: Pentru a introduce un buton radio:


<input type="radio" name="particip" value="nivel2">Nivel II

b) Să se completeze corespunzător (conform figurii de mai jos) afişarea datelor de confirmare


pentru noile controale introduse.

16
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exemplul 5: Folosirea bibliotecii GD.

Este o bibliotecă grafică de tip open source http://php.net/manual/en/book.image.php.


http://html-php.de/index.php?seite=p_gdlib. Scopul utilizării acesteia este de a genera şi
manipula dinamic imagini în format jpeg, png sau gif. De asemenea se pot introduce zone de
text, grafică în imaginii existente etc. Versiunea de PHP recomandată a fi utilizată este
începând cu PHP 4.3 pentru care biblioteca este precompilată.

a) Crearea unei imagini PNG folosind PHP

poze.php

<?php
header('Content-type: image/png');
$image = @imagecreate(200, 200);
$bg_color = imagecolorallocate($image, 20, 255, 100);
$text_color = imagecolorallocate($image, 0, 51, 102);
imagefill($image, 100, 100, $bg_color);
imagestring($image,10,10,10,'Un desen!!!',$text_color);
imagepng($image);
?>

Apelarea fişierului poza1.php într-un fişier denumit de exemplu test.php. Rezultatul este
prezentat în figura de mai jos.
<img src="poze.php" alt="Imagine" width="200" height="220">

Exerciţii:
� Să se schimbe culoarea atât a textului cât şi a culorii de fond.
� Să se modifice dimensiunile pozei.

17
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

b) Folosirea şi afişarea unei imagini existente.

În directorul de lucru se presupune că se găseşte o imagine, de exemplu imagine.png. Dacă nu


exista se poate crea cu programul Paint. Fişierul următor va fi denumit poza2.

<?php
header('Content-type: image/jpeg');
$file = 'imagine.jpg';
if (file_exists($file)) {
$dimensiune = getimagesize($file);
$latime = $dimensiune[0];
$inaltime = $dimensiune[1];
$picture = imagecreatefromjpeg($file);
if ($latime>$inaltime) {
$latime_nou = 150;
$inaltime_nou = intval($inaltime * $latime_nou / $latime);
} else {
$inaltime_nou = 120;
$latime_nou = intval($latime * $inaltime_nou / $inaltime);
}
$image = imagecreatetruecolor($latime_nou, $inaltime_nou);
imagecopyresampled($image, $picture, 0, 0, 0, 0, $latime_nou, $inaltime_nou, $latime,
$inaltime);
imagejpeg($image);
imagedestroy($image);
}
?>

Fişierul test.php devine:

<img src="poza2.php" alt="Imagine" latime="200" inaltime="220">

18
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

În browser vom obţine următorul rezultat:

c) Prelucrări de imagine

Fişierul poza2.php devine:

<?php
$image = imagecreatefromjpeg('imagine.jpg');
imagefilter($image, IMG_FILTER_BRIGHTNESS, 100);
header('content-type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
?>

Fişierul test.php devine:

<img src="poza2.php" alt="Imagine" latime="200" inaltime="220">

Rezultatul în browser este:

19
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica

Exerciţii:

a) Să se obtină diferite imagini cu diferite contraste folosind instrucţiunea:

imagefilter($image, IMG_FILTER_BRIGHTNESS, 100);


b) Să se testeze şi alte
tipuri de filtrări cum ar fi:
� imagefilter($image, IMG_FILTER_NEGATE)
� imagefilter($image, IMG_FILTER_EMBOSS)
� imagefilter($image, IMG_FILTER_GRAYSCALE)

Observaţi efectul obţinut.

Referinţe bibliografice:

Ioana Dogaru – Biblioteci Obiect orientate. Aplicatii. Capitolul 4. Elemente de programare in


PHP – limbaj obiect orientat utilizat pentru aplicatii internet.
http://php.net/manual/en/index.php
http://php.net/manual/en/function.explode.php
http://html.net/tutorials/php/introduction.php

http://www.w3schools.com/.

http://html-php.de/index.php?seite=p_gdlib.

20
���������������������������������������������������������������������������
���������������������������������������������������������������������������������
�����������������������������������������������������

S-ar putea să vă placă și