Sunteți pe pagina 1din 7

Servleti - gestionarea parametrilor din cererile client

Obiective
- Apelarea unui servlet dintr-un formular HTML
- Citirea parametrilor intr-un servlet
- Gestionarea parametrilor lipsa sau eronati
- Filtrarea caracterelor speciale in servleti

1. Apelarea unui servlet dintr-un formular HTML.


Un servlet (http://www.oracle.com/technetwork/java/javaee/servlet/index.html)este
o componenta web, gestionata de un container, care genereaza continut dinamic. Mai putin
formal, un servlet este un program Java care extinde functionalitatea unui server web, punand
la dispozitie un anumit serviciu clientilor care acceseaza serverul respectiv.
Executia unui servlet urmeaza urmatorul flux de actiuni:
1. Clientul trimite o cerere catre server.
2. Serverul instantiaza (incarca) servletul si creeaza un fir de executie pentru acest proces.
Servletul este incarcat o singura data, la prima cerere venita, dupa care ramane in memorie
pana la oprirea serverului.
3. Serverul trimite cererea catre servlet.
4. Servletul construieste raspunsul si il trimite catre server.
5. Serverul trimite raspunsul inapoi catre client
Servletul construieste dinamic raspunsul folosind informatiile cuprinse in cererea
clientului plus datele necesare ce se gasesc in alte surse cum ar fi fisiere de resurse, baze de
date, obiecte partajate, raspunsuri de la alte servleturi, etc.
Ierarhia de clase pentru Servlet API este prezentata in figura 1:

Fig.1 Ierarhia de clase Servlet API

Citirea parametrilor intr-un servlet

Interfata Servlet contine urmatoarele semnaturi de metode:


- void init(ServletConfig config): este apelata de container cand se activeaza servletul;
- void destroy(): apelata de container la distrugerea servletului;
- void service (ServletRequest req, ServletResponse res): apelata de container cand
servletul primeste o cerere;
- ServletConfig getServletConfig(): se obtine un obiect cu descrierea configurarii
servletului;
- String getServletInfo(): informatii despre servlet, cum ar fi autorul, versiunea etc.
Clasa GenericServlet contine metodele:
- ServletContext getServletContext() : o referinta la contextul in care ruleaza servletul;
- String getServletName(): numele servletului;
- void log (String msg): scrie un mesaj de log compus din numele servletului si valoarea
parametrului msg ;
- void log (String msg, Throwable t): are in plus stiva de exceptii pasata ca parametru
Clasa HTTPServlet:
- void doGet(HttpServletRequest req, HttpServletResponse res): apelata de server pentru a
gestiona o cerere HTTP de tip GET;
- void doPost(HttpServletRequest req, HttpServletResponse res): apelata de server pentru a
gestiona o cerere HTTP de tip POST;
- void doPut(HttpServletRequest req, HttpServletResponse res): apelata de server pentru a
gestiona o cerere HTTP de tip PUT;
- void doDelete (HttpServletRequest req, HttpServletResponse res): cerere HTTP DELETE
- void doHead (HttpServletRequest req, HttpServletResponse res) : cerere HTTP HEAD
- void doOptions (HttpServletRequest req, HttpServletResponse res) : cerere HTTP
OPTIONS;
- void doTrace (HttpServletRequest req, HttpServletResponse res) : cerere HTTP TRACE
Clasa ServletConfig:
- String getInitParameter (String name): returneaza valoarea parametrului de initializare
din web.xml, daca exista;
- ServletContext getServletContext(): referinta la un obiect care contine contextul in care
se executa servletul;
- String getServletName() numele servletului
Clasa ServletContext:
- String getInitParameter (String name): parametrul de initializare legat de contextul
aplicatiei web;
Interfata ServletRequest:
- Object getAttribute (String name): returneaza obiectul asociat atributului pasat ca
parametru sau null
2

Citirea parametrilor intr-un servlet

- void setAttribute (String name, Object o): creaza un atribut cu numele name si-i
asociaza obiectul o
- void removeAttribute (String name): sterge atributul specificat in cerere;
- String getParameter (String name): returneaza parametrul asociat numelui specificat
sau null;
- String getLocalName() : returneaza numele masinii care a primit cererea;
- int getLocalPort(): retuneaza portul masinii care a primit cererea;
- String getProtocol() : returneaza numele si versiunea protocolului folosit;
- String getServerName() : numele serverului care a trimis cererea;
- int getServerPort(): portul serverului care a trimis cererea;
Interfata ServletResponse:
- PrintWriter getWriter(): obiectul prin care se expediaza continutul raspunsului la client;
Servleturile sunt apelate fie explicit printr-o referinta URL, fie sunt incorporate intr-un
document HTML si apelate dintr-o aplicatie Web.
Pentru a apela un servlet in cadrul unei pagini HTML trebuie inclus URL-ul servletului
astfel:
<HTML>
<HEAD><TITLE>Three Parameters Form</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">Introduceti valori pentru cei 3 parametri</H1>
<FORM ACTION="three-params">
Primul parametru: <INPUT TYPE="TEXT" NAME="param1"><BR>
Al doilea parametru: <INPUT TYPE="TEXT" NAME="param2"><BR>
Al treilea parametru: <INPUT TYPE="TEXT" NAME="param3"><BR>
<CENTER><INPUT TYPE="SUBMIT"></CENTER>
</FORM>
</BODY>
</HTML>

Dintr-un formular HTML se pot apela ambele metode ale unui servlet (GET/POST). Daca
nu se specifica metoda, predefinit se apeleaza GET.
Parametrii se pot specifica in URL unui servlet astfel:
http://serverhost:port/webapp/servletname?paramname=paramvalue
2. Citirea parametrilor intr-un servlet.
Intr-un servlet se pot citi datele trimise dintr-o pagina HTML prin intermediul parametrilor.
Astfel, obiectul de tip cerere (request) primit ca parametru al metodelor GET sau POST
poate obtine numele si valorile parametrilor transmisi de client.
Principala metoda ar fi request.getParameter("name"), care returneaza prima valoare
decodificata din URL-ul servletului. Metoda functioneaza la fel atat pentru GET cat si pentru
POST. Metoda returneaza null daca nu exista nici un parametru cu numele dat.
3

Citirea parametrilor intr-un servlet


O alta metoda ar fi request.getParameterValues("name"), care returneaza un vector cu toate

valorile din URL pentru numele parametrului dat.


@WebServlet("/three-params")
public class ThreeParams extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Citirea celor trei parametri din Request";
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"<UL>\n" +
" <LI><B>param1</B>: "
+ request.getParameter("param1") + "\n" +
" <LI><B>param2</B>: "
+ request.getParameter("param2") + "\n" +
" <LI><B>param3</B>: "
+ request.getParameter("param3") + "\n" +
"</UL>\n" +
"</BODY></HTML>");
}
}

Pentru a obtine enumerare sau lista de asocieri (hash map) a tuturor parametrilor se
folosesc metodele request.getParameterNames() sau request.getParameterMap().
Un exemplu de formular care transmite o valoare si de servlet care-l citeste si-l afiseaza:
@WebServlet("/show-params")
public class ShowParameters extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
String title = "Citirea tuturor parametrilor din Request";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +

Citirea parametrilor intr-un servlet


"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
"<TH>Nume Parametru<TH>Valoare Parametru");
Enumeration<String> paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = paramNames.nextElement();
out.print("<TR><TD>" + paramName + "\n<TD>");
String[] paramValues =
request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.println("<I>Fara valoare</I>");
else
out.println(paramValue);
} else {
out.println("<UL>");
for(int i=0; i<paramValues.length; i++) {
out.println("<LI>" + paramValues[i]);
}
out.println("</UL>");
}
}
out.println("</TABLE>\n</BODY></HTML>");
}

}
3. Validarea parametrilor intr-un servlet.
Atunci cand se citesc parametrii transmisi trebuiesc gestionate valorile lipsa si cele
incorecte. Valorile lipsa pot proveni din inexistenta in cerere a unui anumit parametru sau cand
valoarea parametrului este vida. O astfel de situatie se poate gestiona prin codul:
param = request.getParameter(name);
if ((param == null) || (param.trim().equals(""))) {
doSomethingForMissingValues(...);
} else {
doSomethingWithParameter(param);
}

Poate sa apara posibilitatea ca parametrul sa fie valid, valoarea sa nu fie vida, dar sa fie intrun format incorrect. In general, toate aceste situatii se pot gestiona, in general prin inlocuirea
valorilor lipsa cu valori predefinite la nivel de aplicatie sau prin re-afisarea formularului. Acest
lucru se poate face prin diverse moduri:
- exista un singur servlet care prezinta formularul, proceseaza datele si prezinta
rezultatele;
- un servlet prezinta formularul, iar al doilea proceseaza datele si prezinta rezultatele;
- un fisier HTML / JSP prezinta formularul, iar un servlet / pagina JSP proceseaza datele
si prezinta rezultatele;
5

Citirea parametrilor intr-un servlet

Atunci cand un formular HTML interactioneaza cu un servlet, utilizatorul poate introduce


diverse caractere in formular, caractere ce vor fi interpretate in servlet. Exista o serie de
caractere care pot produce disfunctionalitati in functionarea serverelor web (cross site
scripting
attack:
http://www.cert.org/advisories/CA-2000-02.html,
http://technet.microsoft.com/en-gb/library/cc750326.aspx ).
De exemplu, inserarea intr-un servlet a urmatoarelor caractere (<,>,&,) pot duce la
probleme. Pentru a evita astfel de probleme se recomanda filtrarea caracterelor speciale, atunci
cand se citesc pe server.
Exemplu:
public static String filter(String input) {
StringBuffer filtered = new StringBuffer(input.length());
char c;
for(int i=0; i<input.length(); i++) {
c = input.charAt(i);
switch(c) {
case '<': filtered.append("&lt;"); break;
case '>': filtered.append("&gt;"); break;
case '"': filtered.append("&quot;"); break;
case '&': filtered.append("&amp;"); break;
default: filtered.append(c);
}
}
return(filtered.toString());
}

Astfel se filtreaza caracterele speciale din cadrul unui sir introdus de utilizator si trimis
de clientul browser.

4. Exercitii.
1) Scrieti un servlet care sa afiseze informatiile disponibile prin apelarea metodelor din
GenericServlet, HTTPServlet, ServletContext, ServletConfig si ServletRequest. Folositi
urmatoarele metode: log("Log servlet informatii"), getServletName(),request.getLocalName(),
request.getLocalPort(),request.getProtocol(),request.getServerName(),request.getServerPort(),
serverContext.getServletContextName(),serverContext.getContextPath(),
serverContext.getMajorVersion(),serverContext.getMinorVersion(),
serverContext.getServerInfo().
2) Creati un servlet care sa citeasca si sa afiseze trei parametri dati in URL-ul servletului.
3) Creati un formular html care sa apeleze acelasi servlet cu trei parametri, folosind metoda
GET.
6

Citirea parametrilor intr-un servlet

4) Creati un formular html care sa permita introducerea numelui si prenumelui unei persoane.
Acest formular apeleaza un servlet care afiseaza tabelar numele si valoarea parametrilor
transmisi de formularul html. In servlet nu se stie apriori numele parametrilor transmisi.
5) Faceti acelasi lucru dar apeland metoda POST.

6) Creati un form HTML care sa permita introducerea unei portiuni de cod in browser. (ex:
<TEXTAREA ROWS="6" COLS="40" NAME="code"></TEXTAREA>). Creati servletul
care sa citeasca si sa afiseze codul introdus in formular.
7) Creati o varianta a problemei 6) in care se filtreaza caracterele speciale.
8) Creati o un formular HTML prin care se introduc numele, prenumele si emailul unei
persoane. Creati un servlet care sa afiseze numele parametrilor si a valorilor acestora. Daca o
valoare nu este introdusa atunci se va afisa o valoare predefinita (ex: email lipsa).
9) Modificati servletul anterior astfel incat sa se filtreze valorile introduse.
10) Creati un servlet sa permita introducerea valorilor de la problema 8 (nume, prenume,
email). Valorile introduse vor fi validate astfel:
- daca o valoare nu este completata, atunci se va fisa un mesaj corespunzator pentru campul
respectiv, avand culoarea rosie (ex: Trebuie introdus numele) si se va reafisa formularul pentru
completarea valorilor lipsa;
- daca toate valorile sunt completate atunci se vor afisa parametrii si numele lor.
Obs: se apeleaza metoda response.SendRedirect()
11) Creati un fomular index.html din care se pot apela toate exercitiile laboratorului.