Tehnologii Java - Alexandru Ioan Cuza Universityacf/tj/slides/servleturi... · 2013-10-08 ·...
Transcript of Tehnologii Java - Alexandru Ioan Cuza Universityacf/tj/slides/servleturi... · 2013-10-08 ·...
Tehnologii JavaCurs -
Cristian Frasinaru
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=’[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
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