elemente de programare web in java

8
1 SERVLETI SI PAGINI JSP Tehnologia bazatã pe servleti Java Un server Web dirijeazã fiecare cerere HTTP cãtre o secventã de cod (PHP, Java, etc). Primul pas în trecerea de la tehnologia CGI la o tehnologie bazatã pe limbajul Java a fost introducerea de clase “servlet” simultan cu extinderea programelor server astfel ca sã poatã recunoaste si trata servleti. Un servlet este o clasã Java care primeste si interpreteazã cererile HTTP primite de la browser, dupã care transmite un rãspuns sub forma unei pagini HTML cãtre browser. O cerere HTTP contine : - numele metodei HTTP: GET, POST,PUT,DELETE, OPTIONS,HEAD - adresa URL a serverului si numele (contextul) aplicatiei, de forma: http://host:port/context-root/ - calea cãtre componenta (componentele) care va trata cererea si numele componentei (dacã nu este specificat numele componentei atunci se considerã un nume implicit, cum ar fi index.html sau index.jsp, functie de server, care se adaugã automat unei cereri partiale). Exemplu: http://localhost:8080/app1 devine: http://localhost:8080/app1/index.jsp - versiunea HTTP - parametrii prin care se transmit date cãtre server Rãspunsul de la server la o cerere HTTP contine versiunea HTTP, un cod numeric de rãspuns si un document (de obicei HTML), dacã nu au fost erori. Codul de rãspuns 200 corespunde primirii unui rãspuns valid, 401= eroare (cerere nepermisã), 402= eroare (URI inexistent), 500=eroare internã de server. Metoda GET este folositã pentru interogarea aplicatiei din server si poate contine un numãr redus de date: adresa URL a unei resurse si, eventual o serie de parametri (nume si valoare). Metoda POST este folositã pentru actualizarea (modificarea) unei resurse si poate contine mai multe date decât metoda GET (date folosite în actualizarea resursei). Un servlet este o componenta Web scrisã în Java, care genereazã continut dinamic si este gestionatã de un container (de servleti). Un container (numit si “servlet engine”) este o extensie a unui server Web care asigurã functiile cerute de servleti. Un servlet interactioneazã cu clientii Web conform modelului cerere/rãspuns implementat de cãtre containerul de servleti. Un container de servleti transformã cererea HTTP de la client într-un obiect de tip HTTPServletRequest , transmis la un servlet (sau pagina JSP) care genereazã un obiect de tip HTTPServletResponse sau transmite cererea unei alte componente Web. Containerul de servleti transforma acest obiect într-un raspuns HTTP, transmis la client. HTTP Request HttpServletRequest 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ã urmãtoarele 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 initializãri. 2. Apeleazã metoda “service” (“doGet’,”doPost”) din servlet transmitând ca argumente un obiect cerere si un obiect raspuns (obiectul rãspuns 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ã rãspunsul 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 Cod de câmp modificat Cod de câmp modificat Cod de câmp modificat

Upload: alex9216

Post on 13-Apr-2016

1 views

Category:

Documents


0 download

DESCRIPTION

Acest material prezintă câteva elemente ale programării web folosind limbajul Java.Tehnologiile prezentate sunt :* tehnologia bazatã pe servleti Java*tehnologia JSP (Java Server Pages)

TRANSCRIPT

Page 1: Elemente de Programare Web in Java

1

SERVLETI SI PAGINI JSP

Tehnologia bazatatilde pe servleti Java Un server Web dirijeazatilde fiecare cerere HTTP catildetre o secventatilde de cod (PHP Java etc)

Primul pas icircn trecerea de la tehnologia CGI la o tehnologie bazatatilde pe limbajul Java a fost introducerea de clase ldquoservletrdquo simultan cu extinderea programelor server astfel ca satilde poatatilde recunoaste si trata servleti Un servlet este o clasatilde Java care primeste si interpreteazatilde cererile HTTP primite de la browser dupatilde care transmite un ratildespuns sub forma unei pagini HTML catildetre browser

O cerere HTTP contine - numele metodei HTTP GET POSTPUTDELETE OPTIONSHEAD - adresa URL a serverului si numele (contextul) aplicatiei de forma httphostportcontext-root - calea catildetre componenta (componentele) care va trata cererea si numele componentei (dacatilde nu este specificat numele componentei atunci se consideratilde un nume implicit cum ar fi indexhtml sau indexjsp functie de server care se adaugatilde automat unei cereri partiale) Exemplu httplocalhost8080app1 devine httplocalhost8080app1indexjsp - versiunea HTTP - parametrii prin care se transmit date catildetre server Ratildespunsul de la server la o cerere HTTP contine versiunea HTTP un cod numeric de ratildespuns si un document (de obicei HTML) dacatilde nu au fost erori Codul de ratildespuns 200 corespunde primirii unui ratildespuns valid 401= eroare (cerere nepermisatilde) 402= eroare (URI inexistent) 500=eroare internatilde de server Metoda GET este folositatilde pentru interogarea aplicatiei din server si poate contine un numatilder redus de date adresa URL a unei resurse si eventual o serie de parametri (nume si valoare) Metoda POST este folositatilde pentru actualizarea (modificarea) unei resurse si poate contine mai multe date decacirct metoda GET (date folosite icircn actualizarea resursei) Un servlet este o componenta Web scrisatilde icircn Java care genereazatilde continut dinamic si este gestionatatilde de un container (de servleti) Un container (numit si ldquoservlet enginerdquo) este o extensie a unui server Web care asiguratilde functiile cerute de servleti Un servlet interactioneazatilde cu clientii Web conform modelului cerereratildespuns implementat de catildetre containerul de servleti Un container de servleti transformatilde cererea HTTP de la client icircntr-un obiect de tip HTTPServletRequest transmis la un servlet (sau pagina JSP) care genereazatilde un obiect de tip HTTPServletResponse sau transmite cererea unei alte componente Web Containerul de servleti transforma acest obiect icircntr-un raspuns HTTP transmis la client

HTTP Request HttpServletRequest 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 oferatilde icircn plus si alte functii comune aplicatiilor Web securitatea si controlul accesului la aplicatii gestiunea tranzactiilor servicii de nume si directoare (JNDI) sa

La primirea unei cereri containerul de servleti realizeazatilde urmatildetoarele actiuni 1 Dacatilde nu existatilde un obiect servlet icircn memorie atunci icircncarcatilde clasa servlet instantiazatilde clasa (se creeazatilde un obiect servlet) si apeleazatilde metoda ldquoinitrdquo din servlet pentru initializatilderi 2 Apeleazatilde metoda ldquoservicerdquo (ldquodoGetrsquordquodoPostrdquo) din servlet transmitacircnd ca argumente un obiect cerere si un obiect raspuns (obiectul ratildespuns va fi completat de metoda service)

Functiile unui servlet sunt realizate icircn metodele service doGet doPost sa Aceste metode extrag informatii din obiectul cerere acceseazatilde resurse externe si completeazatilde ratildespunsul cu informatiile obtinute din resurse externe (cum ar fi baze de date) Parametrii unei cereri apar icircn sirul de cereri (Query String) separat de calea la componenta prin lsquorsquo Numele si valorile parametrilor unei cereri sunt preluate de obicei dintr-un formular (transmis de server si completat

Cod de cacircmp modificat

Cod de cacircmp modificat

Cod de cacircmp modificat

2

de utilizatorul client al aplicatiei) si sunt adatildeugate la URL prin click pe butonul Submit dintr-un formular HTML (sau la apatildesarea tastei Enter) Clasa HttpServletRequest are metode pentru extragerea parametrilor dintr-o cerere de catildetre servlet

String getParameter (String name) valoare parametru cu nume cunoscut Enumeration getParameterNames() iterator pe lista cu numele tuturor parametrilor din cerere

Exemplu de extragere a parametrului cu numele ldquouserrdquo dintr-o cerere de forma httplocalhost8080hellouser=me outprint (ldquolth1gtHello ldquo) outprint (requestgetParameter(ldquouserrdquo)) outprintln (ldquolth1gtrdquo)

Un exemplu simplu de servlet care afiseazatilde ca ratildespuns un mesaj de salut import javaio import javaxservlet import javaxservlethttp public class HelloServlet extends HttpServlet public void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException responsesetContentType(texthtml) PrintWriter out = responsegetWriter() outprintln (ldquo lthtmlgtldquo) outprintln (ldquoltbodygt ldquo) outprintln (ldquolth1gtHello World lth1gt ldquo) outprintln (ldquoltbodygtldquo) outprintln (ldquolthtmlgtldquo)

Mai multi servleti dintr-o aplicatie pot folosi date (atribute) din patru obiecte comune numite ldquoScope Objectsrdquo Web Context accesibil tuturor componentelor dintr-un context (aplicatie) Session accesibil componentelor dintr-o sesiune client Request accesibil componentelor care trateazatilde o cerere Page accesibil paginii JSP care a creat obiectul Intr-o schematilde simplatilde MVC un servlet are rolul de ldquocontrollerrdquo De fapt aplicatiile reale contin mai multi servleti fiecare ldquoservesterdquo o paginatilde diferitatilde din aplicatie Cererile de la clienti sunt primite de un servlet cu rol de dispecer care selecteazatilde un alt servlet din aplicatie icircn functie de parametrii cererii HTTP

Aplicatiile Web cu servleti mai pot folosi filtre interpuse icircntre servleti si cereriratildespunsuri HTTP precum si clase auxiliare (ldquohelpersrdquo) astfel catilde schema completatilde MVC a unei aplicatii Web aratatilde astfel

3

Un filtru atasat unui servlet este folosit fie pentru prelucrarea unei cereri de la client icircnainte de a

ajunge la servlet fie pentru prelucrarea ratildespunsului transmis de servlet Se folosesc filtre pentru autentificarea clientului pentru compresia continutului sau pentru jurnalizare (logging) O altatilde facilitate este atasarea unor ascultatildetori la evenimente din viata unui servlet

O aplicatie Web contine icircn general componente Web resurse statice (imagini de ex) clase si biblioteci auxiliare (ldquohelperrdquo) biblioteci de tag-uri precum si un descriptor de instalare pentru configurarea (adaptarea) aplicatiei la instalarea pe serverul de productie

Dezvoltarea unei aplicatii Web necesitatilde urmatildetoarele etape - Scrierea codului pentru componentele Web - Scrierea descriptorului de instalare (fisier XML) - Compilarea componentelor si claselor auxiliare folosite de ele - Impachetarea fisierelor aplicatiei icircntr-o arhivatilde ldquowarrdquo (optional) - Instalarea aplicatiei pe server (copiere fisier war in directorul din server pentru aplicatii Web)

Instalarea unui servlet pe un server Web (ldquoservlet deploymentrdquo) poate fi staticatilde (icircnainte de a pornireporni un server) sau dinamicatilde (icircn timp ce un server deserveste alte aplicatii) si se poate face icircn mai multe feluri - Se copiazatilde directorul aplicatiei (cu o structuratilde impusatilde) sau o arhivatilde ldquowarrdquo cu continutul acestui director icircn folderul din server destinat acestui scop (ldquowebappsrdquo pentru Apache Tomcat) - Se foloseste programul ldquoantrdquo (cu un fisier ldquobuildxmlrdquo) 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 ldquodeploymentrdquo (de ex Tomcat6 Manager)

Directorul aplicatiei are o structuratilde de subdirectoare impusatilde de specificatiile 22 pentru servleti iar arhivele cu acest format sunt fisiere cu extensia ldquowarrdquo (Web Archive) Structura generalatilde a unui asemenea director este o structuratilde ierarhicatilde cu cacircteva subdirectoare si fisiere obligatorii si cu altele ce depind de complexitatea aplicatiei Numele directorului este asociat la instalare pe server cu un nume de ldquocalerdquo (ldquocontext pathrdquo) nume folosit icircn identificatorul resursei (URI) pentru acces la aplicatia din server

webapp fisiere HTMLJSP WEB-INF classes fisiere cu clase Java lib fisiere ldquojarrdquo cu biblioteci folosite de aplicatie web-xml Atunci cacircnd se arhiveazatilde acest director se mai adaugatilde si un subdirector META-INF cu un fisier

ldquomanifestrdquo (de tip ldquomfrdquo) si eventual cu un fisier ldquocontextxmlrdquo cu optiuni de configurare pentru

4

Tomcat Atunci cacircnd se folosesc fisiere imagine de stil (css) sau altele cerute de fisierele HTML acestea e bine satilde fie grupate icircn subdirectoare cu nume sugestive (ldquoimagesrdquo de ex) Fisierele HTML si JSP sunt cele direct accesibile clientilor aplicatiei Respectarea acestei structuri simplificatilde referintele icircntre componentele aplicatiei Web pentru catilde fisierele din subdirectoarele ldquoclassesrdquo si ldquolibrdquo sunt vizibile celorlalte fisiere din aplicatie fatilderatilde alte

Exemplu simplu de director minimal ldquohellordquo cu o singuratilde clasatilde servlet

hello WEB-INF classes

HelloServletclass webxml

Fisierul ldquoweb-xmlrdquo poate contine

ltxml version=10 encoding=ISO-8859-1gt ltweb-app xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsd version=24gt

ltservletgt ltservlet-namegtHelloServletltservlet-namegt ltservlet-classgtHelloServletltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtHelloServletltservlet-namegt lturl-patterngthellourl-patterngt ltservlet-mappinggt ltweb-appgt

Directorul care contine sursele aplicatiei si folosit icircn dezvoltarea aplicatiei poate avea (si are de obicei) o structuratilde diferitatilde de directorul necesar pentru arhiva ldquowarrdquo 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 (crearestergere de foldere temporare crearestergere de fisiere compilare copiere de fisiere dintr-un folder icircn altul sa)

Intr-o aplicatie mare este preferabil satilde avem mai multi servleti cu roluri bine definite icircn locul unui singur servlet mare Transmiterea obiectelor cerere si ratildespuns icircntre servleti se face prin intermediul unui servlet dispecer Exemplu public class Servlet1 extends HttpServlet public void doGet(HttpServletRequest request HttpServletResponse response) throws Exception hellip RequestDispetcher rd= requestgetRequestDispetcher (ldquoServlet2rdquo) Rdforward(requestresponse) catre Servlet2 hellip

Tehnologia JSP (Java Server Page)

Extinderea exemplului anterior cu includerea icircn mesajul de salut a numelui introdus de utilizator necesitatilde trimiterea la client a unui formular care va fi completat de utilizator cu numele satildeu si va trimis icircnapoi la server Asta icircnseamnatilde catilde icircn servlet vor fi mult mai multe linii pentru scriere icircn fluxul de ratildespuns (ldquooutrdquo) a unor linii HTML (cu taguri si text) Atunci cacircnd documentul HTML trimis de servlet la client este mult mai mare decacirct partea de logicatilde din aplicatie (realizatatilde prin instructiuni Java) este preferabil satilde se includatilde fragmentele de cod Java icircn documentul HTML si nu invers asa cum se icircntacircmplatilde icircntr-un servlet (care contine cod Java pentru prelucrare cereri si scriere de fragmente de HTML icircn pagina de ratildespuns) Tehnologia JSP permite crearea de continut Web cu elemente statice si dinamice Ea

5

extinde tehnologia bazatatilde pe servleti Java (ptr crearea de continut dinamic) dar permite un mod mai natural de a specifica continutul static (HTMLXHTML)

Ideia paginilor JSP este de a extinde paginile HTML cu fragmente de cod Java incluse icircntre tag-uri delimitate de ldquoltrdquo si ldquogtrdquo Paginile JSP sunt transformate (compilate) automat icircn servleti de catildetre un motor JSP (JSP Engine)

Codul Java folosit de o paginatilde JSP are forma unor componente JavaBean adicatilde foloseste metode de tip ldquogetrdquo si ldquosetrdquo pentru acces la proprietatildetile clasei (la datele dintr-un obiect) Tag-ul ltjsp useBean gt instantiazatilde o clasatilde JavaBean si atribuie un identificator acestui obiect care va fi folosit icircn alte taguri de acces la proprietatildeti ltjspsetProperty gt ltjspgetProperty gt Existatilde un numatilder relativ mare de taguri predefinite (icircntr-o bibliotecatilde de taguri de bazatilde) si se pot defini alte biblioteci de taguri Exemplu de fisier JSP

lt page import=helloNameHandler gt ltjspuseBean id=mybean scope=page class=helloNameHandler gt ltjspsetProperty name=mybean property= gt lthtmlgt ltheadgtlttitlegtHello Userlttitlegtltheadgt lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtMy name is Duke Whats yourslth1gt lttdgt lttrgt lttrgt lttd width=150 ampnbsp lttdgt lttd width=550gt ltform method=getgt ltinput type=text name=username size=25gt ltbrgt ltinput type=submit value=Submitgt lttdgt lttrgt ltformgt lttablegt lt if ( requestgetParameter(username) = null ) gt lt include file=responsejsp gt lt gt ltbodygt lthtmlgt

Fisierul ldquoresponsejsprdquo poate aratildeta astfel lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtHello ltjspgetProperty name=mybean property=username gt lth1gt lttdgt lttrgt lttablegt

Clasa Java folositatilde de pagina JSP este banalatilde icircn acest exemplu

6

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 dacatilde s-ar cere autentificarea utilizatorilor care acceseazatilde aplicatia prin catildeutarea numelor acestora icircntr-un tabel dintr-o bazatilde de date Exemplul urmatildetor care icircnsoteste server-ul Tomcat este un joc de ghicire de catildetre utilizatorul aplicatiei a unui numatilder generat aleator icircn server si are o logicatilde a aplicatiei ceva mai complexatilde lt page import = numNumberGuessBean gt ltjspuseBean id=numguess class=numNumberGuessBean scope=sessiongt ltjspsetProperty name=numguess property=gt lthtmlgt ltheadgtlttitlegtNumber Guesslttitlegtltheadgt ltbodygt lt if (numguessgetSuccess()) gt You got it after lt= numguessgetNumGuesses() gt tries ltpgt lt numguessreset() gt lta href=numguessjspgttry againltagt lt else if (numguessgetNumGuesses() == 0) gt Welcome to the Number Guess gameltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt else gt Try ltbgtlt= numguessgetHint() gtltbgt You have made lt= numguessgetNumGuesses() gt guessesltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt gt ltbodygt lthtmlgt

Clasa JavaBean fatilderatilde comentariile initiale aratatilde astfel package num import javautil public class NumberGuessBean int answer boolean success String hint int numGuesses public NumberGuessBean() reset() public void reset() answer = Mathabs(new Random()nextInt() 10) + 1 success = false numGuesses = 0

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 2: Elemente de Programare Web in Java

2

de utilizatorul client al aplicatiei) si sunt adatildeugate la URL prin click pe butonul Submit dintr-un formular HTML (sau la apatildesarea tastei Enter) Clasa HttpServletRequest are metode pentru extragerea parametrilor dintr-o cerere de catildetre servlet

String getParameter (String name) valoare parametru cu nume cunoscut Enumeration getParameterNames() iterator pe lista cu numele tuturor parametrilor din cerere

Exemplu de extragere a parametrului cu numele ldquouserrdquo dintr-o cerere de forma httplocalhost8080hellouser=me outprint (ldquolth1gtHello ldquo) outprint (requestgetParameter(ldquouserrdquo)) outprintln (ldquolth1gtrdquo)

Un exemplu simplu de servlet care afiseazatilde ca ratildespuns un mesaj de salut import javaio import javaxservlet import javaxservlethttp public class HelloServlet extends HttpServlet public void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException responsesetContentType(texthtml) PrintWriter out = responsegetWriter() outprintln (ldquo lthtmlgtldquo) outprintln (ldquoltbodygt ldquo) outprintln (ldquolth1gtHello World lth1gt ldquo) outprintln (ldquoltbodygtldquo) outprintln (ldquolthtmlgtldquo)

Mai multi servleti dintr-o aplicatie pot folosi date (atribute) din patru obiecte comune numite ldquoScope Objectsrdquo Web Context accesibil tuturor componentelor dintr-un context (aplicatie) Session accesibil componentelor dintr-o sesiune client Request accesibil componentelor care trateazatilde o cerere Page accesibil paginii JSP care a creat obiectul Intr-o schematilde simplatilde MVC un servlet are rolul de ldquocontrollerrdquo De fapt aplicatiile reale contin mai multi servleti fiecare ldquoservesterdquo o paginatilde diferitatilde din aplicatie Cererile de la clienti sunt primite de un servlet cu rol de dispecer care selecteazatilde un alt servlet din aplicatie icircn functie de parametrii cererii HTTP

Aplicatiile Web cu servleti mai pot folosi filtre interpuse icircntre servleti si cereriratildespunsuri HTTP precum si clase auxiliare (ldquohelpersrdquo) astfel catilde schema completatilde MVC a unei aplicatii Web aratatilde astfel

3

Un filtru atasat unui servlet este folosit fie pentru prelucrarea unei cereri de la client icircnainte de a

ajunge la servlet fie pentru prelucrarea ratildespunsului transmis de servlet Se folosesc filtre pentru autentificarea clientului pentru compresia continutului sau pentru jurnalizare (logging) O altatilde facilitate este atasarea unor ascultatildetori la evenimente din viata unui servlet

O aplicatie Web contine icircn general componente Web resurse statice (imagini de ex) clase si biblioteci auxiliare (ldquohelperrdquo) biblioteci de tag-uri precum si un descriptor de instalare pentru configurarea (adaptarea) aplicatiei la instalarea pe serverul de productie

Dezvoltarea unei aplicatii Web necesitatilde urmatildetoarele etape - Scrierea codului pentru componentele Web - Scrierea descriptorului de instalare (fisier XML) - Compilarea componentelor si claselor auxiliare folosite de ele - Impachetarea fisierelor aplicatiei icircntr-o arhivatilde ldquowarrdquo (optional) - Instalarea aplicatiei pe server (copiere fisier war in directorul din server pentru aplicatii Web)

Instalarea unui servlet pe un server Web (ldquoservlet deploymentrdquo) poate fi staticatilde (icircnainte de a pornireporni un server) sau dinamicatilde (icircn timp ce un server deserveste alte aplicatii) si se poate face icircn mai multe feluri - Se copiazatilde directorul aplicatiei (cu o structuratilde impusatilde) sau o arhivatilde ldquowarrdquo cu continutul acestui director icircn folderul din server destinat acestui scop (ldquowebappsrdquo pentru Apache Tomcat) - Se foloseste programul ldquoantrdquo (cu un fisier ldquobuildxmlrdquo) 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 ldquodeploymentrdquo (de ex Tomcat6 Manager)

Directorul aplicatiei are o structuratilde de subdirectoare impusatilde de specificatiile 22 pentru servleti iar arhivele cu acest format sunt fisiere cu extensia ldquowarrdquo (Web Archive) Structura generalatilde a unui asemenea director este o structuratilde ierarhicatilde cu cacircteva subdirectoare si fisiere obligatorii si cu altele ce depind de complexitatea aplicatiei Numele directorului este asociat la instalare pe server cu un nume de ldquocalerdquo (ldquocontext pathrdquo) nume folosit icircn identificatorul resursei (URI) pentru acces la aplicatia din server

webapp fisiere HTMLJSP WEB-INF classes fisiere cu clase Java lib fisiere ldquojarrdquo cu biblioteci folosite de aplicatie web-xml Atunci cacircnd se arhiveazatilde acest director se mai adaugatilde si un subdirector META-INF cu un fisier

ldquomanifestrdquo (de tip ldquomfrdquo) si eventual cu un fisier ldquocontextxmlrdquo cu optiuni de configurare pentru

4

Tomcat Atunci cacircnd se folosesc fisiere imagine de stil (css) sau altele cerute de fisierele HTML acestea e bine satilde fie grupate icircn subdirectoare cu nume sugestive (ldquoimagesrdquo de ex) Fisierele HTML si JSP sunt cele direct accesibile clientilor aplicatiei Respectarea acestei structuri simplificatilde referintele icircntre componentele aplicatiei Web pentru catilde fisierele din subdirectoarele ldquoclassesrdquo si ldquolibrdquo sunt vizibile celorlalte fisiere din aplicatie fatilderatilde alte

Exemplu simplu de director minimal ldquohellordquo cu o singuratilde clasatilde servlet

hello WEB-INF classes

HelloServletclass webxml

Fisierul ldquoweb-xmlrdquo poate contine

ltxml version=10 encoding=ISO-8859-1gt ltweb-app xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsd version=24gt

ltservletgt ltservlet-namegtHelloServletltservlet-namegt ltservlet-classgtHelloServletltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtHelloServletltservlet-namegt lturl-patterngthellourl-patterngt ltservlet-mappinggt ltweb-appgt

Directorul care contine sursele aplicatiei si folosit icircn dezvoltarea aplicatiei poate avea (si are de obicei) o structuratilde diferitatilde de directorul necesar pentru arhiva ldquowarrdquo 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 (crearestergere de foldere temporare crearestergere de fisiere compilare copiere de fisiere dintr-un folder icircn altul sa)

Intr-o aplicatie mare este preferabil satilde avem mai multi servleti cu roluri bine definite icircn locul unui singur servlet mare Transmiterea obiectelor cerere si ratildespuns icircntre servleti se face prin intermediul unui servlet dispecer Exemplu public class Servlet1 extends HttpServlet public void doGet(HttpServletRequest request HttpServletResponse response) throws Exception hellip RequestDispetcher rd= requestgetRequestDispetcher (ldquoServlet2rdquo) Rdforward(requestresponse) catre Servlet2 hellip

Tehnologia JSP (Java Server Page)

Extinderea exemplului anterior cu includerea icircn mesajul de salut a numelui introdus de utilizator necesitatilde trimiterea la client a unui formular care va fi completat de utilizator cu numele satildeu si va trimis icircnapoi la server Asta icircnseamnatilde catilde icircn servlet vor fi mult mai multe linii pentru scriere icircn fluxul de ratildespuns (ldquooutrdquo) a unor linii HTML (cu taguri si text) Atunci cacircnd documentul HTML trimis de servlet la client este mult mai mare decacirct partea de logicatilde din aplicatie (realizatatilde prin instructiuni Java) este preferabil satilde se includatilde fragmentele de cod Java icircn documentul HTML si nu invers asa cum se icircntacircmplatilde icircntr-un servlet (care contine cod Java pentru prelucrare cereri si scriere de fragmente de HTML icircn pagina de ratildespuns) Tehnologia JSP permite crearea de continut Web cu elemente statice si dinamice Ea

5

extinde tehnologia bazatatilde pe servleti Java (ptr crearea de continut dinamic) dar permite un mod mai natural de a specifica continutul static (HTMLXHTML)

Ideia paginilor JSP este de a extinde paginile HTML cu fragmente de cod Java incluse icircntre tag-uri delimitate de ldquoltrdquo si ldquogtrdquo Paginile JSP sunt transformate (compilate) automat icircn servleti de catildetre un motor JSP (JSP Engine)

Codul Java folosit de o paginatilde JSP are forma unor componente JavaBean adicatilde foloseste metode de tip ldquogetrdquo si ldquosetrdquo pentru acces la proprietatildetile clasei (la datele dintr-un obiect) Tag-ul ltjsp useBean gt instantiazatilde o clasatilde JavaBean si atribuie un identificator acestui obiect care va fi folosit icircn alte taguri de acces la proprietatildeti ltjspsetProperty gt ltjspgetProperty gt Existatilde un numatilder relativ mare de taguri predefinite (icircntr-o bibliotecatilde de taguri de bazatilde) si se pot defini alte biblioteci de taguri Exemplu de fisier JSP

lt page import=helloNameHandler gt ltjspuseBean id=mybean scope=page class=helloNameHandler gt ltjspsetProperty name=mybean property= gt lthtmlgt ltheadgtlttitlegtHello Userlttitlegtltheadgt lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtMy name is Duke Whats yourslth1gt lttdgt lttrgt lttrgt lttd width=150 ampnbsp lttdgt lttd width=550gt ltform method=getgt ltinput type=text name=username size=25gt ltbrgt ltinput type=submit value=Submitgt lttdgt lttrgt ltformgt lttablegt lt if ( requestgetParameter(username) = null ) gt lt include file=responsejsp gt lt gt ltbodygt lthtmlgt

Fisierul ldquoresponsejsprdquo poate aratildeta astfel lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtHello ltjspgetProperty name=mybean property=username gt lth1gt lttdgt lttrgt lttablegt

Clasa Java folositatilde de pagina JSP este banalatilde icircn acest exemplu

6

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 dacatilde s-ar cere autentificarea utilizatorilor care acceseazatilde aplicatia prin catildeutarea numelor acestora icircntr-un tabel dintr-o bazatilde de date Exemplul urmatildetor care icircnsoteste server-ul Tomcat este un joc de ghicire de catildetre utilizatorul aplicatiei a unui numatilder generat aleator icircn server si are o logicatilde a aplicatiei ceva mai complexatilde lt page import = numNumberGuessBean gt ltjspuseBean id=numguess class=numNumberGuessBean scope=sessiongt ltjspsetProperty name=numguess property=gt lthtmlgt ltheadgtlttitlegtNumber Guesslttitlegtltheadgt ltbodygt lt if (numguessgetSuccess()) gt You got it after lt= numguessgetNumGuesses() gt tries ltpgt lt numguessreset() gt lta href=numguessjspgttry againltagt lt else if (numguessgetNumGuesses() == 0) gt Welcome to the Number Guess gameltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt else gt Try ltbgtlt= numguessgetHint() gtltbgt You have made lt= numguessgetNumGuesses() gt guessesltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt gt ltbodygt lthtmlgt

Clasa JavaBean fatilderatilde comentariile initiale aratatilde astfel package num import javautil public class NumberGuessBean int answer boolean success String hint int numGuesses public NumberGuessBean() reset() public void reset() answer = Mathabs(new Random()nextInt() 10) + 1 success = false numGuesses = 0

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 3: Elemente de Programare Web in Java

3

Un filtru atasat unui servlet este folosit fie pentru prelucrarea unei cereri de la client icircnainte de a

ajunge la servlet fie pentru prelucrarea ratildespunsului transmis de servlet Se folosesc filtre pentru autentificarea clientului pentru compresia continutului sau pentru jurnalizare (logging) O altatilde facilitate este atasarea unor ascultatildetori la evenimente din viata unui servlet

O aplicatie Web contine icircn general componente Web resurse statice (imagini de ex) clase si biblioteci auxiliare (ldquohelperrdquo) biblioteci de tag-uri precum si un descriptor de instalare pentru configurarea (adaptarea) aplicatiei la instalarea pe serverul de productie

Dezvoltarea unei aplicatii Web necesitatilde urmatildetoarele etape - Scrierea codului pentru componentele Web - Scrierea descriptorului de instalare (fisier XML) - Compilarea componentelor si claselor auxiliare folosite de ele - Impachetarea fisierelor aplicatiei icircntr-o arhivatilde ldquowarrdquo (optional) - Instalarea aplicatiei pe server (copiere fisier war in directorul din server pentru aplicatii Web)

Instalarea unui servlet pe un server Web (ldquoservlet deploymentrdquo) poate fi staticatilde (icircnainte de a pornireporni un server) sau dinamicatilde (icircn timp ce un server deserveste alte aplicatii) si se poate face icircn mai multe feluri - Se copiazatilde directorul aplicatiei (cu o structuratilde impusatilde) sau o arhivatilde ldquowarrdquo cu continutul acestui director icircn folderul din server destinat acestui scop (ldquowebappsrdquo pentru Apache Tomcat) - Se foloseste programul ldquoantrdquo (cu un fisier ldquobuildxmlrdquo) 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 ldquodeploymentrdquo (de ex Tomcat6 Manager)

Directorul aplicatiei are o structuratilde de subdirectoare impusatilde de specificatiile 22 pentru servleti iar arhivele cu acest format sunt fisiere cu extensia ldquowarrdquo (Web Archive) Structura generalatilde a unui asemenea director este o structuratilde ierarhicatilde cu cacircteva subdirectoare si fisiere obligatorii si cu altele ce depind de complexitatea aplicatiei Numele directorului este asociat la instalare pe server cu un nume de ldquocalerdquo (ldquocontext pathrdquo) nume folosit icircn identificatorul resursei (URI) pentru acces la aplicatia din server

webapp fisiere HTMLJSP WEB-INF classes fisiere cu clase Java lib fisiere ldquojarrdquo cu biblioteci folosite de aplicatie web-xml Atunci cacircnd se arhiveazatilde acest director se mai adaugatilde si un subdirector META-INF cu un fisier

ldquomanifestrdquo (de tip ldquomfrdquo) si eventual cu un fisier ldquocontextxmlrdquo cu optiuni de configurare pentru

4

Tomcat Atunci cacircnd se folosesc fisiere imagine de stil (css) sau altele cerute de fisierele HTML acestea e bine satilde fie grupate icircn subdirectoare cu nume sugestive (ldquoimagesrdquo de ex) Fisierele HTML si JSP sunt cele direct accesibile clientilor aplicatiei Respectarea acestei structuri simplificatilde referintele icircntre componentele aplicatiei Web pentru catilde fisierele din subdirectoarele ldquoclassesrdquo si ldquolibrdquo sunt vizibile celorlalte fisiere din aplicatie fatilderatilde alte

Exemplu simplu de director minimal ldquohellordquo cu o singuratilde clasatilde servlet

hello WEB-INF classes

HelloServletclass webxml

Fisierul ldquoweb-xmlrdquo poate contine

ltxml version=10 encoding=ISO-8859-1gt ltweb-app xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsd version=24gt

ltservletgt ltservlet-namegtHelloServletltservlet-namegt ltservlet-classgtHelloServletltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtHelloServletltservlet-namegt lturl-patterngthellourl-patterngt ltservlet-mappinggt ltweb-appgt

Directorul care contine sursele aplicatiei si folosit icircn dezvoltarea aplicatiei poate avea (si are de obicei) o structuratilde diferitatilde de directorul necesar pentru arhiva ldquowarrdquo 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 (crearestergere de foldere temporare crearestergere de fisiere compilare copiere de fisiere dintr-un folder icircn altul sa)

Intr-o aplicatie mare este preferabil satilde avem mai multi servleti cu roluri bine definite icircn locul unui singur servlet mare Transmiterea obiectelor cerere si ratildespuns icircntre servleti se face prin intermediul unui servlet dispecer Exemplu public class Servlet1 extends HttpServlet public void doGet(HttpServletRequest request HttpServletResponse response) throws Exception hellip RequestDispetcher rd= requestgetRequestDispetcher (ldquoServlet2rdquo) Rdforward(requestresponse) catre Servlet2 hellip

Tehnologia JSP (Java Server Page)

Extinderea exemplului anterior cu includerea icircn mesajul de salut a numelui introdus de utilizator necesitatilde trimiterea la client a unui formular care va fi completat de utilizator cu numele satildeu si va trimis icircnapoi la server Asta icircnseamnatilde catilde icircn servlet vor fi mult mai multe linii pentru scriere icircn fluxul de ratildespuns (ldquooutrdquo) a unor linii HTML (cu taguri si text) Atunci cacircnd documentul HTML trimis de servlet la client este mult mai mare decacirct partea de logicatilde din aplicatie (realizatatilde prin instructiuni Java) este preferabil satilde se includatilde fragmentele de cod Java icircn documentul HTML si nu invers asa cum se icircntacircmplatilde icircntr-un servlet (care contine cod Java pentru prelucrare cereri si scriere de fragmente de HTML icircn pagina de ratildespuns) Tehnologia JSP permite crearea de continut Web cu elemente statice si dinamice Ea

5

extinde tehnologia bazatatilde pe servleti Java (ptr crearea de continut dinamic) dar permite un mod mai natural de a specifica continutul static (HTMLXHTML)

Ideia paginilor JSP este de a extinde paginile HTML cu fragmente de cod Java incluse icircntre tag-uri delimitate de ldquoltrdquo si ldquogtrdquo Paginile JSP sunt transformate (compilate) automat icircn servleti de catildetre un motor JSP (JSP Engine)

Codul Java folosit de o paginatilde JSP are forma unor componente JavaBean adicatilde foloseste metode de tip ldquogetrdquo si ldquosetrdquo pentru acces la proprietatildetile clasei (la datele dintr-un obiect) Tag-ul ltjsp useBean gt instantiazatilde o clasatilde JavaBean si atribuie un identificator acestui obiect care va fi folosit icircn alte taguri de acces la proprietatildeti ltjspsetProperty gt ltjspgetProperty gt Existatilde un numatilder relativ mare de taguri predefinite (icircntr-o bibliotecatilde de taguri de bazatilde) si se pot defini alte biblioteci de taguri Exemplu de fisier JSP

lt page import=helloNameHandler gt ltjspuseBean id=mybean scope=page class=helloNameHandler gt ltjspsetProperty name=mybean property= gt lthtmlgt ltheadgtlttitlegtHello Userlttitlegtltheadgt lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtMy name is Duke Whats yourslth1gt lttdgt lttrgt lttrgt lttd width=150 ampnbsp lttdgt lttd width=550gt ltform method=getgt ltinput type=text name=username size=25gt ltbrgt ltinput type=submit value=Submitgt lttdgt lttrgt ltformgt lttablegt lt if ( requestgetParameter(username) = null ) gt lt include file=responsejsp gt lt gt ltbodygt lthtmlgt

Fisierul ldquoresponsejsprdquo poate aratildeta astfel lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtHello ltjspgetProperty name=mybean property=username gt lth1gt lttdgt lttrgt lttablegt

Clasa Java folositatilde de pagina JSP este banalatilde icircn acest exemplu

6

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 dacatilde s-ar cere autentificarea utilizatorilor care acceseazatilde aplicatia prin catildeutarea numelor acestora icircntr-un tabel dintr-o bazatilde de date Exemplul urmatildetor care icircnsoteste server-ul Tomcat este un joc de ghicire de catildetre utilizatorul aplicatiei a unui numatilder generat aleator icircn server si are o logicatilde a aplicatiei ceva mai complexatilde lt page import = numNumberGuessBean gt ltjspuseBean id=numguess class=numNumberGuessBean scope=sessiongt ltjspsetProperty name=numguess property=gt lthtmlgt ltheadgtlttitlegtNumber Guesslttitlegtltheadgt ltbodygt lt if (numguessgetSuccess()) gt You got it after lt= numguessgetNumGuesses() gt tries ltpgt lt numguessreset() gt lta href=numguessjspgttry againltagt lt else if (numguessgetNumGuesses() == 0) gt Welcome to the Number Guess gameltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt else gt Try ltbgtlt= numguessgetHint() gtltbgt You have made lt= numguessgetNumGuesses() gt guessesltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt gt ltbodygt lthtmlgt

Clasa JavaBean fatilderatilde comentariile initiale aratatilde astfel package num import javautil public class NumberGuessBean int answer boolean success String hint int numGuesses public NumberGuessBean() reset() public void reset() answer = Mathabs(new Random()nextInt() 10) + 1 success = false numGuesses = 0

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 4: Elemente de Programare Web in Java

4

Tomcat Atunci cacircnd se folosesc fisiere imagine de stil (css) sau altele cerute de fisierele HTML acestea e bine satilde fie grupate icircn subdirectoare cu nume sugestive (ldquoimagesrdquo de ex) Fisierele HTML si JSP sunt cele direct accesibile clientilor aplicatiei Respectarea acestei structuri simplificatilde referintele icircntre componentele aplicatiei Web pentru catilde fisierele din subdirectoarele ldquoclassesrdquo si ldquolibrdquo sunt vizibile celorlalte fisiere din aplicatie fatilderatilde alte

Exemplu simplu de director minimal ldquohellordquo cu o singuratilde clasatilde servlet

hello WEB-INF classes

HelloServletclass webxml

Fisierul ldquoweb-xmlrdquo poate contine

ltxml version=10 encoding=ISO-8859-1gt ltweb-app xmlns=httpjavasuncomxmlnsj2ee xmlnsxsi=httpwwww3org2001XMLSchema-instance xsischemaLocation=httpjavasuncomxmlnsj2ee httpjavasuncomxmlnsj2eeweb-app_2_4xsd version=24gt

ltservletgt ltservlet-namegtHelloServletltservlet-namegt ltservlet-classgtHelloServletltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtHelloServletltservlet-namegt lturl-patterngthellourl-patterngt ltservlet-mappinggt ltweb-appgt

Directorul care contine sursele aplicatiei si folosit icircn dezvoltarea aplicatiei poate avea (si are de obicei) o structuratilde diferitatilde de directorul necesar pentru arhiva ldquowarrdquo 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 (crearestergere de foldere temporare crearestergere de fisiere compilare copiere de fisiere dintr-un folder icircn altul sa)

Intr-o aplicatie mare este preferabil satilde avem mai multi servleti cu roluri bine definite icircn locul unui singur servlet mare Transmiterea obiectelor cerere si ratildespuns icircntre servleti se face prin intermediul unui servlet dispecer Exemplu public class Servlet1 extends HttpServlet public void doGet(HttpServletRequest request HttpServletResponse response) throws Exception hellip RequestDispetcher rd= requestgetRequestDispetcher (ldquoServlet2rdquo) Rdforward(requestresponse) catre Servlet2 hellip

Tehnologia JSP (Java Server Page)

Extinderea exemplului anterior cu includerea icircn mesajul de salut a numelui introdus de utilizator necesitatilde trimiterea la client a unui formular care va fi completat de utilizator cu numele satildeu si va trimis icircnapoi la server Asta icircnseamnatilde catilde icircn servlet vor fi mult mai multe linii pentru scriere icircn fluxul de ratildespuns (ldquooutrdquo) a unor linii HTML (cu taguri si text) Atunci cacircnd documentul HTML trimis de servlet la client este mult mai mare decacirct partea de logicatilde din aplicatie (realizatatilde prin instructiuni Java) este preferabil satilde se includatilde fragmentele de cod Java icircn documentul HTML si nu invers asa cum se icircntacircmplatilde icircntr-un servlet (care contine cod Java pentru prelucrare cereri si scriere de fragmente de HTML icircn pagina de ratildespuns) Tehnologia JSP permite crearea de continut Web cu elemente statice si dinamice Ea

5

extinde tehnologia bazatatilde pe servleti Java (ptr crearea de continut dinamic) dar permite un mod mai natural de a specifica continutul static (HTMLXHTML)

Ideia paginilor JSP este de a extinde paginile HTML cu fragmente de cod Java incluse icircntre tag-uri delimitate de ldquoltrdquo si ldquogtrdquo Paginile JSP sunt transformate (compilate) automat icircn servleti de catildetre un motor JSP (JSP Engine)

Codul Java folosit de o paginatilde JSP are forma unor componente JavaBean adicatilde foloseste metode de tip ldquogetrdquo si ldquosetrdquo pentru acces la proprietatildetile clasei (la datele dintr-un obiect) Tag-ul ltjsp useBean gt instantiazatilde o clasatilde JavaBean si atribuie un identificator acestui obiect care va fi folosit icircn alte taguri de acces la proprietatildeti ltjspsetProperty gt ltjspgetProperty gt Existatilde un numatilder relativ mare de taguri predefinite (icircntr-o bibliotecatilde de taguri de bazatilde) si se pot defini alte biblioteci de taguri Exemplu de fisier JSP

lt page import=helloNameHandler gt ltjspuseBean id=mybean scope=page class=helloNameHandler gt ltjspsetProperty name=mybean property= gt lthtmlgt ltheadgtlttitlegtHello Userlttitlegtltheadgt lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtMy name is Duke Whats yourslth1gt lttdgt lttrgt lttrgt lttd width=150 ampnbsp lttdgt lttd width=550gt ltform method=getgt ltinput type=text name=username size=25gt ltbrgt ltinput type=submit value=Submitgt lttdgt lttrgt ltformgt lttablegt lt if ( requestgetParameter(username) = null ) gt lt include file=responsejsp gt lt gt ltbodygt lthtmlgt

Fisierul ldquoresponsejsprdquo poate aratildeta astfel lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtHello ltjspgetProperty name=mybean property=username gt lth1gt lttdgt lttrgt lttablegt

Clasa Java folositatilde de pagina JSP este banalatilde icircn acest exemplu

6

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 dacatilde s-ar cere autentificarea utilizatorilor care acceseazatilde aplicatia prin catildeutarea numelor acestora icircntr-un tabel dintr-o bazatilde de date Exemplul urmatildetor care icircnsoteste server-ul Tomcat este un joc de ghicire de catildetre utilizatorul aplicatiei a unui numatilder generat aleator icircn server si are o logicatilde a aplicatiei ceva mai complexatilde lt page import = numNumberGuessBean gt ltjspuseBean id=numguess class=numNumberGuessBean scope=sessiongt ltjspsetProperty name=numguess property=gt lthtmlgt ltheadgtlttitlegtNumber Guesslttitlegtltheadgt ltbodygt lt if (numguessgetSuccess()) gt You got it after lt= numguessgetNumGuesses() gt tries ltpgt lt numguessreset() gt lta href=numguessjspgttry againltagt lt else if (numguessgetNumGuesses() == 0) gt Welcome to the Number Guess gameltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt else gt Try ltbgtlt= numguessgetHint() gtltbgt You have made lt= numguessgetNumGuesses() gt guessesltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt gt ltbodygt lthtmlgt

Clasa JavaBean fatilderatilde comentariile initiale aratatilde astfel package num import javautil public class NumberGuessBean int answer boolean success String hint int numGuesses public NumberGuessBean() reset() public void reset() answer = Mathabs(new Random()nextInt() 10) + 1 success = false numGuesses = 0

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 5: Elemente de Programare Web in Java

5

extinde tehnologia bazatatilde pe servleti Java (ptr crearea de continut dinamic) dar permite un mod mai natural de a specifica continutul static (HTMLXHTML)

Ideia paginilor JSP este de a extinde paginile HTML cu fragmente de cod Java incluse icircntre tag-uri delimitate de ldquoltrdquo si ldquogtrdquo Paginile JSP sunt transformate (compilate) automat icircn servleti de catildetre un motor JSP (JSP Engine)

Codul Java folosit de o paginatilde JSP are forma unor componente JavaBean adicatilde foloseste metode de tip ldquogetrdquo si ldquosetrdquo pentru acces la proprietatildetile clasei (la datele dintr-un obiect) Tag-ul ltjsp useBean gt instantiazatilde o clasatilde JavaBean si atribuie un identificator acestui obiect care va fi folosit icircn alte taguri de acces la proprietatildeti ltjspsetProperty gt ltjspgetProperty gt Existatilde un numatilder relativ mare de taguri predefinite (icircntr-o bibliotecatilde de taguri de bazatilde) si se pot defini alte biblioteci de taguri Exemplu de fisier JSP

lt page import=helloNameHandler gt ltjspuseBean id=mybean scope=page class=helloNameHandler gt ltjspsetProperty name=mybean property= gt lthtmlgt ltheadgtlttitlegtHello Userlttitlegtltheadgt lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtMy name is Duke Whats yourslth1gt lttdgt lttrgt lttrgt lttd width=150 ampnbsp lttdgt lttd width=550gt ltform method=getgt ltinput type=text name=username size=25gt ltbrgt ltinput type=submit value=Submitgt lttdgt lttrgt ltformgt lttablegt lt if ( requestgetParameter(username) = null ) gt lt include file=responsejsp gt lt gt ltbodygt lthtmlgt

Fisierul ldquoresponsejsprdquo poate aratildeta astfel lttable border=0 width=700gt lttrgt lttd width=150gt ampnbsp lttdgt lttd width=550gt lth1gtHello ltjspgetProperty name=mybean property=username gt lth1gt lttdgt lttrgt lttablegt

Clasa Java folositatilde de pagina JSP este banalatilde icircn acest exemplu

6

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 dacatilde s-ar cere autentificarea utilizatorilor care acceseazatilde aplicatia prin catildeutarea numelor acestora icircntr-un tabel dintr-o bazatilde de date Exemplul urmatildetor care icircnsoteste server-ul Tomcat este un joc de ghicire de catildetre utilizatorul aplicatiei a unui numatilder generat aleator icircn server si are o logicatilde a aplicatiei ceva mai complexatilde lt page import = numNumberGuessBean gt ltjspuseBean id=numguess class=numNumberGuessBean scope=sessiongt ltjspsetProperty name=numguess property=gt lthtmlgt ltheadgtlttitlegtNumber Guesslttitlegtltheadgt ltbodygt lt if (numguessgetSuccess()) gt You got it after lt= numguessgetNumGuesses() gt tries ltpgt lt numguessreset() gt lta href=numguessjspgttry againltagt lt else if (numguessgetNumGuesses() == 0) gt Welcome to the Number Guess gameltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt else gt Try ltbgtlt= numguessgetHint() gtltbgt You have made lt= numguessgetNumGuesses() gt guessesltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt gt ltbodygt lthtmlgt

Clasa JavaBean fatilderatilde comentariile initiale aratatilde astfel package num import javautil public class NumberGuessBean int answer boolean success String hint int numGuesses public NumberGuessBean() reset() public void reset() answer = Mathabs(new Random()nextInt() 10) + 1 success = false numGuesses = 0

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 6: Elemente de Programare Web in Java

6

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 dacatilde s-ar cere autentificarea utilizatorilor care acceseazatilde aplicatia prin catildeutarea numelor acestora icircntr-un tabel dintr-o bazatilde de date Exemplul urmatildetor care icircnsoteste server-ul Tomcat este un joc de ghicire de catildetre utilizatorul aplicatiei a unui numatilder generat aleator icircn server si are o logicatilde a aplicatiei ceva mai complexatilde lt page import = numNumberGuessBean gt ltjspuseBean id=numguess class=numNumberGuessBean scope=sessiongt ltjspsetProperty name=numguess property=gt lthtmlgt ltheadgtlttitlegtNumber Guesslttitlegtltheadgt ltbodygt lt if (numguessgetSuccess()) gt You got it after lt= numguessgetNumGuesses() gt tries ltpgt lt numguessreset() gt lta href=numguessjspgttry againltagt lt else if (numguessgetNumGuesses() == 0) gt Welcome to the Number Guess gameltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt else gt Try ltbgtlt= numguessgetHint() gtltbgt You have made lt= numguessgetNumGuesses() gt guessesltpgt Enter a number between 1 and 100ltpgt ltform method=getgt ltinput type=text name=guessgt ltinput type=submit value=Submitgt ltformgt lt gt ltbodygt lthtmlgt

Clasa JavaBean fatilderatilde comentariile initiale aratatilde astfel package num import javautil public class NumberGuessBean int answer boolean success String hint int numGuesses public NumberGuessBean() reset() public void reset() answer = Mathabs(new Random()nextInt() 10) + 1 success = false numGuesses = 0

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 7: Elemente de Programare Web in Java

7

public void setGuess(String guess) numGuesses++ int g try g = IntegerparseInt(guess) catch (NumberFormatException e) g = -1 if (g == answer) success = true else if (g == -1) hint = a number next time else if (g lt answer) hint = higher else if (g gt answer) hint = lower public boolean getSuccess() return success public String getHint() return + hint public int getNumGuesses() return numGuesses

Intercalarea de cod Java si de taguri HTML nu este o practicatilde recomandatatilde iar aplicatiile realizate dupatilde schema MVC separatilde partea de logicatilde icircn clase controler si partea de prezentare icircn pagini HTML sau JSP (componenta de ldquoViewrdquo) Orice paginatilde JSP este tradusatilde icircntr-un servlet care scrie textul HTML din paginatilde Ciclul de viatatilde al unei pagini JSP 1 Dacatilde nu existatilde un obiect servlet pentru pagina JSP atunci a Se icircncarcatilde clasa servlet asociatatilde paginii b Se instantiazatilde clasa servlet c Se fac initializatilderi prin apelul metodei ldquojspInitrdquo 2 Containerul apeleazatilde metoda ldquo_jspServicerdquo (corespondentul metodei ldquoservicerdquo dintr-un servlet) transmitacircndu-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 icircn pagini JSP (ldquoustom tagsrdquo - Un limbaj cu expresii (EL=Expression Language) pentru acces la obiecte Java Elementele componente ale unei pagini JSP - Directive care controleazatildemodul icircncare containerul traduce si executatildepagini JSP Exemple lt page contentType=texthtml charset=UTF-8 gt lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt lt taglib uri=functions prefix=f gt

- Secvente de cod Java inserate icircn paginatilde (Scriptlets) Exemple lt for (int i=0ilt5i++) gt Hello ltbrgt lt gt

- Expresii EL Exemple $localeString ltcset var=selectedLocaleString value=$paramlocale gt

ltcforEach var=localeString items=$localeslocaleNamesgt ltcforEachgt - Marcaje standard JSP Exemple Marcaje de forma ltjspuseBean gt pentru instantiere de clase JavaBeans Ex ltjspuseBean id=date class=mypkgMyDategt

Marcaje de forma ltjspgetPropertygt ltjspsetPropertygt pentru apel de metode din clase JavaBeans Ex ltjspsetProperty name=date property=locale value=$localesselectedLocalegt

- Marcaje de forma ltjspinclude gt ltjspforward gt pentru apeluri de metode din Servlet API

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)

Page 8: Elemente de Programare Web in Java

8

- Marcaje definite de programatori (custom tags)

Notatia $var este utilizata frecvent in paginile JSP pentru a include intr-o constanta sir valoarea unei variabile cu numele var Aceste expresii pot apare in textul static (HTML) si in atribute ale marcajelor standard sau definite de utilizatori

De asemenea este permisatilde notatia $expr pentru a obtine valoarea unei expresii (icircn vederea includerii ei icircntr-un text static sau icircn atribute de marcaje) In paginile JSP se pot folosi o serie de obiecte implicite servletContext = contextul servlet si al altor componente din aplicatie session = sesiune servlet request = cerere primita de servlet response = raspuns trimis de servlet

Alte obiecte implicite accesibile icircntr-o paginatilde JSP sunt de tip dictionar (Map) si permit

memorarea numelor si valorilor unor variabile pe o duratatilde determinatatilde 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 icircn alte pagini JSP se

face prin directiva lt include file=filenamegt Aceste directive se pot folosi numai la icircnceput sau la sfacircrsit de paginatilde

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 (antetnote de subsol sa) de elementele specifice fiecarei pagini Un template este o pagina JSP cu parametrii (placeholders=jaloane)