Post on 23-Feb-2020
Tehnologii JavaCurs -
Cristian Frasinaru
acf@infoiasi.ro
Facultatea de Informatica
Universitatea ”Al. I. Cuza” Iasi
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
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
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=’ion@yahoo.com’
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
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
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
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
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
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