IPRO - PC Magazine Romania, Octombrie 2003
SOLUŢII PENTRU PROGRAMATORII ŞI DESIGNERII WEB
Implementarea aplicaţiilor web profesionale
Tehnologia Java Servlets
Mircea Scărlătescu
Dacă în numărul trecut am discutat generalităţi ale lucrului cu tehnologia Java Servlets, începând de la nevoia adaptării Web-ului la mediul de afaceri, şi până la paşii necesari pentru implementarea unui Servlet, a sosit timpul să discutăm un exemplu concret de Servleti, care să te ajute în învaţarea acestei.
Dacă ar fi să facem un tur al câtorva pagini Web, am observa cu mare usurinţă faptul că (practic) nici un sit nu mai este conceput fără interacţiunea utilizatorii. Astfel, pe orice pagină vei găsi măcar un formular de contact, un sistem de rating al conţinutului pe care-l vizionezi (sau studiezi), un sistem de newsletter care sa te ţină la curent cu noutăţile de pe un sit. Toate aceste lucruri sunt realizate cu ajutorul formularelor HTML. Ţinând cont de acest lucru, cred că este interesant să vedem cum ne ajută tehnologia Java Servlets să prelucrăm datele pe care un utilizator le trimite către un server Web, prin intermediul formularelor HTML.
Un formular reprezintă o serie de câmpuri de tip text, listă, checkbox-uri, butoane radio, etc care ajută la colectarea de la utilizartor a anumitor date, şi le poate trimite (prin HTTP) către un server Web ce urmează să le prelucreze.
Cum prelucrăm datele trimise prin intermediul unui formular HTML cu ajutorul unui servlet reprezintă tema exemplului care urmează. Să luăm un sistem care trebuie să memoreze datele unor utilizatori ai unui sit Web, date ce urmează să fie folosit ulterior pentru diferite activităţi de promovare, sau statistice. Deci să considerăm că un utilizator trebuie să furnizeze pe situl nostru numele, prenumele, adresa, e-mail-ul, numărul de telefon, oraşul şi în sfârşit data naşterii pentru a fi înscris într-o bază de date. Câţi dintre noi nu au fost puşi într-o asemenea situaţie atunci când navigăm pe diferite situri? Iată că a venit vremea să vedem ce se întamplă şi în spatele frazelor de genul: "Vă mulţumim pentru înscriere, datele dumneavoastră au fost înregistrate" J.
Primul pas este să realizăm pagina HTML care să conţină formularul nostru, care va colecta datele precizate mai sus. Iată o variantă de rezolvare:
Pagina HTML de mai sus conţine pe lângă formularul în sine, delimitat de tag-ul <form>...</form> şi scripturi de validare a datelor ce sunt transmise. Astfel, se verifică dacă toate câmpurile sunt completate de către utilizator, de asemenea, câmpurile zi, lună şi an ale datei naşterii să fie de tip numeric, iar adresa de e-mail completată să fie de tipul eu@server.domeniu. Aceste verificari pot fi realizate şi de servletul pe care-l ce urmează, dar diferenţa este însă că în cazul 2, datele ar pleca către server, ar fi analizate, s-ar detecta eventualele erori, după care serverul ar trimite mesaje de eroare către client, acesta ar fi obligat să retrimită datele, generând astfel trafic în reţea suplimentar, fără ca acesta să ajute de fapt la îndeplinirea scopului final, de prelucrare pe server a datelor. JavaScript rezolvă problema mult mai elegant, eliminând neajunsurile prezentate mai sus. De foarte multe ori însă, aceste validări de date se realizează parţial la client (prin JavaScript de exemplu) dar şi la server, pentru că unele date nu pot fi verificate decât după transmiterea lor prin formular. Un exemplu clasic ar fi alegerea unui cont de e-mail pe un server, alegerea pe care o face utilizatorul din punctul de vedere al numelui fiind verificată de scriptul de prelucrare, pentru a nu fi deja rezervat acel nume de o altă persoană. În acest caz, JavaScript nu ajută cu nimic la acest proces. Pagina de mai sus nu conţine alte elemente dificile, fiind necesare doar cunoştinţe minime de HTML pentru a înţelege semnificaţia codului de mai sus.
O dată ce am creat formularul nostru, e timpul să scriem şi servlet-ul care va procesa datele introduse. Pentru aceasta, trebuie să fim siguri că avem instalată platforma Java, de asemenea un server Web Java Enabled şi un editor de text. O posibilă platformă, folosită pentru dezvoltarea exemplului nostru este: Mandrake Linux 9.1, server Tomcat şi un editor de text, să spunem gedit (rulăm şi interfaţa grafică GNOME 2, prezentă în distribuţia Linux prezentată mai sus). Pentru instalarea server-ului Tomcat, poţi descărca pachetul JavaWebServicesDeveloperPack, de pe situl java.sun.com. Platforma Java folosită este versiunea 1.4 (disponibilă şi ea pe acelaşi sit). Pentru a fi siguri că sunteti gata de lucru, după pornirea server-ului Tomcat, deschide un browser Web (Mozilla, Opera, şi altele disponibile în Linux) şi introduceţi URL-ul: localhost:8080. Dacă pagina de start Tomcat apare pe ecran, atunci, începi să devii dezvoltator de servleţi Java J
Să scriem acum codul sursă al servletului care va prelua datele introduse prin formularul de mai sus.
Primul rând al sursei este cel care declară clasa următoare ca fiind parte a pachetului numit PCMagazineServlets; unde conceptul de pachet poate fi explicat ca o serie de clase care fac parte din aceeaşi sferă de aplicabilitate, şi care sunt grupate pentru o mai usoară identificare şi folosire. Orice limbaj care foloseste programarea orientată obiect prezintă această facilitate. Clasa readUserData este clasa pe care o scriem pentru a implementa scriptul ce va prelucra datele introduse. Ea extinde httpServlet pentru ca orice clasă care implementeaza un servlet, trebuie sa fie extinsă din ea (extinderea clasei httpServlet reprezintă de fapt implementarea unui serlvet http).
În cadrul clasei definite de noi, implementăm două metode, metode care de fapt suprascriu metodele cu acelasi nume din clasa părinte´, httpServlet. Cele două metode, sunt cele responsabile cu prelucrarea a două fluxuri de date ce vin dinspre client: fluxul ce aduce datele prin metoda GET, respectiv POST. Aceste două metode reprezintă două moduri de a transmite datele dintr-un formular HTML. Metoda POST este cea mai folosită, în special pentru că nu are limitare de dimensiune (la GET se pot transmite maxim 1k de date), dar şi din motive de securitate. Astfel, prin GET, la URL-ul adresei pe care o accesăm se adaugă şi datele completate (acestea devin vizibile), ceea ce în cazul unor date sensibile, precum parole, serii de carduri etc. nu este recomandabil. În cazul nostru, pentru că folosim metoda POST (<form name="preluare _date" method="post" ...>) în cadrul metodei doPost vom realiza prelucrarea datelor primite de script.
Prima linie a metodei este cea care stabileste că răspunsul ce se va trimite către client va fi de tip HTML: raspuns .setContentType("text/html");
Această setare este folositoare pentru cazurile în care dorim să întoarcem ca raspuns fişiere de diferite tipuri (zip, gzip, etc.);
PrintWriter out = raspuns.get Writer(); stabileşte fluxul de iesire către client, pe această cale de comunicaţie se va transmite raspunsul către client, în cazul nostru în format HTML.
Scrierea raspunsului (împreună cu formatarea HTML) se face în liniile ce urmează, care nu fac altceva decât să construiască o pagină dinamică, cu parametrii introduşi de utilizatori. O atenţie deosebită merită funcţia: .getParameter(nume_camp) care extrage din datele venite de la client valoarea câmpului denumit nume_câmp şi o întoarce catre o variabilă. De remarcat că această metodă aparţine unui obiect de tip HttpServletRequest. Cei dintre dumneavoastră care sunt familiari cu programarea CGI vor remarca cât de usor obţinem valorile introduse în formular, în timp ce prin metodele clasice (şi demodate) ale programării CGI se cereau metode relativ dificile de aducere a variabilelor către script, prin decodare a formatului MIME etc.
În exemplul de mai sus metoda doGet este lasată vidă, pentru că se ştie (din modul de implementare a aplicaţiei) că nu vom primi date prin GET. O variantă de implementare însă presupune rescrierea metodei după cum urmează:
public void doGet(
HttpServletrequest cerere,
HttpServletResponse raspuns)
throws ServletException,
IOException {doPost(cerere,
raspuns)};
Acestă modalitate face ca singurele date ce sunt luate în considerare de către script, să fie cele transmise prin POST, pentru că metoda doPost se va executa indiferent de tipul datelor ce vin către script. Această a doua variantă este cea care este mai indicată (este mai riguroasă din punctul de vedere al programării)
Odată ce această mică aplicaţie este instalată şi rulată pe serverul Tomcat, ea functionează ca un program de tip echo´, care retipăreşte datele introduse de către utilizator. De remarcat însă că de obicei aplicaţiile realizează prelucrări deosebit de complexe asupra datelor de intrare, începând de la diferite calcule, şi până la operaţii complexe cu baze de date si alte servere dedicate. Chiar şi comunicaţia între mai multe servleturi este posibilă, iar datele pot fi reutilizate. Astfel, toate pachetele Java care sunt disponibile în mod normal pentru programe stand-alone devin gata de utilizare şi în programarea Web.
Exemplul de mai sus are un caracter didactic, iar gradul său de complexitate şi dificultate este relativ redus. El însă scoate în evidenţă uşurinţa cu care se poate programa o aplicaţie Web, şi relativa usurintă cu care un programator Java poate trece la programarea Web cu ajutorul Servletlor. E de precizat însă că o aplicaţie profesională va include şi o serie de aspecte care la prima vedere nu sunt luate în calcul, de la viteza de răspuns a unui script, si până la lucrul cu sesiunile sau gestionarea cookie-urilor.
În ceea ce ne priveşte, vom încerca în numerele viitoare continuarea dezvoltarii acestei mici aplicaţii, prin introducerea datelor într-o baza de date MySQL, pentru a exemplifica o alta tehnologie fără de care servletii nu ar avea apilcabilitate: JDBC (Java DataBaseConectivity. De asemenea, vom trata şi un aspect cu care ne intâlnim astăzi în lumea internet-ului: lucrul cu sistemul de poştă electronică (e-mail).
Referinţe web
|