Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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.
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 :
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.
· 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. �
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;}
}
Î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.
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:
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.
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));
}
}
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).
11
���������������������������������������������������������������������������
���������������������������������������������������������������������������������
�����������������������������������������������������
TPI – Lucrarea de laborator Nr. 2
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.
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
� Initializarea atributelor statice ale clasei derivate �
� � Initializarea atributelor nestatice ale clasei de baza �
� Apelul constructorului clasei 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.*;
Î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:
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.
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.
//
// 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));
9
La executia acestui program se obtin urmatoarele date:
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());
}
}
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.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
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).
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:
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
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.
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");
}
}
11
Evenimente si interfete de ascultare Componentele care genereaza
(listener) evenimentul
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).
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)
// 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);
}
}
EXERCITII
16
1
7
TPI – Lucrarea de laborator Nr. 4
Î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.
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, è
produce è iar é produce é. Deoarece <, > şi & au semnificaŃii speciale, pot să fie
reprezentate numai utilizând secvenŃele speciale de caractere corespunzătoare, < > şi & .
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>
<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>
Co-directed and produced by Noel Coward, this film also starred Noel
Coward as Captain Kinross and Celia Johnson as Mrs. Kinross.
Based on the play by Noel Coward, this starred Robert Newton and again
featured Celia Johnson.
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.
55
<H1>The Later Years</H1>
</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>
</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>
<UL>
<LI>Two tablespoons virgin olive oil
<LI>Large onion, chopped
</UL>
<UL>
<LI>Two tablespoons chili powder
<LI>Two teaspoons cumin
<LI>One teaspoon garlic powder
</UL>
<BR>
</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>
<UL>
<LI>Two tablespoons chili powder
<LI>Two teaspoons cumin
<LI>One teaspoon garlic powder
</UL>
</OL>
</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>
<h2>Align=top</h2>
<h2>Align=middle</h2>
<h2>Align=bottom</h2>
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>
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>
62
<CENTER><INPUT TYPE=image SRC="submit.gif" ALT="Submit Order"
BORDER=0></CENTER>
</FORM>
</BODY>
</HTML>
EXERCIłII
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>
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
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:
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):
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
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
//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.
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
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.
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>
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>
EXERCIłII
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
� 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
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:
� Se va porni server-ul Apache prin apăsarea butonului Start. Pentru a opri funcţionarea
serverului se va acţiona butonul Stop.
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.
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;
tipul boolean:
$c = true;
$d = false;
Tablouri:
$fructe = array("mere","pere","portocale");
a) Instructiunea while
<html>
<head>
<title>Loops</title>
</head>
<body>
<?php
$x = 1;
</body>
</html>
6
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
b) Instructiunea for
<html>
<head>
<?php
</body>
</html>
<?php
<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:
Exerciţii:
� 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
<html>
<head>
<title>Folosirea Functiilor</title>
</head>
<body>
<?php
?>
</body>
</html>
9
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exerciţii:
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.
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:
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.
<?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/>";
}
}
?>
$x = new Televizor;
$y = new Televizor;
$z = new Televizor;
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:
$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.
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
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.
Exerciţii:
c) Moştenirea
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ă:
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
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ă:
Observaţii:
15
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exercitii:
16
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exemplul 5: Folosirea bibliotecii GD.
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
<?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);
}
?>
18
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
c) Prelucrări de imagine
<?php
$image = imagecreatefromjpeg('imagine.jpg');
imagefilter($image, IMG_FILTER_BRIGHTNESS, 100);
header('content-type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
?>
19
Lucrare de Laborator TPI 5
Ioana Dogaru si Cristina Stoica
Exerciţii:
Referinţe bibliografice:
http://www.w3schools.com/.
http://html-php.de/index.php?seite=p_gdlib.
20
���������������������������������������������������������������������������
���������������������������������������������������������������������������������
�����������������������������������������������������