tehnologii java - alexandru ioan cuza universityacf/tj/slides/servleturi... · 2013-10-08 ·...

48
Tehnologii Java Curs - Cristian Fr ˘ asinaru [email protected] Facultatea de Informatic ˘ a Universitatea ”Al. I. Cuza” Ias ¸i

Upload: others

Post on 23-Feb-2020

29 views

Category:

Documents


0 download

TRANSCRIPT

Tehnologii JavaCurs -

Cristian Frasinaru

[email protected]

Facultatea de Informatica

Universitatea ”Al. I. Cuza” Iasi

Servleturi

Tehnologii Java – p.1/47

Cuprins

Introducere

Java Servlet API

Comunicarea cu clientii

Ciclul de viata al unui servlet

Contextul de executie

Sesiuni de lucru

Folosirea explicita a cookie-urilor

Comunicarea servleturilor

Rularea servleturilor

Tehnologii Java – p.2/47

Introducere

Tehnologii Java – p.3/47

Ce este un servlet ?

Concept: Componenta software careinteractioneaza cu clientii (din retea) printr-oparadigma de tip cerere-raspuns

Java EE : Componenta Web gestionata de uncontainer care extinde functionalitatea unui serverWeb:

poate genera continut dinamicpoate controla fluxul unei aplicatii Web

Parte fundamentala a nivelului Web al platformeiJava EE

Tehnologii Java – p.4/47

Functionarea unui servlet

Tehnologii Java – p.5/47

Java Servlet API

javax.servletsuport pentru servleturi independente de protocol

javax.servlet.httpsuport pentru protocolul HTTP

Abstractiunea centrala o reprezinta interfata Servlet .

Orice servlet implementeaza aceasta interfata fie direct,fie indirect prin extinderea clasei HttpServlet .

Tehnologii Java – p.6/47

Hello World

package demo;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;

public class HelloWorldServlet extends HttpServlet {@Overridepublic void doGet( HttpServletRequest request,

HttpServletResponse response )throws IOException {

response.setContentType("text/html");

PrintWriter out = new PrintWriter(response.getWriter());

out.println("<html><head><title>Hello</title></head>");out.println("<body>Hello World at " + new java.util.Date());out.println("</body></html>");out.close();

}}

Tehnologii Java – p.7/47

Executia unui servlet

@WebServlet(name = "HelloWorld", urlPatterns = {"/HelloWorld"})public class HelloWorldServlet extends HttpServlet {...

}

sau în fisierul web.xml<servlet>

<servlet-name>HelloWorld</servlet-name><servlet-class>demo.HelloWorldServlet</servlet-class>

</servlet><servlet-mapping>

<servlet-name>HelloWorld</servlet-name><url-pattern>/HelloWorld</url-pattern>

</servlet-mapping>

http://localhost:8080/FirstWebApp/HelloWorld

Tehnologii Java – p.8/47

Metode cheie ale servleturilor

init - apelata o singur a dat a la initializareacomponentei servlet

service - numitorul comun al tuturor metodelor de tipdo[TipCerere]; implicit, aceasta metodadetermina tipul unei cereri si apeleaza metodado[TipCerere] corespunzatoare.

doGet - procesarea cererilor de tip GET

doPost - procesarea cererilor de tip POST

destroy - apelata la eliberarea din memorie

Tehnologii Java – p.9/47

Comunicarea cu clientii

Când un servlet accepta un client primeste doua obiecte:

ServletRequest , ce încapsuleaza toate informatiiletrimise de client catre servlet

ServletResponse , ce descrie raspunsul trimis decatre servlet inapoi catre client

Implementarile concrete ale acestor interfete sunt:

HttpServletRequest

HttpServletResponse

Tehnologii Java – p.10/47

Cererea: HttpServletRequest

Obiectul de tip HttpServletRequest permite accesul ladatele trimise de client prin metodele de mai jos:

getParameter , getParameterValues ,getParameterNames

getQueryString - returneaza un sir cu cererea venitaîn format primitiv (doar pentru cereri de tip GET)

getReader , returneaza un flux de tipBufferedReader

getInputStream , returneaza un flux de tipServletInputStream

Tehnologii Java – p.11/47

Raspunsul: HttpServletResponse

Obiectul de tip HttpServletResponse pune ladispozitie doua metode de a returna date catre client:

getWriter , returneaza un flux de iesire de tip Writer

getOutputStream , returneaza un flux de iesire de tipServletOutputStream

ObservatieInainte de a scrie informatii pe fluxul de iesire trebuiesetat header-ul HTTP cu metoda setContentType ,argumentul cel mai uzual fiind "text/html".

Tehnologii Java – p.12/47

Exemplu - Trimiterea parametrilor

<html><head>

<title>Register</title><meta http-equiv="Content-Type"

content="text/html; charset=UTF-8"></head><body>

<form method="GET" action="RegisterServlet">Name:<input type="text" name="name" size=20 value=""/><br/>Email address:<input type="text" name="mail" size=20 value=""/><br/><input type="submit" name="submit" value="Submit">

</form></body>

</html>

Tehnologii Java – p.13/47

Exemplu - Primirea parametrilor

@WebServlet(name = "RegisterServlet",urlPatterns = {"/RegisterServlet"})

public class RegisterServlet extends HttpServlet {private PrintWriter writer = null;@Override public void init() throws ServletException {

String filename =getServletContext().getRealPath("database.txt");

try {writer = new PrintWriter(new FileWriter(filename));

} catch (IOException e) {throw new UnavailableException(e.getMessage());

}}......... doGet@Override public void destroy() {

writer.close();}

Tehnologii Java – p.14/47

Exemplu - Primirea parametrilor

public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException {

//scriem datele primite in fiserString name = request.getParameter("name");String mail = request.getParameter("mail");writer.println(name + "\t" + mail);writer.flush();

//trimitem un raspuns de confirmareresponse.setContentType("text/html");PrintWriter out = new PrintWriter(response.getWriter());out.println("<html><head><title>Register</title></head>");out.println(name + " was registered.");out.println("</html>");out.close();

}

http://localhost:8080/FirstWebApp/RegisterServlet?name=’Ion’&mail=’[email protected]

Tehnologii Java – p.15/47

Tratarea cererilor concurente

Servleturile nu sunt thread-safe→ Este necesara sincronizarea metodelor cegestioneaza resursa comuna.

Tehnologii Java – p.16/47

Exemplu

public class ThreadSafeTestServlet extends HttpServlet {

// Shared member variableprivate String notThreadSafe;

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// WrongnotThreadSafe = request.getParameter("param");System.out.println(notThreadSafe);

// OKString threadSafe = request.getParameter("param");

}}

Tehnologii Java – p.17/47

Ciclul de viata al unui servlet

Tehnologii Java – p.18/47

Etape

Ciclul de viata al unui servlet consta în urmatoareleetape:

Serverul de aplicatii porneste si înarca aplicatiileinstalate

Serverul încarca în memorie si initializeaza servletul(load-on-startup).

Servletul trateaza concurent cererile venite dinpartea clientilor Web.

Serverul elimina servletul din memorie.

Tehnologii Java – p.19/47

Initializarea

Dupa încarcarea în memorie a servletului, serverul vaapela metoda init a acestuia.

Initializarea este executata o singur a dat a pe toatadurata de viata a servletului.

Nici o cerere nu va fi tratata pâna la terminareainitializarii.

Servletul nu va deveni functional daca:Pe parcursul initializarii va fi aruncata o exceptiede tipul ServletException .Metoda init nu se termina într-o perioadaspecificata de server.

Tehnologii Java – p.20/47

Actiuni realizate la initializare

Cele mai uzuale actiuni executate în metoda init sunt:

Citirea unor parametri de initializare a servletului.

Deschiderea unor fisiere.

Realizarea unor conexiuni la baze de date.

Realizarea unor conexiuni în retea.

Daca apare o eroare la realizarea acestor operatiunicare compromite capacitatea servletului de a satisfacecererile clientilor trebuie aruncata o exceptie de tipulUnavailableException .

Tehnologii Java – p.21/47

Distrugerea

La distrugerea unui servlet serverul apeleaza automatmetoda destroy a acestuia.Uzual, în metoda destroy vor fi inchise fisierele sauconexiunile deschise în metoda init.

Metoda destroy este apelata doar dupa ce firele deexecutie service s-au terminat sau o anumita perioadade timp specificata in parametrii de configurare aiserverului s-a scurs.

Metoda este executata o singur a dat a si, dupa apelul ei,nu va mai fi realizat nici un apel al metodei service.

Tehnologii Java – p.22/47

Contextul de executie

Un servlet "traieste si moare" în interiorul unui proces ceruleaza pe un server Web.

Informatii primite la initializarea servletului:ServletConfig

Informatii despre si de la server:ServletContext

Informatii contextuale specifice cererilor primite:ServletRequest

Tehnologii Java – p.23/47

Exemplu

public class TestServlet extends HttpServlet {

public void init() throws ServletException {//Accesarea contextului de initializare a aplicatieiServletConfig config = this.getServletConfig();String param = config.getInitParameter("param");

}

public void doGet(HttpServletRequest req, HttpServletResponse res)throws IOException {

//Accesarea contextului de executie a aplicatieiServletContext context = this.getServletContext();context.log(context.getServerInfo());context.log("doGet OK");

}}

Tehnologii Java – p.24/47

Aspecte legate de comunicare

Tehnologii Java – p.25/47

Folosirea unor resurse Web

Realizarea unei cereri HTTP catre URL-ul resurseirespective.

Daca resursa se gaseste în acelasi context deexecutie cu servletul, poate fi folosit un obiect de tipRequestDispatcher . Acesta poate efectua una dinactiunile:

forwardinclude

Tehnologii Java – p.26/47

Redirectarea HTTP

HttpServletResponsesendRedirect(String url)

Cererea clientului este redirectata catre o alta locatie(url) care poate fi locala sau externa aplicatiei.

Noua cerere este vizibila la nivelul clientului(browser)

client side redirect

Tehnologii Java – p.27/47

Crearea unui RequestDispatcher

Se realizeaza cu metoda getRequestDispatcher aclasei SerlvetContext care primeste ca argumentURL-ul relativ sau absolut al resursei accesate.RequestDispatcher dispatcher =

context.getRequestDispatcher("/ThankYou.html");

String url = "/ThankYouServlet"RequestDispatcher dispatcher =

context.getRequestDispatcher(url);if (dispatcher==null) {

//resursa nu este disponibilaresponse.sendError(response.SC_NO_CONTENT);

}...

Tehnologii Java – p.28/47

Actiunea forward

Transfera responsabilitatea generarii raspunsului catreclient resursei apelate. Se realizeaza prin metodaforward a clasei RequestDispatcher.RequestDispatcher dispatcher =

context.getRequestDispatcher("/resursa");dispatcher.forward(request, response);//nu este deschis nici un flux de iesire catre client

AtentieServletul nu trebuie sa deschida vreu flux de iesire catreclient, altfel va fi generata o exceptie de tipulIllegalStateException.

Tehnologii Java – p.29/47

Actiunea include

Include raspunsul primit de la resura apelata în cadrulraspunsului propriu: Se realizeaza prin metoda includea clasei RequestDispatcher.RequestDispatcher dispatcher =

getServletContext().getRequestDispatcher("/resursa");PrintWriter out = response.getWriter();out.println("..."); //raspuns propriu servletului

//este inclus raspunsul resursei apelatedispatcher.include(request, response);}

out.println("..."); //continuare raspuns propriu servletuluiout.close();

Tehnologii Java – p.30/47

Comunicarea prin atribute

Servleturile pot comunica prin intermediul atributelor .Atributele sunt perechi de tipul nume-valoare, gestionatede contextul de executie .Pentru a evita conflictele numele atributelor au uzualforma:nume-servlet.nume-atribut.Metodele de manipulare a atributelor sunt în clasaServletContext :

setAttribute

getAttribute

removeAttribute

Tehnologii Java – p.31/47

Sesiuni de lucru

Tehnologii Java – p.32/47

Ce este o sesiune de lucru ?

Pastrarea unei sesiuni de lucru se refera la memorareaclientului care a adresat o cerere unui servlet.

Protocoalele Internet sunt de doua tipuri:

cu stare (stateful): telnet, FTP

fara stare (stateless): HTTP

Asadar, servleturile trebuie sa utilizeze diverse tehnicipentru pastrarea sesiunilor.

Tehnologii Java – p.33/47

Pastrarea unei sesiuni

Folosirea cookie -urilor.

Rescrierea URL-ului apelat (URL rewriting).

Câmpuri ascunse în formulare.

Fiecare sesiune are un identificator unic (ID).O sesiune persista pentru o anumita perioada de timp,care poate fi si indefinita.Pastrarea sesiunilor va fi realizata folosind clasaHttpSession .

Tehnologii Java – p.34/47

Clasa HttpSession

Un obiect al acestei clase permite stocarea datelor uneisesiuni si asocierea între un utilizator si datele sesiuniisale de pe server.Etapele de baza în folosirea unui obiect HttpSessionsunt:

Obtinerea (crearea) unei sesiuni.

Citirea sau scrierea datelor folosind acest obiect.

Terminarea sesiunii (invalidarea ei).

Tehnologii Java – p.35/47

Obtinerea (crearea) unei sesiuni

Crearea unei sesiuni se realizeaza cu metodagetSession a clasei HttpServletRequest .public void doGet(HttpServletRequest req, HttpServletResponse res)

throws IOException {HttpSession session = req.getSession(true);...out = res.getWriter();...

}

Alte metode utile:isNew

getCreationTime

getLastAccessedTime

Tehnologii Java – p.36/47

Date specifice sesiunii

Tehnologii Java – p.37/47

Gestionarea unei sesiuni

Un obiect de tip HttpSession gestioneaza:

Propriet ati standard ale unei sesiuni, cum ar fiidentificatorul sesiunii.

Date specifice sesiunii, memorate sub forma uneicolectii de perechi cheie-valoare .

Cheia este de tip String si este uzual de forma:nume-servlet.nume-proprietate.Valoarea este de tip Object.Metodele folosite pentru manipularea acestor informatiisunt: setAttribute , getAttribute

Tehnologii Java – p.38/47

Exemplu de folosire a unei sesiuni

Suma unor numere trimise de client.ServletContext context = config.getServletContext();HttpSession session = request.getSession(true);double numar; //parametrul trimis ca argument de clientnumar = Double.parseDouble(request.getParameter("numar"));if (session.isNew())

suma = new Double(0);else

suma = (Double)session.getAttribute("MyServlet.suma");}}suma = new Double(suma.doubleValue() + numar);session.putAttribute("MyServlet.suma", suma);}...

Tehnologii Java – p.39/47

Terminarea unei sesiuni

Apelul metodei invalidate ,

Automat la expirarea timpului maxim de inactivitatepe care servletul l-a specificat pentru sesiunearespectiva cu metoda setMaxInactiveInterval .

...if (numar==0) {

session.invalidate();}context.log("sesiune invalidata");//raspundem clientului ca s-a terminat sesiuneaout.println("<h1> Sesiune terminata </h1>");out.println("</html>");out.close();return;

}...

Tehnologii Java – p.40/47

Cookie-uri dezactivate

Implicit, obiectele de tip HttpSession folosesccookie-uri pentru pastrarea sesiunii.Pentru a fi utilizabil în toate situatiile un servlet trebuie sa:

genereze dinamic formularele

rescrie URL-ul de la atributul ACTION, daca estenecesar.

Tehnologii Java – p.41/47

Rescrierea URL-ului unui servlet

...String urlServlet="http://localhost:8080/servlet/MyServlet";if (<Apel pentru formular>) {

//Generam formularulout.println("<HTML><FORM METHOD=GET ACTION=" +

response.encodeUrl(urlServlet)} + " >");...out.println("</FORM>"</HTML>);out.close();return;

}//S-au primit datele din formular//Construim dinamic raspunsul propriu-zis

...

http://localhost:8080/servlet/MyServlet;jsessionid=935244D5D07441895052477146C371D3?param1 = val1& param2 = val2 ...

Tehnologii Java – p.42/47

Folosirea explicita a cookie-urilor

Tehnologii Java – p.43/47

Cookie-uri

Cookie-urile reprezinta o modalitate pentru o aplicatie ceruleaza la nivelul serverului sa trimita o informatieclientului care sa fie memorata local pe masina acestuia.Un cookie este compus din trei siruri:

(nume, valoare, comentarii) ,si este modelat de catre clasa Cookie .

Tehnologii Java – p.44/47

Salvarea / Restaurarea cookie-urilor

Salvarea

Instantierea unui obiect de tip Cookie

Setarea atributelor

Trimiterea cookie-ului prin intermediul obiectuluiHttpServletResponse

Restaurarea

Obtinerea tuturor cookie-urilor primite odata cucererea clientului

Gasirea cookie-ului cu numele cautat

Extragerea valorii din cookie-ul gasit

Tehnologii Java – p.45/47

Exemplu de utilizare

Sa rescriem exemplul cu suma numerelor primite://Preluarea vechii valorisuma = 0;Cookie theCookie=null;Cookie cookies[] = request.getCookies();if (cookies != null) {

for (int i=0; i<cookies.length; i++) {theCookie = cookies[i];if (theCookie.getName().equals("CookieServlet.suma")) {

suma = Double.parseDouble(theCookie.getValue());break;

}}}...//Salvam suma actualizatatheCookie = new Cookie("CookieServlet.suma", Double.toString(suma));theCookie.setComment("suma numerelor primite");}response.setContentType("text/html");response.addCookie(theCookie);...

Tehnologii Java – p.46/47

Durata de viata a unui cookie

Implicit, durata de viata a unui cookie coincide cu duratasesiunii de lucru. Explicit, ea poate fi controlata prinmetoda setMaxAge ce poate avea ca argument:

> 0: durata de viata în secunde

0 : sterge cookie-ul de pe masina clientului

< 0: situatia implicitaif (numar==0)

theCookie.setMaxAge(0);else

theCookie.setMaxAge(5);

Tehnologii Java – p.47/47