Java Servlets sunt programe Java, independente de platforma, utilizate pentru a extinde capacitatile serverelor web. Se poate face o paralela între ceea ce reprezinta servletii pentru serverul web si ceea ce reprezinta applet - urile pentru client. Ambele sunt programe Java compilate (bytecode) care pot fi încarcate dinamic si extind capacitatile masinii. Totusi, appletul este o componenta client - side, care ruleaza într-un browser web, în interiorul unei pagini web sau a unei interfete grafice, iar servletii fac parte din asa - numitele componente server - side, interactionând cu motorul servletului, suportat de catre serverul web, având la baza conceptul de comunicatie cerere - raspuns (bazat la rândul lui pe protocolul HTTP).
Aplicatia client, de exemplu web browser, acceseaza serverul web si trimite o cerere. Aceasta cerere este procesata de catre motorul servletului, instalat pe server - ul web. Acesta returneaza un raspuns servletului iar servletul returneaza la rândul lui raspuns HTTP clientului.
Servletii folosesc clase din pachetele javax.servlet (pachetul Servlet principal) si 515c23f javax.servlet.http (extensie a pachetului principal, pentru servlet-uri care raspund cererilor HTTP).
Caracteristic serveletilor HTTP avem:
procesarea si/sau stocarea unor date trimise de un form HTML
asigura un continut dinamic, de exemplu, returnarea unor date dintr-o baza de date
administrarea mai multor cereri HTTP
Modul traditional de a adauga unele noi functii unui server web este cunoscutul model Common Gateway Interface (CGI). Acesta poate astfel permite server-ului pornirea unui proces extern ce preia informatii privind o anume cerere, prin intermediul unor variabile de mediu si care trimite datele de raspuns printate. Fiecare cerere este administrata într-un proces de o instanta separata a programului (script-ului) CGI.
Avantajele servletilor fata de CGI:
Servlet-ul nu ruleaza într-un proces separat, acesta elimina posibilitatea crearii de noi procese pentru fiecare cerere
Servletul este încarcat în memorie si ramâne acolo între cereri. Un program CGI este încarcat pentru fiecare cerere CGI. Exista o singura instanta care raspunde cerereilor simultane, acesta duce la salvarea de memorie si permite servletilor o administare mai usoara a datelor.
Servlet-ul poate fi rulat de motorul servletului (Servlet Engine) într-o zona restrictiva (Sandbox), fapt care permite folosirea sigura a potentialelor.
Toti servletii implementeaza interfata Servlet sau, de cele mai multe ori, extind clasa HttpServlet care implementeaza interfata Servlet.
Interfata Servlet defineste metode pentru a initializa un servlet si de a comunica cu clientii.
Când un servlet acepta o cerere de la un client, el primeste doua obiecte:
ServletRequest
ServletResponse
Ambele încapsuleaza comunicarea client - server.
Interfata ServletRequest permite servletului accesul la unele informatii cum ar fi numele parametrilor trimisi (pasati) de client, protocolul (http, https, ftp) folosit de client, numele clientului.
De asemenea ofera o clasa ServletInputStream prin care servletul primeste date de la clientii care folosesc protocolul HTTP prin metode ca POST si PUT. Subclasele lui ServletRequest permit serverului recuperarea de date specifice protocolului. De exemplu, clasa HttpServletRequest contine metode care pot accesa informatii specifice din antetul HTTP.
Interfata ServletResponse ofera metode pentru a raspunde clientului. Permite servletului setarea ContentLength (lungimea câmpului de date) precum si setarea tipului de date returnat MIME type oferind un ouput stream prin intermediul metodei getWriter(), sau a clasei ServletOutputStream.
Subclasele lui ServletResponse, ofera servletului mai multe capabilitati specifice protocolului. De exemplu HttpServletResponse contine metode care permit servletului manipularea de câmpuri specifice protocolului HTTP.
Cilclul de viata al unui servlet defineste modul în care servletul este încarcat si initializat, modul în care el primeste si raspunde cererilor, precum si modul de terminare a actiunii lui.
Încarcarea si instantierea - motorul servletului este cel care realizeaza aceste taskuri, când acesta îsi începe activitatea, când acesta trebuie sa raspunda unor cereri venite de la client. Motorul servletului foloseste facilitatile de încarcare ale claselor Java, putând realiza încarcarea fie de pe un sistem local de fisiere, fie de pe unul aflat la distanta, sau chiar de pe o sursa de retea.
Initializarea - dupa încarcare, motorul servletului trebuie sa initializeze servletul. Initializarea este utilizata în special pentru citirea datelor persistente, ce pot fi stocate, pentru initializarea conexiunii la o baza de date, precum si pentru stabilirea referintelor la alte resurse. Cea care furnizeaza servletului informatii de initializare este metoda init() a interfetei javax.servlet.Servlet, astfel ca servletul este pregatit pentru autoconfigurare. Obiectul de configurare, de tip ServletConfig, este transmis ca si parametru metodei init(). Acesta este implementat în motorul servletului, permitând servletului sa acceseze parametrii pereche nume - valoare din informatia de configurare. De asemenea, furnizeaza acces la obiectul de tip ServletContext.
Tratarea cererilor - dupa ce este initializat servletul este gata pentru a raspunde cererilor clientilor, reprezentate ca obiect de tip ServletRequest. Servletul raspunde cererii printr-un obiect de tip ServletResponse. Când un client executa o cerere, motorul servletului trimite servletului ambele obiecte, atât response cât si request ca si parametrii metodei service(), definita de interfata Service, implementata de catre servlet.
Distrugere unui servlet - motorul serverului nu este obligat pentru a mentine în viata un servlet pe toata perioada de rulare a serverului. În cazul în care motorul servletului doreste eliberarea unor resurse, sau oprirea sa, se va apela metoda destroy(), implementata de servlet, respectând în prealabil un anumit interval de timp dupa executia ultimului apel al metodei service().
Definirea obiectului de tip ServletContext - prin utilizarea acestui tip de obiect servletul poate trata evenimente, poate obtine resurse si obiecte de la motorul servletului, de exemplu, obiect de tip RequestDispatcher. Un servlet poate rula într-un singur context de servlet, dar servleti diferiti pot avea vizualizari diferite asupra motorului servletului.
Sesiuni HTTP. Pentru a realiza o aplicatie web, trebuie sa se asigure identificarea unor serii de cereri unice trimise de clientul aflat la distanta. Java Servlet API furnizeaza o interfata simpla care sa permita motorului servletului utilizarea unui numar de tehnici de tratare a sesiunii dedicata unui utilizator.
Servletii implementeaza interfata javax.servlet.Servlet. Astfel:
Se pot scrie servleti care implementeaza direct aceasta interfata dar de obicei acest lucru nu este necesar, deoarece de obicei servletii sunt folositi cu protocolul HTTP, utilizând o clasa mai specializata javax.servlet.http.HttpServlet
Clasa HttpServlet implementeaza interfata Servlet prin extinderea clasei de baza GenericServlet si ofera un mod de lucru pentru manipularea protocolului HTTP. Ea poate suporta mai multe fire de executie simultane rulând mai multe metode service(). În cazurile în care se doreste ca un singur serviciu sa ruleze la un moment dat, aditional se implementeaza si interfata SingleThreadModel. Aceasta nu impune scrierea unor alte metode, ajunge doar implementarea intrefetei.
Clasa HttpServlet este o clasa abstracta, iar clasa care o extinde trebuie sa suprascrie unele metode proiectate pentru a manevra cereri HTTP. Aceste metode sunt :
doGet pentru a manevra cereri de tip GET si HEAD
doPost pentru cereri de tip POST
doPut pentru cereri de tip PUT
doDelete pentru cereri de tip DELETE
Implicit aceste metode returneaza mesaj de BAD_REQUEST (400).
Ca si avantaje ale servleturilor putem aminti comunicatia inter-servlet. Pe un server exista mai multe servleturi. Prin apelarea metodei getServletNames(), se returneaza lista cu ceilalti servleti. Comunicarea însa este putin mai complicata deoarece trebuie sa se aiba în vedere ca servletii sunt încarcti de ClassLoader. Pentru a putea face o comunicare trebuie definita o interfata care este încarcata de de SystemLoader si prin care se poate face comunicarea (cu ajutorul obiectelor).
Servletul poate face o cerere spre server la fel ca orice client. Poate accesa resursele pasive ale serverului cum sunt fisierele HTML prin metoda getResouce() din clasa ServletContext. De asemenea mai poate executa:
trimiterea de cookies
internationalizare
autentificarea unui user dupa sesiune (Sessions ).
Accesarea unei baze de date prin intermediul unui servlet
DBHandler.java |
import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import myPackage.myBean; public class DBHandler extends HttpServlet else } catch (Exception e) |
Afisarea continutului unui form HTML într - o pagina HTML generata dinamic de catre un Servlet.
Form2.java |
package myPackage; import java.io.PrintWriter; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; public class Form2 extends HttpServlet fileReader.close(); responseWriter.close(); |
Citirea a trei imagini de la un URL clar stabilit, a 5 String-uri dintr-o baza de date si afisarea lor în interiorul unei pagini HTML dinamice alaturi de 5 componente grafice de tip .
Form1.java |
package myPackage; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; public class Form1 extends HttpServlet } catch (Exception e) out.println("<html>" + "<head><title>First Form</title></head>" + "<body bgcolor=\"#FFFFFF\">" + "<center>" + "<hr> <br> " + "<h1>" + "<font size=\"+3\" color=\"blue\">Connected to </font>" + "<font size=\"+3\" color=\"blue\">The Testing System </font>" + "</h1>" + "</center>" + "<br> <hr> <br> "); for(int i=1;i<=strTab.length;i++) out.println("<Form Method=Post>"+ "<br> <hr> <br> "+ "<input type=\"submit\" value=\"Submit\">"+ "<br> <hr> <br> "); out.close(); } |
|