Sunteți pe pagina 1din 14

Tutorial Servelturi

Vedere de ansamblu

 Servleturile ofera metoda bazata pe componente, indepedenta de


platforma pentru a construi aplicatii web, fara limitarile programelor CGI
Ce este un servlet ?
 Servleturile Java sunt programe care ruleaza pe Web sau pe server
aplicatie si se comporta ca un strat de mijloc intre cereri venite de la
browserul Web si alti clienti, baze de date sau aplicatii de pe server
 Folosind servleturi, se pot colecta intrari (input) de la utilizatorii
formularelor web, prezenta inregistrari dintr-o baza de date sau alta sursa
si creea pagini web dinamice

Avantajele servleturilor fata de CGI

 Perfomanta mai buna


 Se executa in spatiul de adrese al serverului web
 Sunt independente de platforma, deoarece sunt scrise in Java
 Intreaga functionalitate a librariei claselor Java este disponibila unui
servlet

Arhitectura servleturilor
Taskurile servleturilor
 Citirea de date explicite trimise de clienti (browsere)
 Citirea implicita a cererii(request) HTTP – cookieuri, tipuri media,scheme
de compresie samd..
 Procesarea datelor si generarea de rezultate (procesul poate cere
comunicarea cu baza de date sau executarea unui apel RMI sau CORBA)
 Trimiterea de date explicite (documente) clientilor (browsere)
 Trimiterea de raspunsuri http implicite clientilor (browsere)

Pachetele de servleturi
 Javax.servlet
 Javax.servlet.http

Ciclul de viata al unui Servlet


 Poate fi definit ca intregul proces de la creearea sa pana la distrugere
 Urmatoarele cai sunt urmate de un servlet
o Este initializat cu metoda init()
o Apeleaza metoda service() pentru a procesa cereri de la client
o Este terminat cu metoda destroy()
o In final, servletul este colectat de garbage collector

Metoda init()
Metoda service()
 Este metoda de serviciu principala care face task-ul curent
 Containerul servlet (serverul web) apeleaza metoda service pentru a
gestiona cereri venite de la clienti(browsere) si pentru a scrie raspunsul
prelucrat inapoi la clienti
 semnatura
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
 metoda service() este apelata de container si metoda service invoca
metoda apropiata de tip doGet, doPost, doPut, doDelete etc
Metoda doGet()
 o cerere GET rezultata dintr-un request normal GET pentru un URL dintr-
un formular HTML care nu are nici o alta metoda specificata ar trebui
gestionat(handled) de o metoda doGet()
Metoda doPost()
 o cerere POST rezultata dintr-un form HTML care specifica POST ca
metoda ar trebui gestionat de metoda doPost()
Mertoda destroy()
 este apelata o singura data la finalul ciclului de viata al unui servelt
 ofera servletului sansa de a inchide conexiunile la baza de date, sa
opreasca thread-uri din background, sa scrie lista de cookiuri pe disc, sau
sa faca alte activitati de cleanup
Diagrama arhitecturii
 Intai, cererea(request) HTTP venita de la servereste delegata
containerului servlet
 Containerul servlet incarca servletul inainte de a invoca metoda service()
 Containerul servletului gestioneaza mai multe cereri prin plasarea mai
multor thread-uri, fiecare thread executand metoda service() a unei
singure instante a servletului

Exemplu
 Servleturile sunt clase Java cu servicii de cereri(request) HTTP si
implementeaza interfata javax.servlet.Servlet
 Exemplu practic

// Import required java libraries

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

// Extend HttpServlet class

public class HelloWorld extends HttpServlet {

private String message;

public void init() throws ServletException {

// Do required initialization

message = "Hello World";

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// Set response content type

response.setContentType("text/html");

// Actual logic goes here.

PrintWriter out = response.getWriter();

out.println("<h1>" + message + "</h1>");

}
public void destroy() {

// do nothing.

Instalarea unui servlet


 Implicit, o aplicatie servlet este localizata in folderul
<Tomcat-installationdirectory>/webapps/ROOT

 Clasa fisier se afla in


<Tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes.

 Daca avem clasa scrisa com.myorg.MyServlet, clasa servlet este


localizata in
WEB-INF/classes/com/myorg/MyServlet.class

 Putem sa copiem HelloWorld.Class in directorul


<Tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes

 Trebuie creeat fisierul web.xml si plasat in


<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/

 Serverul tomcat se porneste pe windows cu


<Tomcat-installationdirectory>\bin\startup.bat
 http://localhost:8080/HelloWorld
 Web.xml va avea structura :

<servlet>

<servlet-name>HelloWorld</servlet-name>

<servlet-class>HelloWorld</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>HelloWorld</servlet-name>

<url-pattern>/HelloWorld</url-pattern>

</servlet-mapping>

Cereri HTTP client


 Cand un browser cere o pagina web, el trimite o multime de informatii
care nu pot fi citite direct catre serverul web
 Vezi tabel cu functii pentru cereri

Raspunsuri HTTP server


 Cand serverul web raspune unui request , raspunsul consta intr-o linie de
status, unele headere de raspuns, o linie alba si documentul
 Un raspuns tipic arata in felul urmator :

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
Date de formulare (Form data)
 Pot fi multe situatii cand este necesar sa trecem informatii din browser
catre serverul web si in final catre programul de backend
 Browserul foloseste 2 metode pentru a trimite informatii catre serverul
web. Aceste metode sunt GET si POST

 Metoda GET
o Trimite informatii codate puse la sfarsitul cererii
o Exemplu
http://www.test.com/hello?key1 = value1&key2 = value2

o Metoda GET este metoda default pentru a trimite informatii de la


browser catre serverul web
o Nu folositi niciodata metoda GET pentru parole
 Metoda POST
 In general o metoda mai stabila pentru a trimite informatii catre un
program de backend este metoda POST
 Impacheteaza informatii in acelasi fel ca GET, dar in loc sa trimita un
string text dupa ? il trimite intr-un mesaj separat

Citirea datelor folosind un servlet

 getParameter() - Apelam metoda request.getParameter()pentru a prelua


valoarea unui parametru de formular.

 getParameterValues() – Apelam aceasta metoda daca parametrul are mai


multe valori cum este de exemplu checkbox.

 getParameterNames() – Apelam aceasta metoda pentru o lista completa de


parametrii
Urmarirea sesiunilor (session tracking)
 HTTP este un protocol independent de stare (stateless), ceea ce inseamna
ca de fiecare data cand un client preia o pagia, clientul deschide o sesiune
separata catre serverul web si serverul nu tine cont de orice inregistrare
transmisa anterior
 Cu toate acestea, exista 3 metode de a mentine sesiuni intre clientul web si
serverul web
 Cooki-uri

o Un server web poate asigna un unic ID de sesiune fiecarui client web
si pentru cereri ulterioare acesta poate fi recunoscut in functie de
cooki-ul primit
 Campuri ascunse
o Un server poate trimite un camp de formular ascuns cu un id de
sesiune unic, ceea ce inseamna ca numele si valoarea vor fi incluse in
datele din POST sau GET
 <input type = "hidden" name = "sessionid" value = "12345">
o Aceasta poate fi o cale efectiva de a tine evidenta sesiunii, dar
apasarea pe un buton cu <a href> nu suporta variabile de sesiune
 Rescrierea URL
o Se pot adauga date extra la sfarsitul fiecarui URL care identifica
sesiunea, si serverul poate asocia identificatorul de sesiune cu datele
pe care le-a stocat despre aceea sesiune
o Exemplu : http://tutorialspoint.com/file.htm;sessionid = 12345

 Pentru acest exemplu identificatorul de sesiune este atasat ca


sessionid=12345 care poate fi accesat de serverul web pentru
a il identifica pe client.


 Obiectul HttpSession
o In afara de cele 3 cai mentionate, servleturile ofera interfata
HttpSession care ofera o cale de a identifica utilizatorul pe mai multe
reuquesturi de pagina
o Containerul servletului foloseste aceasta interfata pentru a creea
sesiuni intre clientu HTTP si serverul HTTP
o Aceste sesiuni persista pentru o perioada de timp specificata, de-a
lungul a mai multe decat un request
 HttpSession session = request.getSession();
 Metode uzuale :
o public Object getAttribute(String name)

 returneaza obiectul cu numele specificat in aceasta sesiune,


sau null daca nici un obiect nu este asociat numelui
o public Enumeration getAttributeNames()
 returneaza o enumerare de obiecte de tip String care contine
toate numele obiectelor asociate acestei sesiuni
o public long getCreationTime()
 returneaza timpul cand a fost creeata sesiunea
o public String getId()

 returneaza un unic identificator asociat sesiunii


o public long getLastAccessedTime()
 returneaza timpul ultimei accesari a sesiunii
o public void invalidate()
 termina sesiunea si sterge orice asociere
o public boolean isNew()
 returneaza true in cazul in care clientul nu stie nimic despre
sesiune sau daca un client alege sa nu se alature sesiunii
o public void removeAttribute(String name)
 sterge un obiect asociat sesiunii
o public void setAttribute(String name, Object value)
 adauga un obiect la sesiunea curenta, folosind numele
specificat

o public void setMaxInactiveInterval(int interval)


 specifica un timp, in secunde, intre cereri de clienti, inainte sa
invalideze containerul serverului sesiunea

// Import required java libraries

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

// Extend HttpServlet class

public class SessionTrack extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// Create a session object if it is already not created.

HttpSession session = request.getSession(true);

// Get session creation time.

Date createTime = new Date(session.getCreationTime());

// Get last access time of this web page.

Date lastAccessTime = new Date(session.getLastAccessedTime());


String title = "Welcome Back to my website";

Integer visitCount = new Integer(0);

String visitCountKey = new String("visitCount");

String userIDKey = new String("userID");

String userID = new String("ABCD");

// Check if this is new comer on your web page.

if (session.isNew()) {

title = "Welcome to my website";

session.setAttribute(userIDKey, userID);

} else {

visitCount = (Integer)session.getAttribute(visitCountKey);

visitCount = visitCount + 1;

userID = (String)session.getAttribute(userIDKey);

session.setAttribute(visitCountKey, visitCount);

// Set response content type

response.setContentType("text/html");

PrintWriter out = response.getWriter();

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 = \"#f0f0f0\">\n" +

"<h1 align = \"center\">" + title + "</h1>\n" +

"<h2 align = \"center\">Session Infomation</h2>\n" +

"<table border = \"1\" align = \"center\">\n" +

"<tr bgcolor = \"#949494\">\n" +

" <th>Session info</th><th>value</th>

</tr>\n" +

"<tr>\n" +

" <td>id</td>\n" +

" <td>" + session.getId() + "</td>

</tr>\n" +

"<tr>\n" +

" <td>Creation Time</td>\n" +

" <td>" + createTime + " </td>

</tr>\n" +

"<tr>\n" +

" <td>Time of Last Access</td>\n" +

" <td>" + lastAccessTime + " </td>

</tr>\n" +

"<tr>\n" +

" <td>User ID</td>\n" +

" <td>" + userID + " </td>


</tr>\n" +

"<tr>\n" +

" <td>Number of visits</td>\n" +

" <td>" + visitCount + "</td>

</tr>\n" +

"</table>\n" +

"</body>

</html>"

);

S-ar putea să vă placă și