Documente Academic
Documente Profesional
Documente Cultură
Dai 02
Dai 02
Client web
Servlet
HTTP Response HttpServletResponse
Cele mai folosite servere care au si container de servleti sunt Tomcat (Apache) si Jetty. Ele stau
la baza multor servere de aplicatii comerciale sau gratuite. Un server de aplicatii ofer n plus si
alte functii comune aplicatiilor Web: securitatea si controlul accesului la aplicatii, gestiunea
tranzactiilor, servicii de nume si directoare (JNDI) s.a.
La primirea unei cereri containerul de servleti realizeaz urmtoarele actiuni:
1. Dac nu exist un obiect servlet n memorie atunci ncarc clasa servlet, instantiaz clasa (se
creeaz un obiect servlet) si apeleaz metoda init din servlet pentru initializri.
2. Apeleaz metoda service (doGet,doPost) din servlet transmitnd ca argumente un obiect
cerere si un obiect raspuns (obiectul rspuns va fi completat de metoda service).
Functiile unui servlet sunt realizate n metodele service, doGet, doPost s.a. Aceste metode
extrag informatii din obiectul cerere, acceseaz resurse externe si completeaz rspunsul cu
informatiile obtinute din resurse externe (cum ar fi baze de date). Parametrii unei cereri apar n
sirul de cereri (Query String), separat de calea la componenta prin ?. Numele si valorile
parametrilor unei cereri sunt preluate de obicei dintr-un formular (transmis de server si completat
de utilizatorul client al aplicatiei) si sunt adugate la URL prin click pe butonul Submit dintr-un
formular HTML (sau la apsarea tastei Enter).
Clasa HttpServletRequest are metode pentru extragerea parametrilor dintr-o cerere de ctre
servlet:
String getParameter (String name)
Enumeration getParameterNames()
Mai multi servleti dintr-o aplicatie pot folosi date (atribute) din patru obiecte comune, numite
Scope Objects:
Web Context : accesibil tuturor componentelor dintr-un context (aplicatie)
Session: accesibil componentelor dintr-o sesiune client
Request: accesibil componentelor care trateaz o cerere
Page: accesibil paginii JSP care a creat obiectul
Intr-o schem simpl MVC un servlet are rolul de controller. De fapt aplicatiile reale contin mai
multi servleti, fiecare serveste o pagin diferit din aplicatie. Cererile de la clienti sunt primite de
un servlet cu rol de dispecer, care selecteaz un alt servlet din aplicatie n functie de parametrii
cererii HTTP.
Aplicatiile Web cu servleti mai pot folosi filtre interpuse ntre servleti si cereri/rspunsuri HTTP,
precum si clase auxiliare (helpers) astfel c schema complet MVC a unei aplicatii Web arat
astfel:
Un filtru atasat unui servlet este folosit fie pentru prelucrarea unei cereri de la client nainte de a
ajunge la servlet, fie pentru prelucrarea rspunsului transmis de servlet. Se folosesc filtre pentru
autentificarea clientului, pentru compresia continutului sau pentru jurnalizare (logging).
O alt facilitate este atasarea unor asculttori la evenimente din viata unui servlet.
O aplicatie Web contine n general: componente Web, resurse statice (imagini, de ex.), clase
si biblioteci auxiliare (helper), biblioteci de tag-uri, precum si un descriptor de instalare pentru
configurarea (adaptarea) aplicatiei la instalarea pe serverul de productie.
Dezvoltarea unei aplicatii Web necesit urmtoarele etape:
- Scrierea codului pentru componentele Web
- Scrierea descriptorului de instalare (fisier XML)
- Compilarea componentelor si claselor auxiliare folosite de ele
- Impachetarea fisierelor aplicatiei ntr-o arhiv war (optional)
- Instalarea aplicatiei pe server (copiere fisier war in directorul din server pentru aplicatii Web)
Instalarea unui servlet pe un server Web (servlet deployment) poate fi static (nainte de a
porni/reporni un server) sau dinamic (n timp ce un server deserveste alte aplicatii) si se poate
face n mai multe feluri:
- Se copiaz directorul aplicatiei (cu o structur impus) sau o arhiv war cu continutul acestui
director n folderul din server destinat acestui scop (webapps pentru Apache Tomcat);
- Se foloseste programul ant (cu un fisier build.xml) si pentru operatia de instalare (nu numai
pentru compilarea surselor si alte operatii de creare a directorului aplicatiei)
- Se foloseste un utilitar, care poate fi o aplicatie Web de pe server-ul unde se va face instalarea
pentru deployment (de ex. Tomcat6 Manager)
Directorul aplicatiei are o structur de subdirectoare impus de specificatiile 2.2 pentru servleti,
iar arhivele cu acest format sunt fisiere cu extensia war (Web Archive). Structura general a unui
asemenea director este o structur ierarhic, cu cteva subdirectoare si fisiere obligatorii, si cu
altele ce depind de complexitatea aplicatiei. Numele directorului este asociat la instalare pe server
cu un nume de cale (context path), nume folosit n identificatorul resursei (URI) pentru acces la
aplicatia din server.
webapp
fisiere HTML,JSP
WEB-INF
classes
fisiere cu clase Java
lib
fisiere jar cu biblioteci folosite de aplicatie
web-xml
Atunci cnd se arhiveaz acest director se mai adaug si un subdirector META-INF cu un fisier
manifest (de tip mf) si eventual cu un fisier context.xml cu optiuni de configurare pentru
Tomcat. Atunci cnd se folosesc fisiere imagine, de stil (css) sau altele, cerute de fisierele HTML,
acestea e bine s fie grupate n subdirectoare cu nume sugestive
(images de ex.). Fisierele HTML si JSP sunt cele direct accesibile clientilor aplicatiei.
Respectarea acestei structuri simplific referintele ntre componentele aplicatiei Web pentru c
fisierele din subdirectoarele classes si lib sunt vizibile celorlalte fisiere din aplicatie, fr alte
Exemplu simplu de director minimal hello cu o singur clas servlet:
hello
WEB-INF
classes
HelloServlet.class
web.xml
Directorul care contine sursele aplicatiei si folosit n dezvoltarea aplicatiei poate avea (si are de
obicei) o structur diferit de directorul necesar pentru arhiva war sau pentru instalare pe server.
De aceea, se folosesc programe de gestiune a proiectelor sofware (Ant, Maven ) sau medii IDE
pentru automatizarea secventei de operatii care produce directorul final pornind de la directorul cu
surse (creare/stergere de foldere temporare, creare/stergere de fisiere, compilare, copiere de
fisiere dintr-un folder n altul, s.a.)
Intr-o aplicatie mare este preferabil s avem mai multi servleti, cu roluri bine definite, n locul
unui singur servlet mare. Transmiterea obiectelor cerere si rspuns ntre servleti se face prin
intermediul unui servlet dispecer. Exemplu:
public class Servlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
extinde tehnologia bazat pe servleti Java (ptr crearea de continut dinamic) dar permite
un mod mai natural de a specifica continutul static (HTML/XHTML).
Ideia paginilor JSP este de a extinde paginile HTML cu fragmente de cod Java incluse ntre
tag-uri delimitate de <% si %>. Paginile JSP sunt transformate (compilate) automat n servleti
de ctre un motor JSP (JSP Engine).
Codul Java folosit de o pagin JSP are forma unor componente JavaBean, adic foloseste
metode de tip get si set pentru acces la propriettile clasei (la datele dintr-un obiect). Tag-ul
<jsp: useBean ../> instantiaz o clas JavaBean si atribuie un identificator acestui obiect, care va fi
folosit n alte taguri de acces la proprietti: <jsp:setProperty ../>, <jsp:getProperty .. />.
Exist un numr relativ mare de taguri predefinite (ntr-o bibliotec de taguri de baz) si se pot
defini alte biblioteci de taguri.
Exemplu de fisier JSP
<%@ page import="hello.NameHandler" %>
<jsp:useBean id="mybean" scope="page" class="hello.NameHandler" />
<jsp:setProperty name="mybean" property="*" />
<html>
<head><title>Hello, User</title></head>
<table border="0" width="700">
<tr>
<td width="150"> </td>
<td width="550">
<h1>My name is Duke. What's yours?</h1>
</td>
</tr>
<tr>
<td width="150" </td>
<td width="550">
<form method="get">
<input type="text" name="username" size="25">
<br>
<input type="submit" value="Submit">
</td>
</tr>
</form>
</table>
<%
if ( request.getParameter("username") != null ) {
%>
<%@ include file="response.jsp" %>
<%
}
%>
</body>
</html>
package hello;
public class NameHandler {
private String username;
public NameHandler() { username = null; }
public void setUsername( String name ) { username = name; }
public String getUsername() { return username; }
}
Codul Java anterior ar fi mai complex dac s-ar cere autentificarea utilizatorilor care acceseaz
aplicatia, prin cutarea numelor acestora ntr-un tabel dintr-o baz de date.
Exemplul urmtor, care nsoteste server-ul Tomcat, este un joc de ghicire de ctre utilizatorul
aplicatiei a unui numr generat aleator n server si are o logic a aplicatiei ceva mai complex.
<%@ page import = "num.NumberGuessBean" %>
<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/>
<jsp:setProperty name="numguess" property="*"/>
<html>
<head><title>Number Guess</title></head>
<body>
<% if (numguess.getSuccess()) { %>
You got it after <%= numguess.getNumGuesses() %> tries.
<p>
<% numguess.reset(); %>
<a href="numguess.jsp">try again</a>?
<% } else if (numguess.getNumGuesses() == 0) { %>
Welcome to the Number Guess game.<p>
Enter a number between 1 and 100.<p>
<form method=get>
<input type=text name=guess>
<input type=submit value="Submit">
</form>
<% } else { %>
Try <b><%= numguess.getHint() %></b>.
You have made <%= numguess.getNumGuesses() %> guesses.<p>
Enter a number between 1 and 100.<p>
<form method=get>
<input type=text name=guess>
<input type=submit value="Submit">
</form>
<% } %>
</body>
</html>
Intercalarea de cod Java si de taguri HTML nu este o practic recomandat, iar aplicatiile
realizate dup schema MVC separ partea de logic n clase controler si partea de prezentare n
pagini HTML sau JSP (componenta de View).
Orice pagin JSP este tradus ntr-un servlet care scrie textul HTML din pagin.
Ciclul de viat al unei pagini JSP:
1. Dac nu exist un obiect servlet pentru pagina JSP, atunci
a. Se ncarc clasa servlet asociat paginii
b. Se instantiaz clasa servlet
c. Se fac initializri prin apelul metodei jspInit
2. Containerul apeleaz metoda _jspService (corespondentul metodei service dintr-un servlet)
transmitndu-i ca parametri obiectul cerere (HTTP) si obiectul raspuns.
JSP pune la dispozitie:
- O serie de marcaje predefinite (taguri JSP) pentru legare la secvente Java dintr-un document
HTML
- Posibilitatea de a defini noi marcaje utilizabile n pagini JSP (ustom tags
- Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java
Elementele componente ale unei pagini JSP:
- Directive, care controleazmodul ncare containerul traduce si executpagini JSP. Exemple:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="/functions" prefix="f" %>
- Marcaje de forma <jsp:include >, <jsp:forward > pentru apeluri de metode din Servlet API
Alte obiecte implicite accesibile ntr-o pagin JSP sunt de tip dictionar (Map) si permit
memorarea numelor si valorilor unor variabile pe o durat determinat:
pageScope = valabile pentru pagina curenta
requestScope = valabile pentru o cerere
sessionScope = valabile pentru sesiunea curenta
applicationScope = valabile pentru intreaga aplicatie
Reutilizarea unor pagini complete sau unor fragmente de pagini JSP n alte pagini JSP se
face prin directiva <%@ include file="filename"%>
Aceste directive se pot folosi numai la nceput sau la sfrsit de pagin.
Pentru reutilizarea de fragmente in interiorul paginilor JSP se foloseste o biblioteca de
marcaje "template" (Template Tag Library).
Un template permite separarea partilor comune mai multor pagini dintr-o aplicatie Web
(antet,note de subsol, s.a.) de elementele specifice fiecarei pagini. Un template este o pagina JSP
cu parametrii (placeholders=jaloane)