. World Wide Web

1.Introducere

World Wide Web reprezinta cel mai mare rezervor de informatie electronica din lume. Cu alte cuvinte, Web este o colectie de milioane de documente legate intre ele, care se gasesc pe calculatoare raspandite in intreaga lume. Descrierea oficiala defineste WWW ca o “ initiativa ce permite regasirea de informatii hipermedia de pe o suprafata imensa, dand astfel oricui acces la o mare cantitate de informatii”. ~n termeni simpli, Word Wide Web este o mare retea de calculatoare bazata pe Internet, care permite utilizatorului de la un calculator sa acceseze informatii stocate in alt calculator.

Pentru localizarea unui document Web trebuie cunoscuta adresa Internet a documentului. O adresa Internet a unui document Web se numeste Localizator Uniform de Resursa (URL). Se poate compara relatia dintre un URL si o resursa cu relatia dintre o carte si indexul sau. Pentru gasirea informatiei intr-o carte, se consulta indexul cartii. Pentru a gasi o resursa Web, trebuie sa i se utilizeze adresa. Browserele Web utilizeaza URL-uri pentru localizarea resurselor Web. Cu alte cuvinte, un URL este adresa in calculator a unei resurse care poate fi un document, un fisier sau un program. Scopul unui URL este incapsularea informatiei pe care o poate utiliza un program Web pentru localizarea unui obiect in Internet.

Pe langa furnizarea unei adrese a unui obiect in Internet, un URL descrie si protocolul aplicatie ce trebuie utilizat pentru accesul la acel obiect. De exemplu, schema URL a HTTP indica un spatiu Web (o zona), pe cand schema FTP indica un spatiu FTP. Un spatiu din Internet poate fi gandit ca o zona rezervata pentru informatii de un anumit tip. De exemplu, toate documentele Internet FTP rezida intr-un spatiu FTP.

Un URL poate include un identificator de resursa document. Acest identificator specifica formatul fisierului, presupunand ca persoana care a creat fisierul a urmat conventiile corecte de denumire a resursei. De exemplu, numele de fisiere cu extensia Html trebuie sa contina text in format HTML, pe cand, un fisier cu extensia au trebuie sa contina informatii audio.

Web-ul este un labirint de documente interconectate. Atunci cand proiectantii creeaza un document Web, ei il leaga la alte documente. Fiecare legatura necesita o adresa URL pentru a identifica obiectul corespunzator. Browserele utilizeaza URL-uri pentru a localiza obiecte Web. Pentru specificarea URL-urilor, proiectantii pot utiliza doua tipuri de adrese URL: absolute si relative.

Adrese URL absolute

Un URL absolut specifica adresa completa sI protocolul unui obiect. Cu alte cuvinte, daca este prezenta schema URL atunci URL-ul este absolut. Un exemplu de URL absolut este: http://www.jamsa.com/catalog/ip/ip.htm.

Adrese URL relative

Un URL relativ utilizeaza URL-ul asociat cu documentul curent deschis in browserul dumneavoastra. Utilizand aceeasi schema, adresa serverului si arborele de directoare (daca este cazul) pentru documentul deschis, browserul reconstruieste URL-ul prin inlocuirea numelui de fisier si a extensiei cu cele ale URL-ului relativ.

De exemplu, se considera urmatorul URL absolut : http://www.jamsa/catalog/catalog.htm

Daca documentul HTML specifica URL-ul relativ ip/ip.htm, browserul va reconstrui URL-ul dupa cum urmeaza: : http://www.jamsa.com/catalog/ip/ip.htm.

Clasa URL furnizeaza un acces de nivel inalt la datele de la distanta. Un obiect URL incapsuleaza o specificare a unui locator uniform de resursa (URL). Odata creat un obiect URL, acesta poate fi folosit pentru accesarea datelor locatiei specificate de URL. Un URL permite accesul la date fara a fi nevoie de detaliile protocolului folosit, cum ar fi HTTP sau FTP. Pentru anumite tipuri de date, un obiect URL furnizeaza un mod de a obtine date deja incapsulate intr-un obiect asemanator.

1.1. O privire de ansamblu

~n aceasta lucrare se vor studia clasele URL folosite la API lucru in retea. Scopul acestor clase este de a furniza un cadru extensibil care furnizeaza programul cu o interfata simpla pentru salvarea obiectelor de pe retea. Obiectele URL sunt automat descarcate si convertite de la formatele lor locale la unul care este folosit de Java, deci imaginile pot fi automat convertite in obiecte Images care pot fi desenate pe ecran ,sI asa mai departe.

Mediul Java standard furnizeaza facilitati pentru procesarea si colectarea automata a HTTP si fisierelor URL, si pentru procesarea catorva tipuri de date multimedia. Capacitate exista, desi nu este parte API, pentru recuperarea datele FTP, si asa mai departe.

Pachetul java.net furnizeaza acest cadru prin mai multe interfete si clase abstracte. Cu subclase si implementari ale claselor si cu interfata acestui cadru exista posibilitate pentru definirea de modurile obisnuite de manipulare a diferitelor tipuri de date care sunt accesibile prin mecanismul URL de adresare.

Folosirea clasei URL

Mai tarziu in aceasta lucrare se vor dezvolta niste exemple care colecteaza si manipuleaza URL-uri de tip MIME text/plain, recuperand datele de pe Web si apoi se va analiza protocolul finger. Acest lucru poate fi extins usor la manipularea a mai multor tipuri de continut si protocoale nefolosite.

Se vor intalni sase clase diferite si interfete oferite de clasele URL, toate acestea sunt implicate in descarcarea continuturilor URL-urilor adresabile. Se va incepe cu o scurta privire de ansamblu a acestor clase.

Scopul final al acestor clase este sa activeze o aplicatie pentru a crea un obiect URL folosind schemele URL de adresare, ca de exemplu http://x.y.z/images/logo.gif sau ftp://sunsite.unc.edu/pub/sound/screams.au si apoi se apeleaza usor metoda getContent() pentru a descarca si decodifica obiectele adresate. Pentru primul exemplu, clasele URL trebuie sa se conecteze la serverul Web, rezultand un obiect Image. Pentru al doilea exemplu, clasele trebuie sa se conecteze la un site FTP specificat, se intra,se schimba directoarele, si se descarca si se decodifica fisierul de sunet, rezultand un obiect AudioClip corespunzator .

Se obtine acest rezultat, sunt doua lanturi de control. Primul este protocolul (ftp sau http) si permite sa se obtina un InputStream din oricare obiect URL adresabil, in functie de protocoalele si adresele URL. Cadrul este extensibil, deci se pot adauga ptrotocoale noi cum ar fi: nntp, si obiecte de adresa de-a lungul mai multor sisteme de informatii diferite.

Al doilea lant este tipul obiectului, daca este o imagine, un text formatat, un soundclip, sI asa mai departe. Protocolul inlantuit identifica tipul obiectului sI alege un decodificator corespunzator. Decodificatorul este responsabil cu

citirea din protocolul InputStream construind o reprezentare Java folositoare obiectului .

Primul lant este realizat de inlantuirea claselor URL, URLStream Handler -Factory, URLStreamHandler, URLConnection.

Protocolul URL inlantuit

Obiectul URL adreseaza obiectul; metoda getContent() apeleaza clasa URLStreamHandlerFactory pentru a returna o clasa URLStreamHandler corespunzatoare pentru portocolul URL. Clasa URLStreamHandler este responsabila pentru crearea unui obiect URLConnection care poate deschide un InputStream pentru citirea de la obiectul adresat.

Al doilea lant de control, URLConnection, ContentHandlerFactory, ContentHandler, este apelat pentru a decodifica obiectul. Clasa URLConnection trebuie sa fie în stare sa identifice tipul continutului obiectului adresat; apoi se apeleaza ContentHandlerFactory pentru a returna un ContentHandler corespunzator pentru tipul de continut. Aceasta clasa trebuie sa fie in stare sa decodifice o reprezenatere Java folositoare obiectului .

Tipul de continut URL inlantuit

Ceea ce urmeaza este o descriere API a acestor clase, urmat de o implementare simpla a unui protocol HTTP inlantuit, un continut inlantuit text/plain si in final o implementare a unui protocol finger inlantuit.

Partea aplicativa a fost realizata cu scopul de a ajuta ”consumatorul” de servicii oferite de Internet. Utilizatorul poate accesa site-uri cunoscand domeniul de informatii sau poate afla o multime de informatii despre un anumit lucru doar printr-o simpla scriere a acestui obiect cautat si alegerea motorului de cautare dorit.

2.Clasa URL

Clasa URL reprezinta un URL care este folosit in World Wide Web. Un URL este format din patru campuri: protocol, numele masinii, numarul portului si numele fisierului.

2.1 Constructori

Sunt mai multi constructori pentru clasa URL:

URL(String url) throws MalformedURLException

Acest constructor creeaza un URL de la o specificatie textuala completa, tipic de forma http//:www.nsa.gov/index.html.

URL(String protocol, String host, String file) throws MalformedURLException

Acest constructor asociaza un numar de port implicit pentru URL. Actualul port folosit depinde de protocol si trebuie manipulat de un protocol handler(un protocol intermediar). Intern, portul este setat cu –1.

URL(String protocol, String host, int port, String file)throws Malformed URLException

Acest constructor creeaza un URL absolut de la linia de pornire. Protocolul este primul camp al URL-ului , de obicei http sau ftp. Host-ul si portul specifica serverului unde obiectul URL locuieste si file specifica numele fisierului al obiectului de pe server.

URL(String protocol , String host ,int port,String file ,URL Stream Handler handler)throws MalformedURLException.

Acest constructor creeaza un URL absolut de la linia de pornire cu un URL Stream Handler, handler. Acesta este mecanismul recomandat applet-urilor JDK 1.2 folosind protocoale handler de comanda.Din motive de securitate ,folosirea acestui constructor necesita NetPermission specifyStreamHandler (este o parte al lui JDK 1.2 permissions API)

URL(URLcontext,String relative)

Acest constructor creeaza un URL de la un URL existent ,context, si un URL textual relativ, relative.Daca relative este un URL absolut ,atunci rezultatul este doar un URL corespunzator lui relative,altfel rezultatul este un URL care este compus din relative, relativ la contextul context. De exemplu, daca context se refera la http://server si relative este document.html, atunci rezultatul va fi un URL: http://server/document.html. Applet-urile vor folosi frecvent acest constructor, folosind rezultatul functiei getCodeBase() ca si context.

URL(URLcontext,String relative,URL streamHandler handler)

Acest constructor creeaza un URL de la un URL existent ,context, si un URL textual relativ, relative, cu un URLStreamHandler handler de comanda. Initial noul URL va primi ca mostenire un URLStreamHandler din context. Acesta este mecanismul recomandat pentru applet-urile JDK 1.2 pentru a folosii protocoalele handler proprii. Din motive de securitate, folosirea acestui constructor necestita NetPermission specifyStreamHandler.

2.2 Metode

Urmatoarele metode permit ca un URL sa fie analizat si datele la care el se refera sa fie obtinute:

String get Protocol()

Aceasta metoda intoarce protocolul parte al URL-ului.Poate fi http,ftp,mailto si asa mai departe .

String getHost()

Aceasta metoda intoarce numele masinei gazda parte al URL-ului.

int getPort()

Aceasta metoda intoarce numarul portului parte al URL-ului. Daca nu este specificat, atunci este întors –1 si protocolul implicit trebuie sa fie folosit.

String getFile()

Aceasta metoda intoarce fisierul parte al URL-ului.

String getRef()

Aceasta metoda intoarce referinta parte a URL-ului. Aceasta este partea URL-ului dupa simbolul #, daca exista.

boolean sameFile(URL other)

Aceasta metoda se întoarce daca acest URL este egal cu other, ignorând partea de referire, daca exista. Aceasta inseamna ca protocolul, masina gazda, portul si fisierul trebuieasina gazda, portul si fisierul trebuie toate potrivite.

String toExternalForm()

Aceasta metoda intoarce un String reprezentare al URL-ului: e.g.http://x.y.z:80/file.html#ref. Aceasta metoda in plus este folosita si de metoda toString.

URLConnection openConnection() throws IOException

Aceasta metoda returneaza un obiect URLConnection, care reprezinta un protocol de conexiune la obiectul URL. Apoi putem folosi aceasta clasa pentru accesul la continutul URL-ului. Aceasta clasa este descrisa detaliat mai tarziu in acest capitol.

De notat ca URL-ul poate fi folosit pentru a crea mai multe obiecte URLConnection; este folositor daca vor fi accesate in repetate randuri aceleasi servicii de pe serverul Web. Fiecare obiect URLConnection poate sa fie folosit numai o singura data.

InputStream openStream()throws IOException

Aceasta metoda deschide o conexiune cu un URL si returneaza un sir de intrare pentru citirea continuturilor .

~n cazul in care protocolul, apeleaza openStream() in mod automat expedieaza o cerere Http si analizeaza antetele rezultatelor, asa ca sirul returnat va citi tocmai de la continutul obiectului.

Aceasta apelare este echivalenta cu prima apelare a metodei openConnection() si dupa aceea apeland metoda getInputStream rezultanta a claseiURLConnection.

Object getContent () throws IOException

Metoda getContent() aduna continuturile URL-ului si intoarce un tip Object. Tipul întors depinde de continutul URL-ului. Daca URL-ul refera o imagine si un handler mai apropiat este instalat, un obiect de tipul Image trebuie sa fie întors. Similar, daca noi am instalat un handler mai apropiat pentru fisierele text, un obiect text trebuie sa fie întors ca un String, si asa mai departe.

Acesta metoda executa o serie de operatii pentru a primi rezultatul: o conexiune trebuie sa fie facuta la un server, o cerere trebuie sa fie facuta, si raspunsul trebuie sa fie prelucrat. Raspunsul poate sa indice ca de fapt obiectul actual este situat în alta parte, în acest caz un protocol handler apropiat se va conecta în mod automat la noua adresa fara vreo interventie din partea utilizatorului.

În realitate, acest metoda foloseste metoda openConnection() pentru a apela protocolul inlantuit care face o conexiune, si dupa aceea trece rezultatul la continutul inlantuit pentru analizarea automata.

protected void set (String protocol,String host,int port,String file,

String ref)

Aceasta metoda de tip protected permite unei subclase URL sa schimbe valorile diferitelor campuri URL: protocol, host, port, file si ref.

static void setURLStreamHandlerFactory(URLStreamHandlerFactory factory)

Aceasta metoda configureaza complet URLStreamHandlerFactory pentru aplicatia curenta. Se va folosi aceasta metoda când se vrea sa se dezvolte un protocol handler definit. URLStreamHandlerFactory factory trebuie sa fie in stare sa intoarca un handler apropiat pentru tipurile de protocol URL suportate. Aceasta metoda nu poate fi apelata o singura data; totusi mediul Java vine cu protocoale handler implicite care pot sa suporte cel putin un HTTP, si altele de obicei .

Accesul la aceasta metoda este limitat de Security Manager curent. Applet-urile nesigure nu sunt permise sa configureze URL-urile globale. Din acest motiv extinderea statica a ierarhiei URL este într-adevar folositoare numai pentru aplicatii; applet-urile trebuie în schimb sa se descurce cu protocolurile care sunt sprijinite in timpul de rulare a browser-ului sau, sub JDK 1. 2, ele trebuie sa specifice un URLStreamHandler alternativ pentru fiecare URL pe care il construiesc.

2.3. Exceptii I/O

Multe din metodele acestei clase pot oferi IOException daca o problema I/O exista.

2.4.Malformed URLException

O Malformed URLException poate fi oferita de oricare din constructorii URL. Indica o încercare pentru a crea un obiect URL de la câmpurile incorecte formate. Este o subclasa a IOException.

3. Folosirea clasei URL

JDK-ul implicit “vine” cu un protocol handler pentru HTTP; deci putem folosi clasa URL pentru a usura accesul la continutul de pe Web fara a instala manual o suita de protocoale si continuturi handler.

Clasa URL

Urmatorul fragment de cod descarca un fisier de configuratie folosind clasa URL

URL url=new URL

(*http://java.sun.com/index.html*);

InputStream in =url.openStream ();

Reader reader = new InputSreamReader (in, “latin1”);

BuffereReader buffereReader = new BuffereReader (reader);

PrintWriter console = new PrintWriter (System.Out);

String line;

while ((line = buffereReader.readLine ())!=null)

console.printl(line);

console.flush ();

buffereReader.close ();

~n acest exemplu s-a creat un URL pentru pagina JavaSoft. Dupa aceea apelam metoda openStream() pentru a initializa InputStream in folosita pentru a citi din acest fisier, si se ataseaza lui Reader reader (folosind caracterele ISO Latin 1 la traducere) si BuffereReader buffereReader atât timp cat se citeste o linie din text.

Apoi s-a creat PrintWriter console pentru a afisa la consola folosind caracterele locale. Se citesc linii din text cu bufferedReader si se afiseaza direct la consola. Cand s-a terminat de citit, se sterge console si se inchide bufferedReader care închide conexiunea de retea URL.

În mod evident, daca se întâlneste o eroare( ca de exemplu server-ul fiind cazut), atunci o exceptie IO va fii intalnita in aceasta bucata de cod.

Când apelam OpenStream(), protocolul handler HTTP implicit trimite o cerere HTTP la serverul Web la care URL-ul face referire, analizeaza antetele rezultatelor, si întoarce InputStream care citeste de la continutul fisierului la care ne-am referit.

Folosirea clasei URL în aceast mod reprezinta metoda preferata pentru un applet de a citi fisiere de la serverul sau; de obicei cu URL-uri create in legatura cu codurile de baza a applet-urilor. HTTP-ul handling implicit este în special folositor pentru ca cel mai aproape server este în mod automat folosit daca clientul este astfel configurat.

4.Clasa URLConnection

Clasa URLConnection reprezinta un protocol specific conexiunii cu un obiect URL. Aceasta clasa este abstracta; protocolul înlantuit este furnizat de implementarile de protocol specifice corespunzatoare .

JDK 1.1 introduce o subclasa a acestei clase HttpURLConnection, care furnizeaza aditional metodele specifice HTTP care sunt folosite de obicei, si sunt implementate de protocolul handler HTTP implicit. Ulterior, JDK 1.2 a introdus o subclasa aditionala, JarURLConnection, care furnizeaza metodele jar specifice care sunt de obicei folosite pentru accesul la datele jar-incapsulate.

4.1 Constructori

Unicul constructor furnizat de aceasta clasa este protected; ar trebui sa fie apelat de o subclasa care furnizeaza o implementare de protocol.

protected URLConnection(URL url)

Acest constructor creaza o URLConnection pentru URL: url. Acest constructor poate fii apelat numai de o subclasa care furnizeaza o implementare a diverselor metode URLConnection pentru un protocol particular.

4.2 Metode

Aceasta clasa reprezinta o conexiune de protocol specifica la un obiect rezervat. Dupa ce URLConnection este creata, ar trebui initializata cu apelul diverselor metode care controleaza cum va functiona. Apoi poate sa fie conectata al un server rezervat si rezultatele conexiunii pot sa fie interpretate.

Este responsabilitatea subclasei URLConnection (i.e.,in implementarea protocolului ) de a implementa toate metodele mentionate mai jos care în mod clar necesitata implementare, si pentru a tine seama de toate optiunile utilizatorului pe care el ar trebui sa le suporte. De exemplu, configurarea tuturor metodelor descrise mai jos stabilesc pur si simplu variabilele interne; este o implementare care face folosirea acestor variabile în timpul de executare al protocolului sau.

URL getURL()

Aceasta metoda returneaza URL-ul la care este atasata clasa URLConnection.

void setDoInput(boolean doInput)

Aceasta metoda seteaza daca clasa URLConnection va fi folosita de la intrare. Se apeleaza inaintea conectarii, daca nu se va citi de la aceasta conexiune.

boolean getDoINput()

Aceasta metoda returneaza daca URLConnection va fi folosita de la intrare; implicit este true.

void setDoOutput(boolean doOutput)

Aceasta metoda seteaza daca clasa URLConnection va fi folosita pentru iesire. Se apeleaza inaintea conectarii, daca se va scrie la aceasta conexiune.

boolean get DoOuput()

Aceasta metoda returneaza daca da sau daca nu aceasta clasa va fi folosita pentru iesire; implicit este false.

void set AllowUserInteraction (boolean allow )

Aceasta metoda seteaza daca aceasta clasa trebuie sa permita interactiunea cu un utilizator. Un exemplu comun este accesul la o parola de protectie a paginii Web; URLConnection trebuie sa intrebe utilizatorul de un username si o parola cu care are acces la pagina. Daca acest lucru este suportat, o implementare a lui URLConnection trebuie însusi sa furnizeze functii suplimentare pentru configurarea modului cum aceasta interactiune cu utilizatorul va avea loc.

boolean getAllowUserInteraction()

Aceasta metoda returneaza daca clasa URLConnection permite interactiunea cu un utilizator. Implicit este false.

void setUseCaches()

Aceasta metoda seteaza daca URLConnection trebuie sa foloseasca datele cache existente, daca sunt disponibile, pentru obiectul la care se refera.

boolean getUseCaches()

Acesta metoda returneaza daca URLConnection va folosi date cache. Implicit este true.

void setRequestProperty(String key,String value)

Aceasta metoda seteaza proprietatea cererii specificate,key, la o valoare specificata,value. Aceasta informatie va fii inclusa in antetele care sunt trmise cu cereri de protocol; de exemplu, un antet de forma cheie: valoarea va fi inclusa cu o cerere HTTP. O subclasa a clasei URLConnection trebuie sa implementeze aceasta metoda daca ea suporta proprietatile cererii.

String getRequestProperty(String key)

Aceasta metoda returneaza valoarea asociata cu proprietatea specifica cererii ,key, sau null daca nici o valoare nu a fost setata. O subclasa a clasei URLConnection trebuie sa implementeze aceasta metoda daca ea suporta proprietatile cererii.

void setModifiedSince(long ifModified)

Aceasta metoda configureaza URLConnection la singurul obiect de scop descarcat daca a fost modificat mai recent decat valoarea specificata, ifModified , (milisecunde de la 1 Ianuarie 1970,GMT)

long getIfModifiedSince()

Aceasta metoda returneaza valoarea if-modified-since ,sau 0 daca nimic nu a fost setat.

abstract void connect() throws IOException

Aceasta metoda trebuie conectata la un server care a fost specificat in constuctor . O subclasa a clasei URLConnection va furniza o implementare a acestei metode apropiate pentru un protocol particular. Tipic, nu este necesar pentru utilizator sa explice apelarea acestei metode; va fii apelata automat cand continutul acestei clase este accesat.

OutputStream getOutputStream() throws IOException

Aceasta metoda returneaza un OutputStream care permite unei aplicatii sa scrie la URLConnection. Aceasta ar trebui fi folosita de exemplu, pentru a executa o operatie HTTP trecuta. Aceasta metoda trebuie sa fie implementata de o subclasa URLConnection daca suporta rezultatul; implementarea implicita ofera un UnknownServiceException cu mesajul protocol de mesaj care nu suporta iesirea.

InputStream getInputStream() throws IOException

Aceasta metoda intoarce un InputStream care poate fi folosit pentru a citi de la un obiect URL. Daca avem un obiect URLConnection, putem apela acesta metoda pentru a obtine un sir neprelucrat pentru a citi de la sursa. Acesta trece peste continutul handler inlantuit folosind metoda getContent().

Aceasta metoda trebuie sa fie implementata de o subclasa a lui URLConnection daca suporta intrarea; implementarea implicita ofera un UnknownServiceException cu mesajul protocol de mesaj care nu suporta intarea.

Object getContent() throws IOException

Aceasta metoda salveaza continuturile URL-ului. Deoarece, continuturile pot sa fie orice, valoarea întoarsa este de tip Object. Clasa actuala intoarsa va depinde de tipul continutului, ca procesare a continutului handler inlantuit.

String getHeaderField(String name)

Aceasta metoda intoarce valoarea asociata cu antetul raspuns specific, name , sau null daca antetul nu a fost returnat. Aceasta metoda ar trebui sa fie apelata numai dupa ce aceasta conexiune a fost deschisa. O subclasa a clasei URLConnection poate sa implementeze aceasta metoda daca suporta antetele raspuns.

String getHeaderFieldKey(int n)

Aceasta metoda returneaza cheia a celui de-al n antet raspuns, numarand de la zero, sau null daca aceasta cheie nu exista. O subclasa a clasei URLConnection poate sa implementeze aceasta metoda daca suporta antetele raspuns.

String getHeaderField(int n )

Aceasta metoda returneaza valoarea a n-lea antet raspuns, numarand de la zero, sau null daca aceasta valoare nu exista. O subclasa a clasei URLConnection poate sa implementeze aceasta metoda daca suporta antetele raspuns.

int getHeaderFieldInt(String name,int alt)

Aceasta metoda returneaza valoarea asociata cu antetul raspuns specificat, name, analizat ca un intreg, sau altfel alt, daca antetul nu a fost returnat.

long getHeaderFieldIDate(String name,long alt)

Aceasta metoda returneaza valoarea asociata cu antetul raspuns specificat,name, analizat ca Date de clasa java.util.Date, sau altfel alt,daca antetul nu a fost returnat. Valorile sunt in milisecunde incepand cu 1 Ianuarie 1970 ,GMT.

int getContentLength()

Aceasta metoda returneaza valoarea lungimii continutului antetului raspuns, sau –1 daca antetul nu a fost returnat.

String getContentType()

Aceasta metoda returneaza valoarea tipului continutului antetului raspuns, sau null daca antetul nu a fost returnat.

String getContentEncoding()

Aceasta metoda returneaza valoarea valoarea continutului codificat a antetului raspuns, sau null daca antetul nu a fost returnat.

long getExpiration()

Aceasta metoda returneaza valoarea antetului raspuns expirat, sau 0 daca antetul nu a fost returnat. Este in URL-ul de date codificate.

long getDate()

Aceasta metoda returneaza valoarea datei din continutul antetului raspuns, sau 0 daca antetul nu a fost returnat. Este in URL-ul de date codificate.

long getLastModified()

Aceasta metoda returneaza valoarea ultimei modificari a continutului antetului raspuns, sau 0 daca antetul nu a fost returnat. Este in URL-ul de date codificate.

Permission getPermission()

Aceasta metoda returneaza obiectul JDK 1.2 Permission pe care apelantul trebuie sa-l posede pentru a fi în stare sa acceseze documentul identificat de clasa URLConnection. De exemplu, daca acest document este un fisier URL atunci o permisiune de a citi de la fisierul sistem este ceruta; daca este URL http atunci o permisiune de a comunica cu serverul la distanta este necesara.

void setDefaultUseCaches(boolean default Use)

Aceasta metoda returneaza folosirea implicita de datele cache pentru URLConnection. Initial este true. Aceasta metoda ar trebui sa fie static , dar nu este.

boolean getDefaultUseCaches()

Aceasta metoda seteaza folosirea implicita a datelor cache pentru toate clasele URLConnection viitoare. Deasemenea ar trebuie sa fie statica, dar nu este.

4.3 Metode statice

Urmatoarele metode sunt suportate de aceasta clasa

void set DefaultAllowUserInteraction( boolean defaultAllow )

Aceasta metoda seteaza permisiunea implicita a utilizatorului de a interactiona cu toate URLConnection care vor urma.

boolean get DefaultAllowUserInteraction( )

Aceasta metoda returneaza permisiunea implicita a utilizatorului de a interactiona cu toate URLConnection care vor urma. Initial este false.

void setDefaultRequestProperty(String key,String value)

Aceasta metoda trebuie sa seteze proprietatea cererii specifice pentru toate URLConnection care vor urma. ~n timpul scrierii, JDK-ul nu suporta aceasta metoda.

getDefaultRequestProperty(String key)

Aceasta metoda trebuie sa returneze proprietatea cererii specifica implicita. Oricum, în mod curent nu se implementeaza.

String Protected String guessContentTypeFromName(String fname)

Aceasta metoda poate fi folosita pentru a incerca determinarea tipului continutului în functie de tocmai numele fisierului URL. Folosim aceasta metoda intr-un exemplu mai tarziu pentru “ a ghici” tipul continutului URL inainte sa deschidem conexiunea. Metoda functioneaza ca sa arate bine extensia numelui de fisier într-un tabel intern si este furnizata ca un ajutor de programator .

String guessContentTypeFromStream(InputStream is ) throws IOException

Aceasta metoda incearca sa determine cotinutul URL-ului prin citirea a catva biti de la InputStream is. Foloseste metodele mark() si reset() astfel încât niste date sa poata sa fie citite si ulterior necitibile. Aceasta metoda este furnizata ca un ajutor pentru programator.

FileNameMap getFileNameMap()

Aceasta metoda returneaza FileNameMap globala folosita de metoda guessContentTypeFromName(). Aceasta metoda a fost prezentata de JDK 1.1.6; anterior o variabila public statica numita fileNameMap a fost folosita.

void setFileNameMap (FileNameMap map)

Aceasta metoda seteaza FileNameMap globala folosita de metoda guessContentTypeFromName(). Aceasta metoda a fost prezentata de JDK 1.1.6; anterior o variabila public statica numita fileNameMap a fost folosita.

void setContentHandlerFactory(ContentHandlerFactory factory)

Aceasta metoda seteaza ContentHandlerFactory de tip static pentru clasa URLConnection. ContentHandlerFactory factory va fii apelata pentru a determina un continut handler apropiat in functie de continutul tip al URL-ului. Aceasta metoda poate fi apelata o singura data .

Ca si la metoda setURLStreamHandlerFactory() care apartine clasei URL, accesul la aceasta metoda este limitat de SecurityManager. Applet-urile nu permit schimbarea lui ContentHandlerFactory. În schimb, ele trebuie sa se descurce cu continuturile handler furnizate in timpul de rulare, sau altfel pot apela getInputStream() si analizeaza datele direct.

4.4 Variabile

Toate variabilele urmatoare cu exceptia celor connected, vor fi initializate inainte ca URLConnection sa fie conectata la scopul sau. O implementare a metodei connect() trebuie sa foloseasca valorile acestor variabile pentru a determina cum se executa si trebuie apoi initializata variabila connected cu true. De notat ca aceste variabile ignora niste lipsuri generale care pot sa fi fost stabilite; modul corespunzator pentru a folosi aceste valori este astfel pentru a intreba valoarea variabilei, si daca este nesetata, apoi se foloseste global.

protected URL url

Aceasta variabila reprezinta URL-ul la care URLConnection este atasata.

protected boolean doInput

Acesta variabila indica daca clasa URLConnection poate suporta intrarea.

protected boolean doOutput

Acesta variabila indica daca clasa URLConnection poate suporta rezultatul.

protected boolean allowUserInteraction

Aceasta variabila indica daca clasa URLConnection poate permite interactiunea cu un utilizator.

protected boolean useCaches

Aceasta variabila indica daca aceasta clasa poate folosi date cache.

protected longifModifiedSince

Continuturile acestei clase pot fi aduse singure daca au fost modificate mai recent decat aceasta data.

protected boolean connected

Aceasta variabila trebuie setata cu true cand URLConnection este conectata

4.5 IOException

De obicei,problemele cu accesarea URL-ului prin URLConnection sunt semnalate de IOException.

5.Folosirea clasei URLConnection

Clasa URLConnection da mai mult control decat o conexiune care foloseste doar un obiect URL. Cele mai multe implementari ale JDK-ului furnizeaza suportul HTTP pentru ambii primiti si pentru cererile trecute. Urmatorul fragment de cod, foloseste metode din clasa URLConnection pentru a executa o operatie HTTP trecuta.Aceasta poate fi folosita, de exemplu, pentru a transfera informatia de la applet la un program CGI care se afla pe un server Web.

//String user,password;

URL url = new URL(getCodeBase () ,“/cgi-bin/update.cgi”);

URLConnection connection = url.openConnection();

Connection.setDoOutput (true);

OutputStream out = connection.getOutputstream ();

Writer writer = new OutputStreamWriter (out, “latin1”);

Writer.write ( “user=” + URLEncoder.encode(user));

Writer.write(“&password=” + URLEncoder.encode (password));

Writer.close ();

InputStream in= connection.getInputStream ();

Reader reader = new InputStreamReader (in, “latin1”);

BufferedReader bufferedReader = new Bufferedreader (reader);

Printwriter console = new PrintWriter (System.out);

String line;

While (line= bufferedReader.readline () ) !=null)

console.println (line);

console.flush() ;

bufferedReader.close ();

~ntai s-a creat un URL url care indica la programul CGI /cgi-bin/update.cgi de pe serverul Web care a servit acest applet. Furnizata de clasa Applet, getCodeBase() returneaza URL-ul de la care fisierele clasei applet au fost servite , si astfel doar serverul ca unstrusted applet poate fi conectat .

Apoi se apeleaza OpenConnection() pentru a crea conexiunea URLConnection care corespunde cu o conexiune de protocol specifica la acest obiect URL. UrlConnection nu este initial conectat. Se apeleaza metoda setDoOutput() pentru a indica ce date dorim sa trimitem prin aceasta conexiune. Pentru HTTP, aceasta corespunde cu folosirea unei operatii trecute în contradictie cu obisnuita operatie read-only primita. Apoi se apeleaza getOutputStream() pentru a obtine outputStream out la care se pot trimite datele noastre. Cateva protocoale nu suporta trimiterea si vor oferi o IOException corespunzatoare la acest punct.

Se trimit datele la acest sir folosind interfata sirurilor de caractere; se ataseaza un OutputStreamWriter folosind ISO 1 latin si apoi se trimit niste date. ~n acest caz se trimit doua URL-codificate atribute/valori perechi – un utilizator si o parola. Se foloseste clasa URLEncoder pentru a codifica valorile. ~n final, se inchide OutputStream si se apeleaza getInputStream() pentru a obtine InputStream in pentru ca sa citeasca un raspuns de la server.

Numai dupa ce se apeleaza GetInputStream(), protocolul handler va face de fapt o conexiune la serverul Web, trimite o post comanda si transmite datele care se vor scrie la iesire. Apoi se poate citi raspunsul serverului de la sirul returnat. ~n acest caz, se citeste raspunsul ca o succesiune de linii de text ISO Latin 1, afisand direct la consola la fel ca la exemplul de la clasa URL.

6.Clasa HttpURLConnection

Aceasta clasa este o subclasa abstracta a clasei URLConnection care furnizeaza suport special pentru protocolul HTTP. Cand se deschide o URLConnection la un URL Http se pot invoca metodele definite aici pentru protocoale suplimentare de control specifice.

6.1 Constructori

Clasa HttpURLConnection furnizeaza urmatorul constructor:

protected HttpURLConnection (URL url)

O subclasa va apela acest constuctor cu obiectul URL la care se conecteaza.

6.2 Metode

Clasa HttpURLConnection furnizeaza urmatoarele metode:

void setRequestMethod(String method)throws ProtocolException

Aceasta metoda seteaza cererea HTTP de afi folosita de aceasta clasa.Poate fi apelata numai inainte de conectarea cu un server departat,sI valoarea este limitata la valorile GET,POST,HEAD,OPTIONS,PUT,DELETE saU TRACE.

String getRequestMethod()

Aceasta metoda returneaza o metoda cerere Http care va fi folosita de URLConnection. Valoarea implicita, daca alta nu este specificata, este GET pentru conexiuni read-only si POST pentru citire-scriere.

int getResponseCode() throws IOException

Aceasta metoda returneaza codul raspuns HTTP care a fost returnat de serverul Web ca raspuns la aceasta cerere, sau –1 daca nici un cod de raspuns nu a fost intors. De exemplu 404 este returnata de linia de stare HTTP/1.1 404 Not Found. Daca serverul nu a fost inca contactat atunci aceasta metoda va lua legatura cu el pentru a recupera linia de stare.

String getResponseMessage() throws IOException

Aceasta metoda returneaza mesajul raspuns HTTP care a fost returnat de serverul Web ca raspuns la aceasta cerere, sau null daca nici un cod de raspuns nu a fost intors. De exemplu, MethodNotAllowed este returnata de linia de stare HTTP/1.1 405 Method Not Allowed.

abstract void disconnect()

O subclasa va implementa aceasta metoda pentru a deconecta serverul.

boolean abstract usingProxy()

O subclasa va implementa aceasta metoda pentru a returna daca un proxy Web a fost folosit pentru a face aceasta conexiune HTTP.

6.3 Metode statice

Clasa HttpURLConnection furnizeaza urmatoarele metode statice:

void setFollowRedirects(boolean set)

Aceasta metoda permite cadrului URL de a fi configurat in mod automat de urmatorul HTTP (codurile de raspuns in 300 de domenii cu un antet Location) sau nu permite. Valoarea implicita este true.

boolean getFollowRedirects()

Aceasta metoda returneaza daca redirectarea este urmata automat sau nu.

6.4 Variabile

Urmatoarele exemple de variabile sunt definite; valorile acestor variabile sunt asignate de metodele descrise mai sus.

protected String method

Aceasta este metoda de cerere existenta folosita; implicit GET.

protected int responseCode

Aceasta este codul de raspuns HTTP care a fost returnat(e.g.,200), sau –1 daca nu a putut fi determinat.

protected String response Message

Aceasta este mesajul cu raspunsul HTTP care a fost returnat (e.g, Not found), sau null daca nu a putut fi determinat.

6.5 Variabile statice

Urmatoarele variabile statice sunt furnizate, descriind diferite standarde ale codurilor de raspuns HTTP:

Coduri de succes

Coduri de redirectare

Codurile de eroare ale clientului

Codurile de eroare ale serverului

6.6. Exemplu:

Acest exemplu demonstreaza folosirea de baza a acestei clase:

URL url= new URL (*http://nitric.com/jnp/index.html*)

URLConnection conn = url.openConnection ();

HttpURLConnection httpConn = (HttpURLConnection) conn;

int responseCode = httpConn.getResponseCode ();

if (responseCode == HttpURLConnection.HTTP_OK)

{

InputStream in = httpConn.getInputStream ();

….

}

~n acest exemplu s-a creat un obiect URL folosind protocolul HTTP. Apoi se deschide o HttpURLConnection si se apeleaza getResponseCode() pentru conectarea la server si se determina daca conexiunea s-a realizat cu succes. Daca acest lucru s-a realizat, atunci se apeleaza getInputStream () pentru a citi cu succes raspunsul.

7.Interfata URLStreamHandlerFactory

Interfata URLStreamHandlerFactory reprezinta prima parte a unui lant de protocoale-handler obisnuite. O clasa care implementeaza aceasta interfata este responsabila pentru crearea exemplelor URLStreamHandler care suporta protocoale URL diferite.

InterfataURLStreamHandlerFactory

7.1.Metode

Interfata URLStreamHandlerFactory declara o metoda:

URLStreamHandler createURLStreamHandler (String protocol)

Aceasta metoda trebuie sa creeze o noua URLStreamHandler care poate rezolva protocolul specificat protocol.

Cand clasa URL incearca sa deschida o conexiune la un obiect URL, ea apeleaza URL-ul StreamHandlerFactory pentru a întoarce un obiect URLSreamHandler corespunzator pentru protocolul in cauza. De exemplu, daca tipul protocolului este ftp,un Ftp stream handler va fi creat.

La implementarea protocolului inlantuit, o clasa trebuie sa implementeze aceasta interfata,si apoi este instalata folosind setURLStreamHandlerFactory() metoda a clasei URL.

De notat ca sub JDK 1.2 aceasta interfata poate fi trimisa in intregime deoarece un per-URL URLStreamHandlerFactory poate fi specificat, permitând mai mult acces detaliat la un protocol manipulat.

7.2.Protocoale handler implicite.

Daca URLStreamHandlerFactory returneaza null, clasa URL continua sa caute un set implicit de pachete pentru URL care suporta protocolul dorit: încearca sa localizeze o clasa apeland Handler în pachetul prefix.protocol, unde prefix este unul din setul implicit de pachete numit si protocolul este protocolul URL. Pachetele numite care sunt cautate sunt toate listate in proprietatea System java.protocol.handler.pkgs, urmat in final de sun.net.www.protocol.

De exemplu, daca proprietatea System java.protocol.handler.pkgs contine valoarea nitric.url.protocols/personal.protocols si un URL cu protocolul xyz este creat, atunci mai întâi se instaleaza URLStreamHandlerFactory, în cazul când va fi întrebat de URLStreamHandler care suporta xyz. Daca se returneaza null, clasa URL va incerca sa localizeze clasa nitric.url.protocols.xyz.Handler. Daca nu exista, va cauta la personal.protocols.xyz.Handler, apoi sun .net.www.protocol.xyz.Handler.

~n timpul scrierii, JDK 1.1 este expediat cu handlere în pachetele sun.net.www.protocol pentru urmatoarele protocoale: appletresource, doc, file, ftp, gopher, http, mailto, netdoc, systemresource, verbatim.

8.Clasa URLStreamHandler

Clasa finala inglobata in protocolul inlantuit este clasa abstracta URLStreamHandler. Aceasta clasa este responsabila pentru exemplele actuale create ale clasei URL care are capabilitatea de a servi un protocol particular, ca HTTP .

Pentru a implementa un protocol inlantuit, este necesar de a implementa URLStreamHandlerFactory, URLStreamHandler si de a furniza implementarea lui URLConnection pentru diverse protocoale care sunt suportate. De obicei o singura clasa URLStreamHandler va fi furnizata pentru suportul protocoalelor multiple.

8.1.Metode

Clasa URLStreamHandler defineste o metoda public, pentru a crea URLConnection, si diferite metode de ajutor pentru implementari URLStreamHandler

protected abstract URLConnection openConnection(URL url ) throws IOException

Aceasta metoda creaza un obiect URLConnection apropiat pentru URL-ul specificat :url.

protected void parseURL(URL url,String spec,int start,int limit)

Aceasta metoda analizeaza subsirurile host/port/file ale URL-ului textual, spec, de la start pâna la limit, în tinta URL, url. Indexul start trebuie sa fie primul caracter dupa urmatorul protocol specificat, daca exista. Indexul limit trebuie sa fie sfarsitul sirului sau delimitatorul referinta #. Aceasta metoda nu este de obicei folosita numai intern de clasa URL. Implementarea implicita manipuleaza stilul HTTP, sintaxa URL trebuie sa fie suprascrisa de URLStreamHandler care suporta stilul non-HTTP ale URL-urilor.

protected String toExternalForm(URL url)

Aceasta metoda converteste URL-ul url la o forma textuala. Implementarea implicita manipuleaza stilul HTTP, sintaxa URL trebuie sa fie suprascrisa de URLStreamHandler care suporta stilul non-HTTP ale URL-urilor.

protected void setURL (URL url,String protocol, String host, int port, String file, String ref)

Aceasta metoda este furnizata de subclasele URLStreamHandler care au nevoie sa modifice campurile URL-ului. De obicei, aceasta este doar ceruta de metoda parseURL() daca este suprascrisa.

9.Interfata ContentHandlerFactory

Interfata ContentHandlerFactory reprezinta prima parte a continutului handler inlantuit. O clasa care implementeaza aceasta interfata este responsabila pentru returnarea exemplelor clasei ContentHandler pentru diferite tipuri MIME. De obicei tipurile MIME includ text simplu, imagine/jpeg si asa mai departe.

9.1.Metode

Aceasta interfata defineste doar o metoda:

ContentHandler createContentHandler (String mimetype)

Aceasta metoda creaza un ContentHandler care poate citi un obiect al continutului tip specificat: mimetype.

Clasa URLConnection furnizeaza metode care pot determina continutul tip al unui URL particular. Se foloseste numele obiectului, ca primii octeti ai insusi obiectului, pentru a determina aceasta informatie. Apoi se apeleaza ContentHandlerFactory pentru a returna un handler apropiat pentru tipul obiectului care a fost identificat. De exemplu, daca tipul unui obiect este text/html, un continut handler HTML trebuie sa fie returnat.

Pentru a implementa un continut handler inlantuit, o clasa trebuie sa implementeze aceasta interfata si apoi sa fie inregistrata cu clasa URLConnection prin metoda sa setContentHandlerFactory().

9.2.Continuturile handler implicite.

Daca ContentHandlerFactory returneaza null, clasa URL continua sa caute o locatie implicita pentru o ContentHandler care suporta protocolul dorit: încearca sa localizeze o clasa apropiata in pachetul sun.net.www.content. Numele exact al clasei care cauta sa fie în functie de tipul MIME: caracterul slash este inlocuit cu punct si toate caracterele non alfa numerice sunt inlocuite cu underscore (_). Ca rezultat fiecare tip mai major va fi intr-un pachet separat si fiecare subtip va fi o clasa separata in pachet.

De exemplu, daca un obiect de tip MIME imagine/x-xpixmap este accesat la prima instalare a clasei ContentHandlerFactory, atunci va fi apelata clasa ContentHandler pentru acest tip. Daca returneaza null, clasa URLConnection va incerca sa localizeze clasa sun.net.www.content.image/x-xpixmap. ~n timpul scrierii JDK 1.1 este expediat cu handlere in pachetul sun.net.www.content pentru urmatoarele tipuri de continut: text/plain, image/gif, image/jpeg, image/x-xbitmap, image/x-xpixmap.

Ca inainte, nu trebuie sa se puna baza pe prezenta permanenta a acestor handlere .

10.Clasa ContentHandler

Aceasta clasa este responsabila pentru preluarea continutului URL-ului si va crea un rezultat care este folositor in timpul de executie Java. Cand metoda getContent() este apelata, protocolul inlantuit va face o conexiune catre acest obiect si acest continut va fi apelat pana cand instanta acestei clase va decodifica obiectul.

ClasaContentHandler

10.1.Metode

Implementarea ContentHandler trebuie sa furnizeze doar o metoda:

abstract Object getContent(URLConnection connection) throws IOException

Aceasta metoda trebuie sa utilizeze una din metodele clasei URLConnection, connection, citeste continutul obiectului vizat, pentru analiza corespunzatoare în ceea ce priveste tipul continutului.

Tipul actual al obiectului returnat va depinde de aplicatia despre care este vorba; oricum, pentru aceleasi tipuri, rezultatul trebuie sa fie evident. Daca ContentHandler analizeaza fisierele de imagine al unor formate neobisnuite trebuie sa returneze un obiect Image. Similar, daca se analizeaza fisiere HTML, trebuie sa se returneze un obiect HTML corespunzator.

Numai o clasa ContentHandler va fi creata de interfata Content Handler -Factory pentru a da tipul MIME; aceasta clasa va fi apoi responsabila pentru decodificarea tuturor URL-urilor urmatoare de acest tip. Din aceste motive, continuturile handler trebuie sa fie threadsafe (2 thread-uri nu acceseaza in acelasi timp sectiunea critica) si capabile de prelucrarea obiectelor multiple.

11. Protocolul HTTP handler

Dupa cum am vazut, browserele Web trimit cereri de forma GET/document HTTP/1.0 pentru a descarca documente de pe serverul Web prin HTTP 1.0. Server-ul Web raspunde cu o serie de antete, urmate de fisier. Aceste antete pot fi examinate pentru a determina tipul fisierului si un handler apropiat poate apoi sa fie invocat sa se ocupe de el.

~n clasele urmatoare se va implementa cadrul URL necesar pentru a recupera datele folosind protocolul HTTP si in urmatoarea sectiune de a transforma simpluin mod automat datele de text .Mai tarziu in acest capitol se va analiza suportul protocolului finger prin acest cadru URL .

Suportul pentru protocolul HTTP cere sa se furnizeze o implementare a interfetei URLStreamHandlerFactory care returneaza o clasa URLStreamHandler corespunzatoare pentru HTTP din URL-uri. Trebuie sa returneze o implementare a clasei URLConnection care, de fapt implementeaza HTTP. Tot de aceea, cum se va vedea, este destul de simpla informatia prezentata noua de TCP /IP.

11.1.Clasa URLStreamHandlerFactoryImpl

Clasa URLStreamHandlerFactoryImpl trebuie sa intoarca o clasa URLStream- Factory corespunzatoare pentru protocol, in acest caz, HTTP

import java.ro.*;

import java.net.*;

public class URLStreamHandlerFactoryImpl implements URLStreamHandlerFactoryImpl

{

public URLStreamHandler createURLStreamHandler (String protocol)

{

if (protocol.egualsIgnoreCase (*http))

return new HTTPURLStreamHandler ();

else return null;

}

}

Aceasta implementare a acestei clase este simpla; verifica pentru un protocol de tip http si returneaza un HTTPURLStreamHandler.

O implementare mai complexa verifica pentru mai multe protocoale si returneaza stream handler pentru protocolul corespunzator. Daca se doreste o implementare a protocolului FTP, trebuie sa returneze un FTPURLStreamHandler pentru un protocol ftp. Astfel se poate usor extinde cadrul URL pentru a manipula noile protocoale.

11.2.Clasa HTTPURLStreamHandler

Aceasta clasa trebuie sa returneze un URLConnection corespunzator protocoalelor pe care le suporta.

import java.ro.*;

import java.net.*;

public class HTTPURLStreamHandler extends URLStreamHandler

{

protected URLConnection openConnection (URL url) throws IOException

{

return new HTTPURLConnection (url);

}

{

Acest exemplu poate manipula doar protocolul HTTP, si deci returneaza o noua HTTPURLConnection (sa nu se confunde cu JDK 1.1 API clasa HttpURLConnection) de la metoda ei openConnection(). Aici se suporta protocoale multiple , se poate apela getProtocol () pentru a determina protocolul url si apoi de a returna un rezultat corespunzator in functie de protocol.

11.3.Clasa HTTPURLConnection

Aceasta este clasa care face majoritatea muncilor de recuperare a URL-ului. Trebuie deschisa o conexiune la un server, trimite cererile corespunzatoare si determina tipul continutului informatiilor rezultate. De notat ca o implementere de productie a unei clase URLConnection pentru HTTP trebuie sa execute mult mai multe procese decât se fac aici. Un raspuns HTTP include un camp de stare care indica succesul cererii. Printre raspunsurile diverse posibile este un raspuns care indica ca clientul trebuie sa incerce recuperarea unui URL alternativ. O clasa URLConnection mai completa va analiza aceste antete si in mod automat se executa acest directie daca este necesar. Aditional, trebuie suportate metode extra furnizate de JDK 1.1 API clasa HttpURLCOnnection.

import java.ro.*;

import java.net.*;

import java.util.*;

import java.text.*;

public class HTTPURLConnection extends URLConnection

{

//public HTTPURLConnection (URL url)…

//public void setRequestProperty (String name ,String value)….

//public String getRequestProperty (String name)…

//public void connect () throws IOException…

//public InputStream getInputStream() throwsIOException

//public String getHeaderFieldKey (int index)…

//public String getHeaderField (int index)…

//public String getHeaderFieldKey (String key)…

}

HTTPURLConnection extinde clasa URLConnection si implementeaza unele metode care sunt furnizate de clasa URLConnection. Aici se includ proprietatile cererii setate, metoda connect() pentru conectarea la server, getInputStream() de a citi raspunsul serverului, si diverse metode pentru a citi antetele care au fost returnate de server.

protected Hashtable requestProperties;

protected Vector keys;

protected Hashtable headers;

protected HTTPURLConnection (URL url)

{

super(url);

requestProperties = new Hashtable ();

keys = new Vector ();

headers = new Hashtable ();

}

~n acest constructor, se apeleaza superclasa constructor cu URL-ul specificat: url. Se initializeaza Hashtable requestProperties, Vector key si Hashtable headers; aici sunt folosite pentru a pastra proprietatile cererilor care sunt transmise si antetele care sunt returnate de server.

public void setRequestProperty (String name,String value)

{

if (connected)

throw new IllegalStateException (“Already connected”);

requestProperties.put (name,value);

}

Aceasta metoda seteaza proprietatea cererii specificata: name, la valoarea value specificand o IlegalStateException daca suntem deja conectati.

public String getRequestProperty (String name)

{

return (String) requestProperties.get (name);

}

Aceasta metoda returneaza proprietatea cererii numelui specificat: name, sau altfel null.

protected InputStream in;

public synchronized void connect() throws IOException

{

if (!connected)

{

String host = url.gethost();

int port = (url.getPort() == -1) ? 80 :url.getPort();

Socket socket = new Socket(host,port);

sendRequest(socket.getOutputStream());

in = new BufferedInputStream(socket.getInputStream());

readHeaders();

connected = true;

}

}

//protected void sendRequest(OutputStream out) throws IOException…

//protected void readHeaders() throws IOException…

Metoda connect() este responsabila pentru conectarea la server-ul Web, rezultand cererea si analizand raspunsul server-ului. Se foloseste metoda sendRequest() pentru a trimite cererea, metoda readHeaders() pentru a citi antetele raspunsurilor server si apoi seteaza variabila connected pentru a indica ca exista conexiune.

protected void sendRequest (OutputStream out) throws IOException

{

setRequestProperty (“User-Agent”,”JNP-HTTP/2e”);

if (ifModifiedSince !=0)

{

Date since = new date (ifModifiedSince);

SimpleDateFormat formatter =

new SimpleDateFormat (“EEE, d MMM yyyy hh:mm:ss z”);

formatter.setTimeZone (TimeZone.getTimezone (“GMT”)); setRequestProperty(“IfModifiedSince”,formatter.format

(since));

}

StringBuffer request = new StringBuffer(“GET”);

request.append(URLEncoder.encode (url.getFile()));

request.append(“HTTP/1.0aran”);

Enumeration keys = requestProperties.keys();

while (keys.hasMoreElements())

{

String key = (String) keys.nextElement();

request.append(key);

request.append(“:”);

request.append(requestProperties.get(key));

request.append(“aran”);

}

request.append(‘a’);

out.write(request.toString().getBytes(“latin1”));

Metoda sendRequest() creaza o cerere HTTP get standard in StringBuffer request si scrie acest lucru intr-un tablou de octeti in OutputStream out dupa convertirea ISO Latin 1.

Se includ toate proprietatile cererii utilizatorului ca antetele HTTP standard in aceasta cerere, incluzand urmatoarele: User-Agent identifica aplicatia clientului realizand cererea (acest cadru URL) si If-Modified-Since specifica care client nu doreste documente care raman neschimbate pana la o data specificata (formate in stilul IETF standard; e.g.,Tue,10 Noiembrie 1998 18:50:23 GMT).

protected void readHeaders () throws IOException

{

String status = readLine();

String header;

while (((header = readLine()) != null )&&

(!header.trim().eguals(“”)))

{

int colon = Header.indexOf(“:”);

if (colon >= 0)

{

String key = header.substring(0,colon).trim();

String value = header.substring(colon + 1).trim();

keys.addElement(key);

headers.put(key.toLowerCase().value);

}

}

}

//protected String readLine() throws IOException

Metoda readHeaders() este apelata pentru a citi antetele HTTP de la serverul raspuns. Aceste antete compun o linie de stare urmata de o serie de antete de forma: valoare urmata de o linie goala. Pentru scopul acestui exemplu, se ignora complet linia de stare a serverului. Ideal se va face o stare disponibila pentru analizator. Mai mult, trebuie sa se verifice ca o stare este într-adevar întoarsa; altfel, daca s-a facut conectarea la o mostenire a serverului HTTP /0. 9 care nu returneaza informatia din antet, atunci se va sterge inceputul raspunsului. Ignorand rezultate acestea, se citeste pur si simplu o linie dintr-o data punând fiecare cheie de antet în Vector keys si fiecare pereche valoare – cheie in Hashtable headers . Diferitele metode care analizeaza antetele vor citi de la aceste doua tipuri de date structurate.

Se va continua citirea liniilor pana cand se va inalni sfarsitul stream-ului sau o linie goala. Datele care urmeaza dupa aceste antete sunt in corpul obiectului URL; se lasa aceste date sa fie prelucrate de un continut handler.

protected string readLine() throws IOException

{

String Buffer result = new stringBuffer();

int chr;

while((chr = in.read())!=-1) && (chr !=10) && (chr!=13))

result.append((char)chr);

if ((chr== -1)&&(result.length()==0)

return null;

if (chr == 13)

{

in.mark(1);

if (in.read() !=10)

in.reset();

}

return result.toString();

}

Aceasta metoda citeste o singura linie de text de la URLConnection InputStream in, unde o linie poate fi terminata cu LF, CR sau CRLF. Se introduce un bucla, in care se citesc caractere de la in , si se adauga in StringBuffer result pana se ajunge la EOF, linie noua sau revenire la începutul rândului. Daca s-a ajuns la EOF fara sa se intalneasca ceva date, se returneaza null. Altfel, se testeaza pentru CTRLF; daca se intalneste un CR, se marcheaza pozitia curenta in de citire, se citeste alt caracter, si daca nu a fost un caracter LF, se returneaza. ~n aceasta maniera, se pot furniza rezultate pentru orice liniei valabila terminata.

De notat ca nu se poate atasa un BufferedReader din clasa InputStreamReader la in si sa citeasca o linie. Se vrea sa se poata schimba inapoi citirea datelor binare dupa citirea textului. Clasa InputStreamReader foloseste buffere interne si deci se vor citi mai multe date de la stream–ul atasat decat doar textul pe care l-am citit prin acesta.

public InputStream getInputStream() throws IOException

{

if (!doInput)

throw new IllegalStateException(“Input disabled”);

connect();

return null;

}

Aceasta metoda apeleaza metoda connect() si returneaza InputStream care este conectata la server. Continutul URL-ului poate fi citit ulterior de la acest stream; antetele vor fi deposedate de metoda content().

12.Handlere de continut pentru texte simple

Se va privi acum la implementarea suport pentru descarcarea si decodificarea în mod automat a documentelor de tip text / plain. Acest lucru da voie ca intr-o aplicatie simpla sa se apeleze metoda getContent() pentru un text URL si sa primeasca un String corespunzator la returnare. Data informatia corespunzatoare, se poate extinde usor acest cadru ca sa suporte diferite tipuri de continut.

Pentru implementarea acestui cadru, trebuie sa se furnizeze o implementare a interfetei ContentHandlerFactory care returneaza o implementare a lui Content- HandlerFactory care poate decodifica textul simplu. Pentru a demonstra protocolul inlantuit HTTP si continutul inlantuit al textului, se concluzioneaza aceasta sectiune cu o clasa simpla care descarca si afiseaza documente folosite de clasa URL.

12.1.Clasa ContentHandlerFactoryImpl

Aceasta clasa este responsabila pentru returnarea unui continut handler corespunzator pentru orice tip de continut MIME care se va suporta.

Import java.io.*;

Import java.net.*;

public class ContentHandlerFactoryImpl implements ContentHandlerFactory

{

publicContentHandler createContentHandler(String mimeType)

{

if (mimeType.equalsIgnoreCase(“text/plain”))

return new TextPlainContentHandler();

else

return null;

}

}

Metoda createControlHandler() este singura metoda care apartine interfetei ContentHandlerFactory. ~n acest caz, se suporta numai texte simple, deci se returneaza o TextPlainContextHandler pentru tipul MIME text/plain si null pentru orice alte tipuri de continut.

Ca si la implementarea URLStreamHandlerFactory, se pot adauga usor facilitati pentru a suporta noi tipuri MIME cu o simpla returnare a continutului handler corespunzator pentru diferite tipuri de continut. Pentru testare, de exemplu, o idee buna poate sa returneze TextPlainContextHandler pentru toate tipurile MIME incepand cu text/plain.

12.2.Clasa TextPlainContentHandler

Aceasta clasa colecteaza continuturile textului simplu URL. Se returneaza un obiect String format din continuturile URL înconjurate de comentariile descriptive.

import java.net.*;

import java.io.*;

public class TextPlainContentHandler extends ContentHandler

{

public Object getContent(URLConnection connection)

throws IOException

{

InputStream in = connection.getInputStream();

Reader reader = new InputStreamReader(in,”latin1”);

BufferedReader bufferedReader=new BufferedReader(reader);

StringBuffer content = new StringBuffer();

String line;

while ((line = bufferedReader.readLine()) != null);

content.append(line).append(‘a’);

bufferedReader.close();

return content.toString();

}

}

Singura metoda de care este nevoie la implementare este getContent(). Aceasta metoda are ca parametru un obiect URLConnection si trebuie sa returneze un continut al obiectului corespunzator. Se ataseaza un BufferedReader la o metoda InputStream a clasei URLConnection, se citeste continutul stream-ului intr-o variabila StringBuffer apoi se returneaza rezultatul. ~n acest exemplu s-a decodificat raspunsul serverului folosind ISO latin 1 .~n cele din urma ar fi mult mai corespunzator de a examina raspunsul antetelor connection ,si de a alege un caracter codificat in functie de informatia furnizata aici. Facandu-se astfel, este mai mult decat se poate suporta in acest moment.

Daca se manipuleaza un tip al continutului mai complex, este nevoie sa se faca mai multa procesare. Un continut handler al unei imagini/gif trebuie sa decodifice continutul URL si sa creeze o Image in functie de datele imaginii. Oricum, doar cu o implementare simpla, acum este un cadru complet pentru descarcarea si decodificarea automata a documentelor text de pe Web, dupa cum se va demonstra .

12.3.Clasa PageViewer

Clasa PageViewer este o aplicatie simpla care ia un URL ca un argument la linia de comanda si descarca si afiseaza pagina. Daca continutul paginii nu este un text simplu ( fisiere HTML nu sunt consideratea fi text simplu), atunci acest exemplu nu va tipari un continut al obiectului folositor.

import java.io.*;

import java.net.*;

public class PageViewer

{

public static void main(String argsst)

throws IOException

{

if (args.length !=1)

throw new IllegalArgumentException

(“Usage:PageViewer <url>”);

URL.setURLStreamHandlerFactory

(new URLStreamHandlerImpl());

URLConnection.setContentHandlerFactory

(new ContentHandlerFactory());

URL url = new URL(argss0t);

System.out.println(url.getcontent);

}

}

Aceasta clasa seteaza doua procedee obisnuite pentru a pune cadrul URL la loc. Pentru clasa URL, se instaleaza clasa URLStreamHandlerFactory. Pentru clasa URLConnection, se instaleaza clasa ContentHandlerFactoryImpl. Acum exista protocolul propriu si continuturile handler.

Se poate apoi crea simplu un URL corespunzator documentului cerut, apeleaza metoda getContent() pentru a salva continutul, si apoi se tipareste continutul cu System.out.

Pentru folosirea acestui cadru, incercati-l la iesire dupa cum urmeaza:

java PageViewer http://nitric.com/jnp/file.txt

hello,world !

13. Protocolul handler finger

{tiind functiile cadrului URL, este mai usor de adaugat suport pentru protocoale noi si pentru tipuri de continut. ~n exemplul urmator, se adauga suport pentru protocolul finger; se furnizeaza doua URLStreamHandler pentru a suporta URL-urile de urmatoarea forma:

finger://nitric.com/merlin

finger://firewall.nitric.com/internal/#verbose

rawfinger:[anonimizat]

rawfinger:@[anonimizat]#verbose

URL-urile cu protocoale finger sau rawfinger returneaza un text-plain rezultat al cererii finger. Acest lucru este bazat in mare masura pe client finger.

Se adauga trei clase: FingerURLStreamHandler, RawFingerURLStream- Handler si FingerURLStreamHandler. Se presupune ca URLStreamHandler Factory- Impl a fost corespunzator modificata ca sa returneze exemplele cu FingerURL- StreamHandler pentru protocolul finger si exemplele cu RawFingerURLStream- Handler pentru protocolul rawfinger.

13.1.Clasa FingerURLStreamHandler

Aceasta clasa este de tip URLStreamHandler care va fi returnata de URLStreamHandlerFactory ca raspuns la protocolul finger. Acest handler suporta URL-urile de forma:

finger://nitric.com/merlin

finger://firewall.nitric.com/internal.nitric.com/#verbose

Prima cerere da informatii despre utilizatorul merlin de pe host-ul nitric.com. A doua cerere are ca rezultat: informatii verbose despre toti utilizatorii de pe host-ul internal.nitric.com, informatii cerute de host-ul firewall.nitric.com. Aceasta clasa este comparativ simpla deoarece actuala conversie de la formatul URL la o cerere finger este realizata de clasa FingerURLConnection.

import java.io.*;

import java.net.*;

public class FingerURLStreamHandler extends URLStreamHandler

{

protected URLConnection openConnection(URL url) throws IOException

return new FingerURLConnection(url);

}

Se furnizeaza o metoda care returneaza o noua clasa FingerURLConnection conectata la URL-ul specificat: url.

13.2. Clasa FingerURLConnection

Clasa FingerURLConnection extinde clasa URLConnection, furnizand suport pentru protocolul finger folosind clasa Finger care a fost prezentata anterior.

import java.io.*;

import java.net.*;

import java.util.*;

public class FingerURLConnection extends URLConnection

{

//public FingerURLConnection(URL url)…

//public void connect() throws IOException…

//public InputStream getInputStream()throws IOexception …

//public String getContentType() …

}

Clasa FingerURLConnection furnizeaza constructori obisnuiti, metoda connect(), metoda getInputStream() si metoda getContentType(). Se mostenesc implementarile implicite a tuturor celorlalte metode. Aceasta inseamna ca apelarea metodei getOutputStream() va produce o exceptie si incercând sa citeasca antete va returna null.

public FingerURLConnection(URL url)

{

super(url);

}

Acest constructor apeleaza superconstructorul, atasat la URL url.

protected InputStream in;

public synchronized void connect()

throws IOException

{

if (!connected)

{

StringBuffer query = new StringBuffer();

String file = url.getFile().substring(1);

StringTokenizer files = new

StringTokenizer(file,”/”,true);

while (files.hasMoreTokens())

query.insert(0,files.nextToken().replace(‘/’,’@’));

Finger finger=new

Finger(query.toString(),url.getHost()),url.getPort(),

”verbose”.equalsIgnoreCase(url.getRef ()));

Reader reader = finger.finger

in = new ReaderInputStream(reader,”latin1”);

connected = true;

}

}

~n metoda connect(), trebuie sa se traduca o parte a fisierului din URL intr-un format corespunzator pentru o cerere finger. Acest lucru implica sa se scoata /, inversând componentele fisierului si înlocuind in toate exemplele / cu @. Se obtine acest lucru cu un StringBuffer si un StringTokenizer. Apoi se poate crea o instanta pentru clasa Finger folosind numele host-ului si portul, specificate in acest URL, si executa cererea finger prin apelarea lui finger(). Se converteste rezultatul Reader intr-un InputStream folosind un ReaderInputStream (descrisa ulterior) si pune acest lucru in variabila in, in final se seteaza variabila superclasa connected cu true. Desigur, se poate continua cu clasa ReaderInputStream expunând o metoda alternativa Finger care returneaza un InputStream, sau citind continuturi intregi din reader intr-un buffer si returnand continutul buffer-ului ca un ByteArrayInputStream; oricum, aceasta alternativa de implementare este un pic mai interesanta.

public InputStream getInputStream()throws IOException

{

connect();

return in;

}

Metoda getInputStream() apeleaza connect() si returneaza InputStream. Raspunsul finger poate fi citit ca un text plain.

public String getContentType()

{

return “text/plain”;

}

Metoda getInputStream() returneaza text/plain; raspunsul la orice cerere finger este deasemenea text plain. Ca rezultat ,cadrul URL care s-a dezvoltat va folosi TextPlainContentHandler propriu pentru a analiza rezultatul oricarei cereri finger.

13.3. Clasa ReaderInputStream

Aceasta clasa transforma un Reader intr-un InputStream conform cu o decodificare specificata, in primul rand task-ul opus a unei InputStreamReader. Acesta clasa este necesara deoarece, clasa Finger foloseste stream-uri de caractere.

import java.io.*;

public class ReaderInputStream extends InputStream

{

//public ReaderInputStream(Reader reader)…

//public ReaderInputStream(Reader reader,String encoding) throws UnsupportedEncodingException…

//public int read() throws IOException…

//public int read(bytest data,int off,int len)

throws IOException…

//public int available() throws IOException…

//public void close() throws IOException…

Aceasta clasa extinde clasa InputStream, furnizand constructori care accepta un Reader, si optional, o codificare a datelor caracter prin metodele standard read(), available() si close(). Nu se suporta mark() sau reset().

protected Reader reader;

protected ByteArrayOutputStream byteArrayOut;

protected charst chars;

protected bytest buffer;

protected int index,length;

public ReaderInputStream(Reader reader)

{

this.reader = reader;

byteArrayOut = new ByteArrayOutputStream();

writer=new OutputStreamWriter(byteArrayOut,encoding);

chars=new chars1024t;

}

Acest constructor initializeaza stream-ul pentru conversia caracter-la-octet conform cu regulile specifice codificarii caracterelor. Este o referinta la Reader folosita pentru a citi in reader, se seteaza OutputStreamWriter writer conectata la ByteArrayOutputStream byteArrayOut folosind regulile codificarii si apoi se aloca buffer-ul de caractere:chars.

public ReaderInputStream(Reader reader,String encoding)

throws UnsupportedEncodingException

{

this.reader = reader;

byteArrayOut = new ByteArrayOutputStream();

writer=new OutputStreamWriter(byteArrayOut,encoding);

chars=new chars1024t;

}

Acest constructor initializeaza stream-ul pentru conversia caracter-la-octet conform cu caracterele specifice codificarii, encoding. Se executa acelasi setup (instalare) ca inainte, dar cu caractere specifice.

public int read()throws IOException

{

if (index >= length)

fillBuffer();

if (index >=length)

return –1;

return 0xff & buffersindex++t;

}

//public void fillBuffer() throws IOException…

Aceasta metoda citeste un sigur octet. Daca buffer-ul intern este gol, se apeleaza fillBuffer() pentru al umple.Daca si dupa acest lucru, buffer-ul este tot gol atunci se ajunge la EOF si se returneaza -1. Altfel se returneaza un octet din buffer.

protected void fillBuffer() throws IOException

{

if (length < 0)

return;

int numChars = reader.read(chars);

if (numChars < 0)

{

length = -1;

}

else

{

byteArrayOut.reset();

writer.write(chars,0,numChars);

writer.flush();

buffer = byteArrayOut.toByteArray();

length = buffer.length;

index = 0;

}

}

Aceasta metoda umple buffer-ul intern cu date de la reader. Daca length este mai mica decat zero atunci s-a ajuns la EOF sI deci se returneaza imediat. Altfel se citesc caractere in buffer-ul intern, se scriu acestea in writer, se extrag octetii rezultati din byteArrayOut si apoi se redesemneaza conditia interna pentru a citi din noul buffer.

public int read(bytest data,int off,int len)

throws IOException

{

if (index >= length)

{

fillBuffer();

return –1;

}

int amount = Math.min(len,length – index);

System.arraycopy(buffer,index,data,off,amount);

index +=amount;

return amount;

}

Aceasta metoda citeste un subvector de octeti. Se va reumple buffer-ul intern, daca este necesar si apoi se copie cat se poate de multi octeti din acest buffer in vectorul destinat.

public int available()throws IOException

{

return (index<lentgh ? length – index :

((length >=0)&&reader.ready()) ? 1 :0;

}

Aceasta metoda returneaza numarul octetilor disponibili pentru citirea din acest stream: daca buffer-ul nu este gol, atunci se returneaza numarul octetilor; altfel daca nu s-a ajuns inca la EOF si reader are date disponibile, atunci se returneaza 1; altfel, 0.

public void close()throws IOException

{

reader.close();

}

Aceasta metoda inchide acest stream inchizand reader.

13.4.Clasa RawFingerURLStreamHandler

Aceasta clasa este o clasa URLSreamHandler care va fi returnata de clasa URLStreamHandlerFactory ca raspuns la protocolul rawfinger. Aceasta clasa este mai complexa decat clasa FingerURLStreamHandler deoarece suporta URL-urile nestandarde cu sintaxa finger conventionala:

rawfinger:[anonimizat] rawfinger:@[anonimizat]#verbose

Aceste doua URL-uri au exact aceeasi insemnatate ca inainte, dar folosesc noua sintaxa.

import java.io.*;

import java.net.*;

import java.util.*;

public class RawFingerURLStreamHandler

extends URLStreamHandler

{

//protected void parseURL

(URL url,String spec, int start,int limit)…

//protected String toExternalform(URL url)…

//protected URLConnection openConnection(URL url)

throws IOException…

}

Se implementeaza metoda parseURL() pentru a analiza un URL de la finger descris textual din URL-ul :url, si metoda toExternalForm() care executa procesul invers. De asemenea se furnizeaza o metoda openConnection() care creaza o URLConnection corespunzatoare.

protected void parseURL( URL url,String spec,

int start,int limit)

{

String query = spec.substring(start,limit);

int at = query.lastIndexOf(“@”0);

String user = (at>-1)?query.substring(0,at):query;

String buffer revUser = new StringBuffer();

StringTokenizer t= new StringTokenizer(user,”@”,true);

while (t.hasMoreTokens())

revUser.insert(0,t.nextToken().replace(‘@’,’/’);

revUser.insert(0,’/’);

String location=(at>-1)?query.substring(at+1):””;

int colon = location.indexOf(“:”);

int port= ((colon>-1)&&(colon<location.length()-1) ?

Integer.parseInt(location.substring(colon + 1):-1;

String host=(colon >-1)? location.substriong(colon+1):

location;

setURL(url,url.getProtocol(),host,port,

revUser.toString(),url.getRef());

}

~n metoda parseURL(), trebuie sa se imparta URL-ul textual ,spec, intr-un URL,url. Se extrage subsirul relevant in variabila query si se diseaca in aceeasi maniera ca la clientul finger original. Se converteste sintaxa conventionala finger-style in noul stil URL si se apeleaza metoda setURL() pentru a insera partile disecate in variabila url.

De exemplu, daca user-ul introduce un URL de forma rawfinger: merlin@[anonimizat]:79#verbose, aceasta metoda va fi apelata cu subsirul merlin@[anonimizat]:79. Se extrage host-ul , firewall.nitric. com; portul, 79,si fisierul, merlin@internal, care se inverseaza pentru a fi internal/merlin. URL-ul rezultat este intern reprezentat ca rawfinger://firewall.nitric. com:79/internal/merlin, compatibil cu clasa FingerURLConnection.

protected String toExternalForm(URL url)

{

StringBuffer result = new StringBuffer();

String file = url.getfile().substring(1);

StringTokenizer files = new

StringTokenizer(file,”/”,true);

while (files.hasMoreTokens())

result.insert(0,files.nextToken().replace(‘/’,’@’);

result.insert(0,’:’).insert(0,url.getProtocol ());

if ((url.gethost().length() >0) ||

(url.getport() != -1))

result.append(‘@’);

result.append(url.getHost());

if (url.getPort() != -1)

result.append (‘:’).append(url.getPort());t

if (url.getRef() != null)

result.append(‘#’).append(url.getRef());

return result.toString();

}

Metoda toExternalForm() executa procesul invers ,convertind URL-ul url din formatul intern intr-o forma finger textuala standarda folosind StringBuffer result pentru a acumula rezultatul.

protected URLConnection openConnection(URL url)

throws IOException

{

return new FingerURLConnection(url);

Metoda openConnection() returneaza a noua FingerURLConnection conectata la URL-ul specificat ,url. Campurile interne ale URL-ului sunt configurate de metoda parseURL() pentru a fi corespunzatoare la prelucrarea acestora de aceasta clasa.

Pentru a vedea aceste exemple in actiune, se poate testa simplu URL-urile finger si rawfinger folosind clasa PageViewer cu care se testeaza cadrul text-plain HTTP.

14.Clasa URLEncoder

Clasa URLEncoder este utila pentru codificarea datelor in format x-www-forma-url codificat; acesta este formatul pe care serverele Web asteapta sa formeze date pentru codificare, si astfel o conversie de care este adesea nevoie pentru accesarea resurselor de pe Web.

14.1.Metode statice

Aceasta clasa furnizeaza toate functiile ei printr-o singura metoda statica.

String encode (String decoded)

Aceasta metoda returneaza String-ul specificat: decoded, codificat dupa standardele urmatoare:

Caracterele alfanumerice(A-Z,a-z,0-9),minus,underscore,perioada sI asterisk sunt neschimbate la stanga; spatiu este inlocuit cu simbolul plus(+); toate celelalte caractere sunt inlocuite de trei caractere codificate %xy unde xy sunt doua cifre cu majuscule codificate de codul caracterelor ASCII(0..9 A..D). De exemplu caracterul ! (caracter ASCII –33) este codificat ca %21.

Trebuie notat, caracterele Unicode din String sunt convertite in octetI , prioritar la codificarea hex, cu ajutorul stream-urilor de caractere folosind regulile codificarii caracter-octet. ~n general aceasta codificare inseamna codificarea Latin1; caracterele standard vor fi codificate corect iar cele nereprezentabile vor fi codificate ca un semn de intrebare.

15.Clasa URLDecoder

Clasa URLDecoder este utila pentru decodificarea datelor din format x-www-forma-url codificat; acesta este formatul pe care serverele Web asteapta ca datele sa fie codificate, si astfel o conversie de care este adesea nevoie pentru implementarea facilitatilor server-ului Web.

15.1.Metode statice

Aceasta clasa furnizeaza toate functiile ei printr-o singura metoda statica.

String decode (String encoded)

Aceasta metoda returneaza String-ul specificat : encoded,decodificat dupa standardele urmatoare:

Simbolul plus este inlocuit cu spatiu; toate succesiunile %xy sunt inlocuite de caractere rezultate din decodificarea hexa a lui xy, sI celelalte caractere sunt neschimbate la stanga. De exemplu, hello%2c+world%21 este decodificata in hello world!

Trebuie notat ca ,decodificarea stream-urilor de octetI se converteste la un String folosind regulile codificarii octet-caracter. ~n general aceasta codificare inseamna codificarea Latin1; atentie ar trebui sa fie unde aceasta nu este adevarata.

16.Concluzie

Clasele URL prezentate furnizeaza un cadru pentru accesarea usoara a datelor sI decodificarea lor in sisteme de informatii ca Web-ul sau un fisier sistem. Folosirea acestor clase este relativ usoara si noile protocoale si tipuri sunt complet suportate, facându-le în cel mai înalt grad de o capacitate puternica in Java.

Avantajul adaugarii de protocoale si tipuri la acest cadru este ca in aplicatii se poate folosi o interfata standard simpla pentru a accesa orice obiect adresabil. Metoda getContent() executa toate protocoalele si continuturile specifice actiunii necesara pentru a descarca sI decodifica obiectele referite; alternativ, getInputStream poate fi folosita pentru continutul decodificat. JDK-ul furnizeaza suport pentru cele mai multe protocoale standard, astfel cele mai multe date comune de care sunt nevoi sunt disponibile imediat fara a necesita o implementare existenta.

17.Aplicatia – Utilitar adrese Internet

Internetul este o uriasa retea de calculatoare la care oricine îsi poate conecta propriul calculator. Internetul este, de asemenea, o vasta comunitate de oameni care se conecteaza la retea. De aceea fiecare utilizator al Internetului doreste sa aiba acces la multe informatii de pe Web si astfel sa poata exploata multitudinea domeniilor care sunt prezentate. Aplicatia reprezinta un ajutor pentru cei care doresc sa navigheze pe Internet. Se pot cauta informatii folosind motoare de cautare si deasemenea se pot accesa site-uri din diferite domenii. Implementarea acestui program este in limbajul Java ca o aplicatie a unor clase, metode, constructori care au fost prezenate in partea teoretica. ~n continuare este prezentat codul sursa impreuna cu explicatiile aferente.

Pentru inceput se importa bibliotecile(pachetele) necesare pentru functionarea programului:

import java.applet.*;

import java.awt.*;

import java.awt.event.*;

import java.net.URL;

import java.net.MalformedURLException;

import java.io.*;

Clasa principala care este extinsa la Applet-ul care este creat; se implementeaza un ascultator pentru evenimentele specifice si se implementeaza interfata de ascultator pentru primirea evenimentelor articol. Apoi se declara variabilele folosite in acest program , sunt de tip private pentru a preveni folosirea de metode ale altor clase.

public class proiect extends Applet implements ActionListener, ItemListener

{

private CheckboxGroup checkGroup;

private Checkbox am, nz,educatie, universitati, mp3, news, sport, divertisment, motoare;

private Choice choice, altChoice;

private Button goButton, credit, inapoi;

private TextField optiuniField;

private boolean textField = false, ch = false, start = false, primaPagina = true;;

//textField daca optiuniField este sau nu adaugat

private final int distantaY = 30, startX = 300, startY = 50, distantaX = 120;

private fir f;

private fir1 altFir;

private Color back, font;

Metoda init() va fi apelata automat de catre sistem, pentru crearea ecranului initial. Pentru inceput se seteaza fontul pentru applet apoi se vor defini culorile care se folosesc (background si culoarea de scriere) , apoi initializam CheckboxGroup – grupuri de cutii de verificare – mai bine spus se creaza un obiect al acestei clase dupa care se creaza obiecte ale clasei Checkbox setand backgound-ul, foreground-ul fiecarui obiect, apoi se adauga la cutia de ascultator si deasemenea se adauga fiecare la proiectul ecran.

public void init()

{

// setez fontul pentru applet

setFont(new Font("Tahome", 0, 14));

setLayout(null);

// culoarea folosita la backgroud

back = new Color(22, 5, 103);

//culoarea cu care scriu

font = new Color(215, 215, 0);

// initializare CheckboxGroup

checkGroup = new CheckboxGroup();

// initializare Checkbox-uri

am = new Checkbox("WWW A-M", checkGroup, false);

am.setBackground(back);

am.setForeground(font);

am.addItemListener(this);

add(am);

am.reshape(startX, startY, 100, distantaY);

nz = new Checkbox("WWW N-Z", checkGroup, false);

nz.setBackground(back);

nz.setForeground(font);

nz.addItemListener(this);

add(nz);

nz.reshape(startX, startY + distantaY, 100, distantaY);

educatie = new Checkbox("Educatie", checkGroup, false);

educatie.setBackground(back);

educatie.setForeground(font);

educatie.addItemListener(this);

add(educatie);

educatie.reshape(startX, startY + distantaY * 2, 100, distantaY);

universitati = new Checkbox("Universitati", checkGroup, false);

universitati.setBackground(back);

universitati.setForeground(font);

universitati.addItemListener(this);

add(universitati);

universitati.reshape(startX + distantaX, startY, 100, distantaY);

mp3 = new Checkbox("MP3", checkGroup, false);

mp3.setBackground(back);

mp3.setForeground(font);

mp3.addItemListener(this);

add(mp3);

mp3.reshape(startX + distantaX, startY + distantaY, 100, distantaY);

news = new Checkbox("Mass-Media", checkGroup, false);

news.setBackground(back);

news.setForeground(font);

news.addItemListener(this);

add(news);

news.reshape(startX + distantaX, startY + distantaY * 2, 100, distantaY);

sport = new Checkbox("Sport", checkGroup, false);

sport.setBackground(back);

sport.setForeground(font);

sport.addItemListener(this);

add(sport);

sport.reshape(startX + distantaX * 2, startY, 100, distantaY);

divertisment = new Checkbox("Divertisment", checkGroup, false);

divertisment.setBackground(back);

divertisment.setForeground(font);

divertisment.addItemListener(this);

add(divertisment);

divertisment.reshape(startX + distantaX * 2, startY + distantaY, 100, distantaY);

motoare = new Checkbox("Motoare de cautare", checkGroup, false);

motoare.setBackground(back);

motoare.setForeground(font);

motoare.addItemListener(this);

add(motoare);

motoare.reshape(startX + distantaX * 2, startY + distantaY * 2, distantaX + 25, distantaY);

// initializare Choice choice

choice = new Choice();

choice.addItemListener(this);

choice.setBackground(Color.gray);

choice.reshape(startX – 280, startY, distantaX * 2, distantaY);

add(choice);

Se creaza butoane, se adauga la fereastra curenta si se vor inregistra ca ascultatoare de evenimente:

// initializare Button goButton

goButton = new Button("Cauta");

goButton.addActionListener(this);

goButton.setFont(new Font("Courier", Font.BOLD, 24));

goButton.reshape(startX – 200, startY + distantaY * 4, distantaX * 2, distantaY);

add(goButton);

// initializare credit

credit = new Button("Despre");

credit.addActionListener(this);

credit.setFont(new Font("Courier", Font.BOLD, 24));

credit.reshape(startX + 100, startY + distantaY * 4, distantaX * 2, distantaY);

add(credit);

// initializare Button inapoi

inapoi = new Button("Inapoi");

inapoi.addActionListener(this);

inapoi.setFont(new Font("Courier", Font.BOLD, 24));

inapoi.reshape(startX – 50, startY + distantaY * 7, distantaX * 2, distantaY);

Se creaza alta cutie de verificare ; variabila ch de tip boolean are valoarea true daca altChoice este adaugat in applet, si se seteaza pozitia initiala pe “educatie”

// initializare Choice altChoice

altChoice = new Choice();

altChoice.addItemListener(this);

altChoice.setBackground(Color.gray);

altChoice.reshape(startX – 280, startY + distantaY * 2, distantaX * 2, distantaY);

add(altChoice);

ch = true;

// setare pozitia initiala pe educatie

educatie.setState(true);

educatie.setForeground(Color.red);

adaugareChoice("educatie.txt", 0);

}

Urmatoarea metoda va initializa cutia de alegere , apoi se creaza un obiect URL si un obiect fisier creat dintr-un stream de date care foloseste la citirea datelor din fisierul numeFisier , se citeste cat timp nu este sfarsit de fisier si se adauga la proiectul ecran

private void initializareAltChoice(String numeFisier)

{

URL url;

DataInputStream fisier;

String linie;

numeFisier = getCodeBase() + numeFisier;

altChoice.removeAll();

try

{

url = new URL(numeFisier);

fisier = new DataInputStream(url.openStream());

while ((linie = fisier.readLine()) != null)

{

if (linie.length() > 0)

altChoice.add(linie);

linie = fisier.readLine();

}

fisier.close();

}

catch(IOException e)

{

Graphics g = getGraphics();

g.drawString("Eroare: " + e.toString(), 10, 10);

}

}

Urmatoarea metoda are doi parametrii:

– numeFisier – numele fisierului din care se va citi lista

– test cu urmatoarea semnificatie:

daca test = 0 se adauga toate siturile din fisier

daca test = 1 se adauga pana la litera m inclusiv

daca test = 2 se adauga de la litera n pana la litera z

Se adauga in cutia de alegere datele in functie de valoarea lui test

private void adaugareChoice(String numeFisier, int test)

{

DataInputStream fisier;

String linie, nume;

URL url;

if (textField)

{

remove(optiuniField);

textField = false;

}

if (!ch)

{

altChoice = new Choice();

altChoice.addItemListener(this);

altChoice.setBackground(Color.gray);

altChoice.reshape(startX – 280, startY + distantaY * 2, distantaX * 2, distantaY);

add(altChoice);

ch = true;

}

numeFisier = getCodeBase() + numeFisier;

try

{

url = new URL(numeFisier);

fisier = new DataInputStream(url.openStream());

linie = fisier.readLine();

if (linie.length() > 0)

if (test == 0)

choice.add(linie);

if (linie.length() > 0)

if (test == 1 && linie.toUpperCase().charAt(0) >= 'A' && linie.toUpperCase().charAt(0) < 'N')

choice.add(linie);

if (linie.length() > 0)

if (test == 2 && linie.toUpperCase().charAt(0) >= 'N' && linie.toUpperCase().charAt(0) <= 'Z')

choice.add(linie);

while ((linie = fisier.readLine()) != null)

{

if (test == 0 && linie.length() > 0)

choice.add(linie);

if (linie.length() > 0)

if (test == 1 && linie.toUpperCase().charAt(0) >= 'A' && linie.toUpperCase().charAt(0) < 'N')

choice.add(linie);

if (linie.length() > 0)

if (test == 2 && linie.toUpperCase().charAt(0) >= 'N' && linie.toUpperCase().charAt(0) <= 'Z')

choice.add(linie);

}

fisier.close();

// choice.getItemCount() – returneaza numarul de elemente din lista

if (choice.getItemCount() > 0)

{

nume = choice.getItem(0);

// getItem(x) returneaza al x -lea element din lista

initializareAltChoice(nume + ".txt");

}

}

catch(IOException e)

{

Graphics g = getGraphics();

g.drawString("Eroare: " + e.toString(), 10, 10);

}

}

Se creaza un textField. Daca variabila ch este true atunci inlaturam cutia altchoice si se va inlocui cu textfieldul creat, apoi numefisier va fi adresa de unde ruleaza applet-ul plus fisierul unde avem datele care vor folosi la crearea unui stream de intrare pentru citirea datelor din stream si adaugarea lor la proiectul ecran.

private void adaugareChoiceCuTextField(String numeFisier)

{

DataInputStream fisier;

String linie;

URL url;

if (ch)

{

remove(altChoice);

ch = false;

}

if (!textField)

{

optiuniField = new TextField(20);

optiuniField.setBackground(Color.gray);

optiuniField.reshape(startX – 280, startY + distantaY * 2, distantaX * 2, distantaY – 8);

add(optiuniField);

textField = true;

}

numeFisier = getCodeBase() + numeFisier;

try

{

url = new URL(numeFisier);

fisier = new DataInputStream(url.openStream());

while ((linie = fisier.readLine()) != null)

{

choice.add(linie);

linie = fisier.readLine();

}

fisier.close();

}

catch(IOException e)

{

Graphics g = getGraphics();

g.drawString("Eroare: " + e.toString(), 10, 10);

}

}

Acesta metoda va realiza apasarea unui buton. Daca se apasa butonul cauta se verifica daca avem cutie de alegere (choice) si se va crea nume fisier care este fisierul cu extensia .txt corespunzator articolului selectat din aceasta cutie. Variabila de tip string cautat va lua valoarea articolului corespunzator selectata din cealalta cutie (altCoiche) . Se va citi din fisier si cand linia citita corespunde cu variabila cautat atunci va rezulta adresa la care se vrea sa se faca conectarea. Daca nu este cutie de alegere atunci va fi un textField; se verifica daca se scrie ceva in acest textfield si adresa la care se face conectarea va fi formata din linia corespunzatoare din fisier plus textField-ul. Daca avem adresa (nu avem nici o exceptie) atunci se cere browser-ului sa arate pagina Web indicata de argumentul url care este un obiect URL

public void actionPerformed(ActionEvent e)

{

URL url;

String opt, adresa = "", numeFisier, linie, cautat;

DataInputStream fisier;

boolean v = true;

String optiune;

int i;

if (e.getSource() == goButton)

{

if (ch)

{

numeFisier = choice.getSelectedItem() + ".txt";

numeFisier = getCodeBase() + numeFisier;

cautat = altChoice.getSelectedItem();

try

{

url = new URL(numeFisier);

fisier = new DataInputStream(url.openStream());

while (!(linie = fisier.readLine()).equals(cautat));

adresa = fisier.readLine();

System.out.println(adresa);

fisier.close();

}

catch(IOException ex)

{

Graphics g = getGraphics();

g.drawString("Eroare: " + ex.toString(), 10, 10);

}

}

else

{

numeFisier = "";

//daca suntem In motoare

if (motoare.getState())

numeFisier = "motoare.txt";

numeFisier = getCodeBase() + numeFisier;

cautat = choice.getSelectedItem();

try

{

url = new URL(numeFisier);

fisier = new DataInputStream(url.openStream());

while (!(linie = fisier.readLine()).equals(cautat));

adresa = fisier.readLine();

fisier.close();

//verificam daca scriem ceva in Textfield

if (optiuniField.getText().length() == 0)

{

System.out.println("Eroare: nu am argumente: ");

v = false;

}

optiune = optiuniField.getText();

adresa = adresa + optiune.replace(' ', '+');

}

catch(IOException ex)

{

Graphics g = getGraphics();

g.drawString("Eroare: " + ex.toString(), 10, 10);

}

}

//daca avem adresa

if (v)

{

try

{

url = new URL(adresa);

getAppletContext().showDocument(url,"_blank");

}

catch(MalformedURLException ex)

{

System.out.println("Eroare " + ex.toString());

}

}

}

Daca s-a ales butonul despre se vor sterge toate obiectele de pe ecran se va agauga butonul Inapoi si se va porni firul de executie instantiat.

if (e.getSource() == credit)

{

primaPagina = false;

// daca primaPagina = true inseamna ca sunt la prima pagina

removeAll();

repaint();

add(inapoi);

f.suspend();

altFir = new fir1(getGraphics(), font);

altFir.start();

}

if (e.getSource() == inapoi)

{

removeAll();

primaPagina = true;

add(credit);

add(goButton);

ch = true;

textField = false;

add(choice);

add(altChoice);

educatie.setState(true);

educatie.setForeground(Color.red);

adaugareChoice("educatie.txt", 0);

add(am);

add(nz);

add(educatie);

add(universitati);

add(mp3);

add(news);

add(sport);

add(divertisment);

add(motoare);

repaint();

f.resume();

//repornesc thread oprit cu suspend

altFir.stop();

}

}

Prin folosirea acestei metode se va stii cand se modifica checkBox-urile sau listele

public void itemStateChanged(ItemEvent e)

{

if (e.getSource() == choice && ch)

{

altChoice.removeAll();

initializareAltChoice(choice.getSelectedItem() + ".txt");

}

if (e.getSource() == nz)

{

choice.removeAll();

nz.setForeground(Color.red);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("educatie.txt", 2);

adaugareChoice("universitati.txt", 2);

adaugareChoice("mp3.txt", 2);

adaugareChoice("news.txt", 2);

adaugareChoice("sport.txt", 2);

adaugareChoice("divertisment.txt", 2);

}

if (e.getSource() == am)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(Color.red);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("educatie.txt", 1);

adaugareChoice("mp3.txt", 1);

adaugareChoice("news.txt", 1);

adaugareChoice("universitati.txt", 1);

adaugareChoice("sport.txt", 1);

adaugareChoice("divertisment.txt", 1);

}

if (e.getSource() == educatie)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(Color.red);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("educatie.txt", 0);

}

if (e.getSource() == universitati)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(Color.red);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("universitati.txt", 0);

}

if (e.getSource() == mp3)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(Color.red);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("mp3.txt", 0);

}

if (e.getSource() == news)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(Color.red);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("news.txt", 0);

}

if (e.getSource() == sport)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(Color.red);

divertisment.setForeground(font);

motoare.setForeground(font);

adaugareChoice("sport.txt", 0);

}

if (e.getSource() == divertisment)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(Color.red);

motoare.setForeground(font);

adaugareChoice("divertisment.txt", 0);

}

if (e.getSource() == motoare)

{

choice.removeAll();

nz.setForeground(font);

am.setForeground(font);

educatie.setForeground(font);

universitati.setForeground(font);

mp3.setForeground(font);

news.setForeground(font);

sport.setForeground(font);

divertisment.setForeground(font);

motoare.setForeground(Color.red);

adaugareChoiceCuTextField("motoare.txt");

}

}

Urmatoarea metoda este apelata de applet; se refera la ecranul grafic

public void paint(Graphics g)

{

if (primaPagina)

{

g.setColor(back);

g.fillRect(0, 0, 710, 250);

g.setColor(Color.black);

g.fillRect(0, 250, 710, 50);

g.setColor(Color.red);

g.drawRect(startX – 10, startY – 10, distantaX * 3 + 45, distantaY * 3 + 10);

g.setColor(font);

if (!start)

{

f = new fir(getGraphics(), font);

f.start();

start = true;

}

}

else

{

g.setColor(back);

g.fillRect(0, 0, 710, 250);

g.setColor(Color.black);

g.fillRect(0, 250, 710, 50);

}

}

}

Urmatoarea clasa este o clasa derivata din clasa Thread si va avea ca rezultat un fir de executie care misca scrisul in partea de jos a ecranului.

class fir extends Thread

{

private Graphics g;

private Color font;

public fir(Graphics g, Color font)

{

this.g = g;

this.font = font;

}

public void run()

{

int i, start;

Font f;

boolean v = true;

f = new Font("Courier", Font.BOLD, 24);

g.setFont(f);

while (v)

{

for (i = 710; i > – 620; i -= 2)

{

g.setColor(font);

g.drawString("Proiect de diploma – Utilitar adrese Internet", i, 280);

try

{

Thread.sleep(30);

}

catch(InterruptedException e)

{

stop();

v = false;

System.out.println("Eroare: " + e.toString());

}

g.setColor(Color.black);

g.drawString("Proiect de diploma – Utilitar adrese Internet", i, 280);

}

}

}

}

Aceasta clasa reprezinta deasemenea o clasa derivata din clasa Thread sI va avea ca rezultat un fir de executie care va afisa scrisul sI-l va misca atunci cand se va apasa butonul Despre

class fir1 extends Thread

{

private Graphics g;

private Color font;

private Stringst text = new Strings10t;

private int n = -1, j;

public fir1(Graphics g, Color font)

{

this.g = g;

this.font = font;

init();

}

private void init()

{

texts0t = "PROIECT DE DIPLOMA";

texts1t = "––––––––-";

texts2t = "HURJUI GHEORGHE";

texts3t = "Coordonator";

texts4t = "";

texts5t = "Lect.Dr.Stefan Andrei";

texts6t = "Cautare pe Internet";

texts7t = " si ";

texts8t = " ateva adrese utile care ofera diferite servicii si informatii";

texts9t = "Iunie 2001";

n = 10;

}

public void run()

{

int i, start, dim = 14;

Font f;

boolean v = true;

f = new Font("Courier", Font.BOLD, 20);

g.setFont(f);

while (v)

{

for (i = 240; i > – 20 * n; i -= 2)

{

g.setColor(font);

for (j = 0; j < n; j++)

if (i + j * 25 < 240)

{

start = 350 – (textsjt.length() * dim / 2);

g.drawString(textsjt, start, i + j * 25);

}

try

{

Thread.sleep(50);

}

catch(InterruptedException e)

{

stop();

v = false;

System.out.println("Eroare: " + e.toString());

}

g.setColor(new Color(22, 5, 103));

for (j = 0; j < n; j++)

if (i + j * 25 < 240)

{

start = 350 – (textsjt.length() * dim / 2);

g.drawString(textsjt, start, i + j * 25);

}

}

}

}

}

Codul pentru fisierul HTML care reprezinta applet-ul:

<html>

<body background="background.gif">

<center>

&nbsp;<p>&nbsp;</p>

<p>

<applet codebase="." code="proiect.class" width=710 height=300 align="center">

</applet> </p>

</center>

</body>

</html>

Similar Posts