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 [email protected]. 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
|