Documente Academic
Documente Profesional
Documente Cultură
Java Server Pages este o simpla dar puternica tehnologie folosita pe partea de server pentru a genera continut HTML dinamic. JSP este o extensie directa a Java Servlets si furnizeaza o modalitate de a separa partea de procesare de cea de prezentare. Motorul JSP este doar un alt Servlet, mapat la extensia *.jsp. O pagina JSP este un document bazat pe text care descrie cum se va procesa o cerere ( request) pentru a crea un raspuns (response). Sunt amestecate date sablon (template data) cu anumite actiuni dinamice si mecanisme din cadrul platformei Java. In continuare se prezinta un fisier simplu JSP:
Java Server Pages mostenesc de la Servlets concepte despre Applications, ServletContexts, Sessions, Requests si Responses. Paginile JSP sunt unice prin faptul ca ele pot contine att continut ct si cod de reprezentare. Astfel ofera o multitudine de optiuni n proiectarea de aplicatii usor de ntretinut si extins. Optiunile disponibile pentru ntreteserea continutului cu codul, includ componente JavaBeans, tag-uri personalizate si scriplets.
3.3.1. Directive
Directivele sunt elemente JSP care furnizeaza informatii globale despre pagina JSP. Ele au urmatoarea sintaxa:
-language="scriptingLanguage" - atribut care spune serverului ce limbaj sa foloseasca la compilare. -extends="className" atribut care defineste clasa de baza a serverului generat. -import="importList" atribut care defineste o lista de pachete disponibile JSP-ului. -session="true|false" - atribut care defineste disponibilitatea datelor de sesiune n cadrul paginii. -buffer="none|size in kb" - determina daca stream-ul de scriere ( OutputStream) este sub forma de buffer. -autoFlush="true|false" determina daca stream-ul amintit mai sus va fi golit automat. -isThreadSafe="true|false" - specifica daca motorul JSP poate raspunde la mai mult de o cerere la un moment dat. - info="text" - specifica daca pagina JSP poate fi accesata de metoda getServlet a servletului generat. -errorPage="error_url" URL-ul relativ catre pagina JSP care prinde exceptiile. -isErrorPage="true|false" specifica daca pagina JSP este o pagina de eroare. -contentType="ctinfo" - reprezinta tipul MIME si setul de caractere de raspuns.
3.3.1.4. Actiuni
Actiunile furnizeaza o abstractizare folosita usor pentru a ncapsula diferite task-uri. Ele creaza obiecte de tip JavaBeans si actioneaza asupra lor. Tehnologia JSP suporta cteva actiuni standard: <jsp:useBean> instantiaza un obiect de tip JavaBean avnd un scop dat si un id <jsp:setProperty> seteaza valoarea unei proprietati a Bean-ului <jsp:getProperty> preia valoarea proprietatii unei instante a unui Bean, o converteste ntrun String pregatind-o pentru afisare <jsp:include> furnizeaza un mecanism pentru a include resurse statice si dinamice n pagina JSP curenta. Are sintaxa:
sau
Un exemplu simplu de pagina JSP care combina Script HTML si Beans este cel de mai jos, care afiseaza numele de login al clientului cnd acesta solicita o pagina prin intermediul unui form HTML:
Pagina contine comenzi sablon, ntlnite n orice pagina HTML si cteva elemente JSP, subliniate. Raspunsul este creat pe baza comenzilor HTML. Cnd s-a ajuns la primul element JSP este creat un obiect server-side Bean cu numele 'login' de tip 'Profi.Login'. Acest obiect va putea fi folosit si utilizat mai tirziu n pagina. Urmatoarele doua elemente JSP acceseaza proprietatile obiectului si nsereaza aceste valori n pagina response ca String.
Instructiunea page defineste un anumit numar de atribute dependente de pagina si le comunica containerului. O unitate de interpretare (un fisier sursa si orice alte fisiere incluse cu instructiunea include) poate contine mai multe comenzi page, atributele lor aplicndu-se apoi unitatii. Ideal, ar trebui sa existe o singura aparitie a fiecarui atribut/valoare definit de aceasta comanda cu exceptia atributului import. Atributele/valorile nerecunoscute sau repetate pot genera erori de interpretare. Iata cteva detalii despre atribute : language: defineste limbajul utilizat n scriptlets, expresii scriptlets si declaratii cuprinse n interiorul unitatii de interpretare (pagina JSP si orice alt fisier inclus prin comanda include). Este prezentata doar semantica scripturilor pentru valoarea "java" a acestui atribut, aceasta fiind singura definita si necesara n JSP 1.1. Versiuni ulterioare JSP specifications vor defini si alte valori ale acestui atribut, dar pna atunci ntlnirea unei alte valori este considerata eroare de interpretare. extends: valoarea lui este un nume de clasa Java care defineste superclasa din care este derivata pagina JSP. Acestui atribut trebuie sa i se acorde atentie deoarece prin limitarea capacitatii containerului JSP trebuie sa se furnizeze superclase specializate, fapt care poate mbunatatii calitatea serviciilor. import: valoarea lui este o declaratie de import din limbajul Java, n care pot exista mai multi parametrii separati prin virgula. Daca parametrul este un pachet de clase Java, trebuie urmat de ".*". Lista de import implicita este: java.lang.*, javax.servlet.*, javax.servlet.jsp.*, javax.servlet.http.* . aceasta lista este valabila doar cnd language are ca parametru java. session: indica faptul ca pagina implica prezenta unei sesiuni http. Daca valoarea este "true", atunci implicit variabila "session" de tipuljavax.servlet.http.HttpSession este o sesiune curenta/noua pentru pagina. Daca este "false" atunci pagina nu participa la sesiunea respectiva, variabila " session" nu este definita si orice referire la aceasta este considerata eroare. Valoarea implicita este "true". buffer: specifica modelul buffer-ului pentru iesirea initiala out pentru a prelua continutul de iesire din pagina. Daca e "none", iesirea este trimisa direct prin ServletResponse PrintWriter. Daca este specificata o valoare n kb, iesirea este pusa ntr-un buffer de dimensiune data. n functie de valoarea atributului " autoFlush", la umplerea buffer-ului continutul sau este automat afisat sau se lanseaza o exceptie. Valoarea implicita a bufferului este de 8k. autoFlush: pentru valoarea "true", la umplerea buffer-ului continutul este golit automat iar pentru "false" se lanseaza o exceptie. Valoarea implicita este "true". Se interzice "false" pentru autoFush "buffer=none". isThreadSafe : indica nivelul de siguranta al thread-ului implementat n pagina. Daca avem "false", cererile clientilor vor fi procesate una dupa alta, n ordinea sosirii lor. Daca este "true", procesarea cererilor se poate face simultan, n acest caz fiind necesara sincronizarea accesului la pagina. Valoarea implicita este "true". info : este un sir de caractere ce poate fi ncorporat n pagina. Dupa implementarea paginii poate fi obtinut prin apelarea metodei Servlet.getServletInfo(). isErrorPage : este utilizat pentru a indica daca se intentioneaza ca pagina JSP curenta sa fie un URL target al unei errorPage din alta pagina. Pentru "true", variabila " exception" este definita si are ca si valoare o referinta la Throwable din pagina cu eroarea. Pentru "false", variabila " exception" nu este definita si orice referire la ea din corpul paginii este considerata eroare. Valoarea implicita este "false". errorPage : defineste un URL la o resursa la care orice obiect Throwable din Java lansat (nu si prins) de page implementation este trimis mai departe pentru partea de tratare a erorilor. Daca URL-ul face referire la o alta pagina, variabila exception trebuie sa contina o referinta la acel obiect Throwable care nu a fost prins. Nu exista un URL implicit, fiind dependent de implementare. Ramne de mentionat ca obiectul Throwable este transferat catre error page implementationprin salvarea referintei sale ntr-un obiect comun ServletRequest folosind metoda setAttribute() cu numele javax.servlet.jsp.jspException. contentType : defineste codarea caracterelor pentru pagina JSP si raspunsul returnat de aceasta. Continutul acestui atribut este de tipul "TYPE" sau "TYPE; charset=CHARSET". Valoarea implicita pentru TYPE este text/html, iar pentru codarea caracterelor este ISO-8859-1.
Paginile JSP pot fi compilate n propriile clase JSP page implementation class, ceea ce permite folosirea mijloacelor puse la dispozitie de autori. Acest fapt are o serie de avantaje cum ar fi eliminarea ntirzierilor la receptionarea cererilor si reducerea numarului de pasi la pornirea unui container JSP. Daca o clasa JSP implementation class depinde de anumite clase aditionale pachetului oferit de JSP 1.1 si Servlet 2.2, acestea trebuie incluse n pachetul WAR (arhiva web), devenind astfel portabile n toate containerele JSP.
</mytag>
Sintaxa unei instructiuni:
3.3.2.5. Script-uri
Elementele script sunt folosite pentru manipularea obiectelor. Sunt trei clase de elemente script: declarations, scriptlets si expressions. Primul tip de elemente pentru a declara constructori ai limbajului, valabili pentru toate celelalte elemente script, al doilea sunt fragmente din program care permit descrierea actiunilor ce preced returnarea unui raspuns, cum ar fi blocuri de executie conditionata, ciclari, etc., iar ultimul tip sunt expresii complete, evaluate doar la sfrsit, rezultatul lor fiind convertit ntr-un sir si inclus n stream-ul de scriere.
Containerele JSP asigura suport elementelor script bazate pe limbajul Java, care permit diferite operatii cum ar fi manipularea obiectelor Java, folosirea metodelor, tratarea exceptiilor, etc.
Exista si anumite deosebiri: ASP foloseste ca limbaj Visual Basic Script pe cnd JSP este focalizat pe Java ASP-ul este deja un produs inclus n Internet Information Server al firmei Microsoft pe cnd JSP este suportat de servere mult mai puternice
Ce are n plus JSP: Limbajul Java este mult mai puternic dect Visual Basic Script sau Java Script n aplicatiile client-server Obiectele ActiveX sunt disponibile numai pe platforme Windows, Java este independenta de platforma
Un important motiv pentru care JSP este recomandat este datorita faptului c ASP-ul a mostenit principiile conform carora o pagin web e plina de scripturi. Acest model a fost usor de nvatat si s-a raspndit cu mare usurinta. Odata cu trecerea timpului nsa, s-a nteles ca nu acesta este modul n care se pot realiza aplicatii mari. Cu acest mod de gndire nu se puteau realiza componente reutilizabile. Pentru a contracara aceste dezavantaje, si pentru a putea crea cu usurinta componente reutilizabile pentru aplicatii WWW, au fost introduse componentele JavaBeans. A fost, de altfel, doar o problem de timp pna cnd tehnologia axata pe componente a cstigat batalia n dezvoltarea aplicatiilor Web. JSP a aparut ca fiind deja o platforma axata pe componente. Componentele pe care se bazeaza sunt componentele JavaBeans si Enterprise JavaBeans. Aplicatiile sunt create astfel nct, valorile, datele si informatiile returnate de aceste componente s poata fi ncadrate si aranjate n pagini HTML. JSP poate fi folosit att de catre programatorii Java avansati ct si de catre programatorii care n-au o experienta vasta n domeniul programarii Java deoarece acestia pot utiliza componentele pe care cei dinti le-au creat cu o foarte mare usurinta.
O pagina JSP contine elemente JSP si date n format standard . Elementele JSP sunt exemple de anumite tipuri cunoscute n container. Daca elementul defineste obiecte, semantica include obiectele definite si tipul lor. Dupa cum deja stim, exista trei tipuri de elemente JSP: directive, scripting, actions. Datele sablon reprezinta singurul tip de date necunosccute containerului JSP. Ele nu se interpreteaza, fiind transferate clientului sau altor componente de procesare.
Erorile pot sa apara n orice moment al acestui proces. n continuare vor fi prezentate metodele de tratare a acestora. 1. Erorile de translatie
Translatia fisierului sursa printr-un container JSP poate avea loc oricnd ntre desfasurarea initiala a paginii din mediul de rulare al containerului si receptia si procesarea unei cereri din partea unui client. Daca translatia se realizeaza naintea sosirii cererii din partea clientului, atunci procesarea si notificarea erorii este dependenta de implementare. n cazul protocolului HTTP ntlnim error status code 500 (Server Error). 2. Erori pe durata procesarii cererilor
De-a lungul procesarii cererilor clientilor pot apre o serie de erori arbitrare n fiecare body al JSP page implementation class sau n alte coduri (Java sau alte limbaje de programare) apelate din acestea. Erorile pot fi detectate folosind mecanismul de tratare a exceptiilor din Java pentru a semnala solicitantilor aparitia lor. Aceste exceptii pot fi prinse si tratate n cadrul fiecarui body al clasei JSP. Oricum, orice exceptie netratata lansata de un body este trimisa ntr-un error page URL specificat n JSP.
Request and response parameters Dup cum s-a vzut mai sus, contractul dintre JSP conatiner si JSP page necesita anumiti parametri de cerere si raspuns. Tipul conventional al parametrului request (pe care aceste specificatii le numesc <ServletRequestSubtype>) este o interfata care extinde javax.servlet.ServletRequest. Interfata trebuie sa defineasca un contract dependent de protocol ntre container si clasa de implementare. n acelasi mod, pentru parametrul response este o interfat care extinde javax.servlet.ServletReponse. Contractul pentru HTTP este definit de catre interfetele javax.servlet.http.HttpServletRequest si javax.servlet.http.HttpServletResponse. Omiterea atributului extends - daca n directiva language lipseste acest atribut, containerul JSP poate genera orice alta clasa care sa satisfaca contractul descris mai sus. 1. Folosirea atributului extends duce la pastrarea numelui, specificat n acest atribut de catre clasa generata. Containerul JSP trebuie sa testeze daca superclasa furnizata implementeaza HttpJspPage daca protocolul
este HTTP sau JspPage, n caz contrar toate metodele din interfata Servlet sunt declarate final. In plus, este responsabilitatea autorului paginii JSP ca superclasa furnizata sa permita: Metoda service() din Servlet API sa invoce metoda jspService() Metoda init(ServletConfig) care pstreaza configuratiile, sa le faca diponibile prin getServletConfig(), apoi invoca jspInit(). Metoda destroy() invoca jspDestroy().
Este lansata o eroare de interpretare de catre container daca superclasa nu satisface aceste cereri. Containerul JSP stocheaza datele (daca este specificata aceasta optiune) ce vor fi trimise de la server catre client. Header-ele nu sunt trimise clientului dect la aparitia primei metode flush(). Ca urmare, nici o operatie care depinde de acestea (cum ar fi setContentType(), redirect(), error() ) nu este executata si header-ele nu sunt trimise. JSP1.1 include o clasa care stocheaza datele si trimite datele de iesire, numita javax.servlet.jsp.JspWriter. Clasa JspWriter este folosita n metoda _jspPageService ca n urmatorul exemplu:
import javax.servlet.jsp.JspWriter;
static JspFactory _jspFactory = JspFactory.getDefaultFactory();
?jsp_precompile ?jsp_precompile="true"
?jsp_precompile="false"
Valid JSP page O pagina JSP este valabila pentru o platforma Java daca si numai daca JSP page implementation class, mpreuna cu orice alta clasa definita de containerul JSP, este un program valid pentru platforma data. Toate numele de forma jsp_* si jspx_* n orice combinatie de caractere mari si mici sunt rezervate de catre specificatiile JSP. Sectiunea de declaratii este rezultatul concatenarii tuturor declaratiilor din pagina n ordinea n care ele vor aparea. Sectiunea de initializare defineste si initializeaza obiectele implicite disponibile paginii JSP. Sectiunea main permite o mapare ntre obiectele cerere si raspuns. Continutul segmentului (2) este format din scriptlets, expresii si text din pagina JSP. Aceste elemente sunt procesate secvential. O translatie pentru fiecare dintre ele se face dupa cum se indica mai jos, dependenta de tipul elementului: Template data este transformat ntr-un cod ce va fi plasat n stream-ul de iesire numit de catre variabila out. Toate spatiile goale sunt pastrate. Aceasta corespunde unei comenzi de forma: out.print(template); Un scriptlet este transformat ntr-un fragment de instructiuni Java. O expresie devine o comanda Java care nsereaza valoarea ei convertita la un String n stream-ul de iesire numit de catre variabila out. Forma sa este: out.print(expression); O actiune care defineste unul sau mai multe obiecte este tansformat n una sau mai multe declaratii variabile pentru aceste obiecte, mpreuna cu codul care le initializeaza. Singura actiune standard n JSP1.1 este jsp:useBean. Numele variabilei introduse este acela al atributului id iar tipul sau este cel al atributului class. De mentionat ca valoarea atributului scope nu afecteaza domeniul de vizibilitate al variabilei n programul respectiv, afectnd doar unde vor fi referintele aditionale la obiect, marcate de catre aceasta. O biblioteca de tag-uri ( Tag Library) separa anumite functii prin definirea unui (sub) limbaj care permite utilizarea mai usoara a acestora n pagini. Actiunile introduse de biblioteca pot fi folosite de catre programator explicit, prin scrierea manuala, sau implicit, prin folosirea unor unelte predefinite. Actiunile livrate ca si biblioteci de tag-uri sunt importate n pagina prin folosirea unei comenzi taglib si pot fi folosite printr-un prefix dat de comanda. O actiune poate creea obiecte noi, care pot fi trecute altor actiuni sau pot fi manipulate manual prin limbajul script. Bibliotecile de tag-uri sunt portabile, putnd fi folosite n orice JSP, indiferent de limbajul script folosit. Mecanismul extinderii tag-urilor descris n acest capitol are mai multe obiective: Portabilitate - o actiune trebuie sa poata fi folosita de catre orice container JSP Simplitate - sa fie ct mai usor de folosit pentru a putea fi accesibila chiar si utilizatorilor mai putin experimentati. Expresivitate - sa ofere o larga diversitate de actiuni (actiuni incuibarite, elemente script n cadrul body-urilor, etc.) Reutilizarea codului scris n alte limbaje script
Mecanismul de baza n definirea semanticii actiunii este acela de tag handler. Acesta este o clasa Java care implementeaza interfata Tag sau BodyTag. Clasa de implementare a paginii instantiaza (sau reutilizeaza) un obiect tag handler pentru fiecare actiune n pagina. Acesta este un obiect Java care implementeaza interfatajavax.servlet.jsp.tagext.Tag si este responsabil pentru interactiunea dintre JSP si obiectele de tip server-side. Exista doua interfete principale: Tag si BodyTag: Tag - defineste metodele de baza necesare n toate tag handlers; n plus mai sunt doStartTag() si doEndTag(). BodyTag - permite folosirea ul: doInitBody() si doAfterBody(). a doua metode aditionale atunci cnd handler-ul manipuleaza body-
Folosirea interfetelor simplifica utilizarea obiectelor Java existente si transformarea lor n tag handler. Alte clase de baza mai sunt: TagSupport si BodyTagSuport.
Actiuni simple
n multe cazuri handler-ul are nevoie doar de folosirea metodei doStartTag(), invocata cnd este ntilnit tag-ul de start. Aceasta metoda acceseaza atributele tag-ului si informatiile despre starea paginii. n mod similar este doEndTag(), doar ca aceasta este invocata cnd este ntilnit tag-ul de sfrsit. Rezultatul acesteia indica daca mai este evaluat sau nu ce a mai ramas din pagina. Un caz particular des ntlnit este folosirea unui body gol.
Actiuni cu body
n acest caz sunt invocate metodele doInitBody() si doAfterBody(), definite n interfata BodyTag. Astfel, evaluarea este fcuta pe baza rezultatelor returnate de metodele invocate, dupa cum urmeaza: Metoda doStartTag() este invocata prima ntotdeauna si returneaza o valoare de tip int care indica daca poate fi evaluat sau nu corpul actiunii. Daca da (este returnat EVAL_BODY_TAG), este creat un stream incuibarit de tip BodyContent si trimis obiectului de tip BodyTag prin setBodyContent. Dupa aceasta este invocata doInitBoody() si este evaluat corpul actiunii, al carui rezultat este pus n noul obiect de tip BodyContent creat. La sfrsit este invocata metoda doAfterBody(). Daca invocarea doStartTag() returneaza valoarea SKIP_BODY, corpul nu este evaluat. Metoda doBody() poate folosi obiectul bodyContext pentru diferite functii, cum ar fi conversia acestuia ntrun String si folosirea lui ca si argument sau filtrarea unor actiuni nainte de a le pune n stream-ul de iesire. Metoda doAfterBody() returneaza valoare care indica daca viitoarele reevaluari pot fi facute sau nu. Mai jos sunt prezentate cteva exemple simple care folosesc mecanismul tag extension.
Call functionality, no Body : este cel mai simplu exemplu, care doar colecteaza atributele si invoca anumite actiuni (singura de aici este foo): <x:foo att1="." att2="." att3="." />. n acest caz vom defini un tag handler FooTag care extinde TagSupport doar redefinind doStartTag. Aceasta va lua atributele si va interactiona cuPageContext. Call functionality, no Body, define Object: <x:bar id="mybar" att1="." att2="." att3="." />. Dupa aceasta linie obiectul mybar este disponibil pentru limbajul script. Descriptorul bibliotecii de tag-uri trebuie sa mentioneze o clasa TagExtraInfo care va fi folosita pentru a determina variabila ce va fi creata de aceasta actiune. Call functionality, define Object by Scope:
/ </x:ba
Template mechanism: n partea de lucru cu serverul exista o serie de mecanisme standard. Cel mai simplu dintre acestea ia un token si-l va nlocui cu un anumit text specificat dinainte (care poate fi schimbat usor). Tag Library O astfel de biblioteca este o colectie de actiuni care ncapsuleaza anumite functii comune ce vor fi folosite. Ea este facuta disponibila n pagina prin directiva taglib care identifica libraria printr-un URI (Universal Resource Identifier). URI poate fi orice adresa care poate identifica n mod unic o biblioteca. URI este asociat cu un fisier Tag Library Descriptor (TLD) si cu clasele tag handler. Packaged Tag Libraries Pentru a accepta o biblioteca mpachetata ntr-un pachet cum ar fi un fisier JAR sunt necesare asa numitele JSP tools. Fisierul JAR trebuie sa aiba un descriptor numit META-INF/taglib.tld. Location of Java classes Clasele tag handler (request time) si TagExtraInfo (translation-time) sunt clase Java. ntr-o aplicatie web ele se vor afla la o locatie standard pentru clasele Java: ori ntr-un fisier JAR, de exemplu, n cazul utilizarii serverului resin, pus n directorul WEB-INF/lib, ori n WEB-INF/classes. Comanda taglib
Aceasta declara daca pagina foloseste o biblioteca de tag-uri, identifica n mod unic libraria folosind URI si asociaza un tag prefix mai ales actiunilor din cadrul bibliotecii. Se considera eroare daca containerul JSP nu poate localiza biblioteca dup URI-ul dat sau daca instructiunea taglib apare dupa o actiune care foloseste prefixul. Descriptorul bibliotecii (TLD) TLD este un document XML care descrie o biblioteca de tag-uri. Acesta este folosit de catre container pentru a interpreta paginile care includ o comand taglibce desemneaza o anume biblioteca. TLD include informatii despre containerul JSP, despre biblioteca si despre fiecare actiune definita n biblioteca. Actiunile sunt definite prin nume clasa pentru tag handler-ul ei, informatii optionale despre clasa TagExtraInfo si informatii despre toate atributele sale. Fiecare atribut este mentionat explicit, cu indicatii daca este sau nu imputernicit (mandatory), daca poate accepta expresii de tip request-time, etc. Avantajul unui TLD este acela ca se pot citi informatii despre tools fara a fi nevoie de instantierea respectivului obiect sau de ncarcarea claselor. URI-ul care descrie biblioteca poate fi mapat ntr-un fisier TLD prin doua mecanisme, mapare implicita sau prin web.xml descris folosind elementul taglib. Localizare implicita implic daca nu exist nici un subelement taglib sa mapeze URI-ul folosit n taglib, descriptorul va cauta n locatia indicata implicit de URI. Aceasta regula se aplica doar pentru adrese locale pentru aplicatia curenta. Ex: <%@ taglib uri="tlds/Prlibrary_1_4.tld" prefix="x" %>. Mapare prin web.xml este descrisa folosind elementul taglib, care are doua subelemente, taglib-uri si tagliblocation. Deci: 1. taglib: este un subelement al aplicatiei web: <! element web-app . taglib* . >. Acest element are la rndul sau alte doua subelemente si un atribut: 2. <!ELEMENT taglib (taglib-uri, taglib-location ) > <ELEMENT taglib id ID #IMPLIED>
taglib-uri - descrie URI care identifica biblioteca folosita n aplicatie: <!ELEMENT taglib-uri (#PCDATA) > PCDATA ::= a URI spac, relative to the web.xml document.
3.
taglib-location - contine locatia unde poate fi gasita biblioteca. <!ELEMENT taglib-location (#PCDATA)> PCDATA ::= a resurce location, relative to the root of the Web Application, where to find the Tag Library Descriptor file
Folosirea adreselor URI permite folosirea numelor scurte n instructiunea taglib: <%@ taglib uri="myPRlibrary" prefix="x" %> Asamblarea aplicatiilor Web Ca parte a procesului de asamblare a aplicatiilor, Application Assembler-ul creaz un director WEB-INF/ cu subdirectoarele lib/ si classes/, plaseaza paginile, Servletii, clasele auxiliare, bibliotecile de tag - uri n pozitiile corespunzatoare, dupa care creaza WEB-INF/web.xml si le leag pe toate mpreuna. Librariile care au fost livrate n format standard pentru JSP tools pot fi puse direct n WEB-INF/lib. Asamblerul poate crea taglib-uri de intrare n web.xml pentru fiecare biblioteca folosita. Formatul descriptorului (TLD) taglib - este radacina documentului. Are doua elemente:
<!ATTLIST taglib
*http://java.sun.com/j2ee/dtds/webjsptaglibrary_1_1.dtd >
Un element taglib are mai multe subelemente care definesc: tlibversion - descrie versiunea de biblioteca tag. Sintaxa este: <!ELEMENT tlibversion (#PCDATA) >, unde #PCDATA::= [0-9]* 0.3. jspversion - descrie versiunea JSP (n cazul nostru este 1.1) shortname - defineste un nume scurt, implicit, care poate fi folosit n paginile JSP pentru a crea nume cu anumite valori: <!ELEMENT shortname (#PCDATA) >, #PCDATA::=NMTOKEN. uri - defineste un URI public care identifica n mod unic versiunea curenta de biblioteca de tag-uri. Este recomandat ca URI sa fie un URL la descriptorul bibliotecii de tag - uri. info - defineste un text care descrie biblioteca tag. tag - defineste o actiune n biblioteca. Are un singur atribut: <!ATTLIST tag id ID #IMPLIED>. Un tag poate avea mai multe subelemente: tag class - defineste clasa tag handler implementnd interfata javax.servlet.jsp.tagext.Tag. Acest element este obligatoriu. Are sintaxa<! ELEMENT tagclass (#PCDATA) >, #PCDATA::= fully qualified Java class name. teilclass - defineste subclasa javax.servlet.jsp.tagext.TagExtraInfo pentru acest tag. Acest element este optional. bodycontent - furnizeaza o idee despre continutul corpului acestei actiuni. attribute - informatii despre un atribut al acestei actiuni. Are sinataxa: <!ELEMENT attribute (name, subelemente de forma: required?, rtextvalue?)>. Are trei
name - defineste numele tag-ului sau atributului definit. required - indica daca un atribut incuibarit este obligatoriu sau optional.
Are sintaxa: <!ELEMENT required (#PCDATA) >, #PCDATA::= true | false | yes | no. Valoarea implicita este "false". rtexprvalue - indica daca atributul incuibarit poate avea ca si valoare un scriptlet.
Tag Handlers Tag handler este un obiect de tip run-time server-side, creat pentru a usura evaluarea actiunilor pe durata executiei paginii. De fapt este o componenta server-side JavaBeans invizibila, dar care implementeaza o interfata aditionala pentru a indica un protocol run-time. Sunt doua interfete care descriu un handler: 1. 2. Tag este folosit pentru handler-e simple, care nu manipuleaza continutul din body (daca acesta exista); BodyTag este o extensie a Tag, care permite accesul la continut. n crearea unor handler-e noi pot fi folosite ca si clase de baza clasele TagSupport siBodyTagSupport. Un tag handler are anumite proprietti care sunt setate de catre containerul JSP (de obicei prin JSP page implementation class), prin diferite moduri: Obiectul pageControl, pentru pagini n care tag - ul este localizat. Tag handler - ul parent pentru actiuni inchise. Un tag handler poate avea anumite proprietati, cum are orice componenta Bean. Interfata Tag defineste contractul de baza pentru toate handler-ele. Proprietatile unui handler trebuie initializate nainte de folosirea acestuia. Este responsabilitatea containerului sa invoce metodele potrivite pentru initializarea acestor proprietati. Odata setate corect, aceste proprietati ramn valabile pentru instanta respectiva. Dupa initializare pot fi invocate metodele doStartTag() si doEndTag(). Daca toate invocarile handler-ului sunt complete, poate fi folosita metoda release(), care reseteaza toate proprietatile la o anume valoare nespecificata. Consideratii life-cycle n momentul executiei paginii se va folosi o instanta Tag disponibila, initializata cu un prefix si un nume, fara sa mai fie folosite de alte instante. Dupa aceasta va elibera instanta respectiva si o va face disponibila pentru refolosiri ulterioare. Acest procedeu reduce numarul instantelor dorite la un moment dat. Initializarea este corecta prin setarea proprietatilor pageContext, parent, tagData n aceasta ordine. Variabile script JSP suporta variabile script ce pot fi declarate printr-un script si pot fi folosite n altul. La fel, actiunile JSP pot fi folosite ca sa defineasca variabile, adica n elemente script sau n alte actiuni. De exemplu, actiunea standard jsp:useBean poate defini un obiect care va fi folosit mai trziu printr-o variabila script. MetodagetVariableInfo() este folosita pentru a furniza informatii despre fiecare variabila care va fi creata la request time cnd respectiva actiune este executata. Rezultatul acestei metode este o matrice avnd ca si valori obiecte VariableInfo. Fiecare obiect de genul acesta descrie o variabila script prin nume, tip, daca variabila este noua sau nu si care este domeniul su de vizibilitate. Valorile definite pentru domeniul de vizibilitate sunt: NESTED - daca variabila script este disponibila ntre tag-ul start si si tag-ul end al actiunii care l defineste AT_BEGIN - daca variabila este vizibila de la tag-ul start pn la sfrsitul paginii AT_END - variabila este vizibila dupa tag-ul end al actiunii care o defineste pna la sfrsitul paginii
Valoarea domeniului de vizibilitate stabileste care metode au sau nu efect asupra valorii variabilelor si daca, n lipsa altor informatii aditionale, este necesara sincronizarea.
Actiuni cooperante De multe ori este necesara cooperarea ntre doua actiuni n cadrul unei pagini, cum ar fi de exemplu o actiune care defineste un obiect server-side si una care vrea sa-l foloseasca. Pentru aceasta exista doua mecanisme de baza: id-uri si PageContent. Unul dintre mecanismele de cooperare ntre actiuni este de a da numele obiectului n cadrul
paginii. Astfel, prima actiune creaza si numeste obiectul n timp ce a doua foloseste numele pentru a returna obiectul. n implementarea JSP maparea dintre nume si valoare se face prin obiectul implicit pageContext. Acest obiect este transferat printr-o instanta handler, deci poate fi folosit pentru comunicarea informatiilor. Tot ce trebuie, este sa cunoastem numele sub care este stocata infomatia n pageContext. Stiva run-time O alternativa la comunicarea explicita a informatiei printr-un obiect este coordonarea explicita bazata pe domenii de vizibilitate sintactice. De exemplu, n fragmentul de program de mai jos, actiunea action trebuie s creeze un obiect server-side. Mai trziu, actiunea ncuibarit bar poate sa acceseze acest obiect. Obiectul nu este numit prin pageContext, el este gasit din cauza ca elementul action este cea mai apropiata instanta de tipul dorit:
TLD contine anumite informatii sintactice de baza. n mod particular, atributele sunt descrise incluznd numele lor, daca ele sunt obligatorii, sau dac sunt optionale permit expresii de tip request-time. n plus, atributul bodyContent poate fi folosit sa indice daca o actiune trebuie sa fie goala. Toate constrngerile descrise n TLD sunt obligatorii.
Depinznd de componenta echipei de dezvoltare, de constrngerile de timp si de arhitectura aplicatiei, folosirea paginilor JSP si a servletilor poate diferi. Ambele tehnologi au avantaje si ar trebui folosite eficient. n unele cazuri nu exista o singura optiune si ramne la latitudinea managerului de proiect ce tehnologie va folosi. Servleti sunt unelte de programare ce se potrivesc cel mai bine la functii de nivel scazut care nu necesita modificari frecvente. Paginile JSP sunt un mod de legare a continutului dinamic si a logicii ntr - un mod centrat pe prezentare. Paginile JSP sunt capabile de a face diferenta ntre partea de prezentare, realizata n mare parte n HTML brut, iar partea logica de aplicatie, realizata de componentele JavaBeans si tag-urile personalizate. Chiar si paginile JSP pot fi folosite modular ca si componente reutilizabile.
3.3.7. Exemple
1. Extinderea unei aplicatii SMTP Client utiliznd Java Server Pages:
FormMail.htm
<BODY bgcolor="#FFFFFF"> <form action="FormMail.jsp" method="POST"> <div align="center"><center><table border="0" cellpadding="2" cellspacing="0"> <tr> <td bgcolor="#0000FF"> </td> <td align="center" bgcolor="#0000FF"><font color="#80FF00" face="Trebuchet MS"><u>Form Mail Sending Example</u></font></td> <td align="center" bgcolor="#0000FF"><font color="#80FF00" face="Trebuchet MS"><u>Examples</u></font></td> </tr> <tr>
<td bgcolor="#000080"><font color="#00FFFF" face="Trebuchet MS">From</font></td> <td bgcolor="#008080"><font face="Trebuchet MS"><input type="text" size="20" name="from"></font></td> <td bgcolor="#008080"><font color="#80FF00" face="Trebuchet MS">joe@acme.com</font></td> </tr> <tr> <td bgcolor="#000080"><font color="#00FFFF" face="Trebuchet MS">To</font></td> <td bgcolor="#008080"><font face="Trebuchet MS"><input type="text" size="30" name="to"></font></td> <td bgcolor="#008080"><font color="#80FF00" face="Trebuchet MS">mary@acme.com</font></td> </tr> <tr> <td bgcolor="#000080"><font color="#00FFFF" face="Trebuchet MS">Subject</font></td> <td bgcolor="#008080"><font face="Trebuchet MS"><input type="text" size="40" name="subject"></font></td> <td bgcolor="#008080"><font color="#80FF00" face="Trebuchet MS">Hi There!</font></td> </tr>
<tr> <td bgcolor="#000080"><font color="#00FFFF" face="Trebuchet MS">Use Server</font></td> <td bgcolor="#008080"><font face="Trebuchet MS"><input type="text" size="40" name="server" value="localhost"></font></td> <td bgcolor="#008080"><font color="#80FF00" face="Trebuchet MS">acme.com</font></td> </tr> <tr> <td valign="top" bgcolor="#000080"><font color="#00FFFF" face="Trebuchet MS">Msg Body</font></td> <td bgcolor="#008080"><textarea name="msgbody" rows="20" cols="38"></textarea></td> <td bgcolor="#008080"> </td> </tr> <tr> <td bgcolor="#008080"> </td> <td align="center" bgcolor="#008080"><input type="submit" name="B1" value="Submit"></td> <td bgcolor="#008080"> </td> </tr> </table> </center></div>
<%@ page import = "java.sql.*" %> <%@ page import = "java.io.*" %> <%@ page import= "sun.net.smtp.SmtpClient" %> <% String from,to,subject,msgbody,serverName; try
catch (Exception e)
%> Hold On A Moment while I try to Send Your Mail... <BR> <% out.flush(); try
catch (Exception e)
%> <BR>
afisare.jsp
<%@ page import="javax.servlet.http.HttpUtils" %> <%@ page import="java.util.*" %> <%@ page import = "java.sql.*" %> <%@ page import = "java.io.*" %> <%@ page import = "myPackage.User81" %> <jsp:useBean id="bean81" scope="session" class="myPackage.User81" /> <jsp:setProperty name ="bean81" property="R1" /> <html> <head> <title>Afisare imagini / Rulare secvente audio-video</title> </head> <body background="/images/back.jpg"> <table border="0" cellpadding="4" width="179" height="32" background="/images/back.jpg"> <tr> <td width="76" align="left" bgcolor="#C0C0C0" height="1"> <p align="center"><b><font size="2"><a href="../../Managementul%20unei%20DB%20MM.htm"> Home Page</a></font></b></td> <td width="77" align="left" bgcolor="#C0C0C0" height="1"> <font size="2"><b><a href="../new_page_4.htm"
target="_self">Main Page</a></b></font></td> </tr> </table> <table border="0" cellpadding="4" width="100%" height="1" background="/images/back.jpg"> <tr> <td width="21%" align="left" bordercolor="#0099CC" bgcolor="#FFFFFF" height="1" background="/images/back.jpg"> <hr size="5" color="#0099CC"> <p align="center"><b> <font color="#0000FF"><font size="5">M</font><font size="4">anagementul </font><font size="5">U</font><font size="4">nei </font><font size="5">B</font><font size="4">aze de </font><font size="5">D</font><font size="4">ate </font><font size="5">M</font><font size="4">ultimedia</font></font></b> <p align="center"> </p> <form method="POST" action="user2.htm"> <% String nume = bean81.R1; String url = "http://193.226.17.8:7070/myRoot/MMFiles/"+nume; if ((nume.endsWith("jpg")) | (nume.endsWith("gif"))) else %> <center> <p align="right"><input type="submit" value="Submit" name="B1"></p> </center>
</form> <p align="center"> </p> </td> </tr> </table> <p> </p> <table border="0" cellpadding="4" width="100%" height="32" background="/images/back.jpg"> <tr> <td width="21%" align="left" bordercolor="#0099CC" bgcolor="#C0C0C0" height="1" background="/images/back.jpg"> <hr size="5" color="#0099CC"> <p align="left"><img border="0" src="/images/B5OV.GIF" width="36" height="40"> <img border="0" src="/images/B6OV.GIF" width="38" height="40"></td> </tr> </table> </body> </html>
User81.java package myPackage;
import java.awt.*; import java.util.*; public class User81 public int getIdFile(int i) public String readColoana(String tabel, String numeColoana, String id) public String readColoana(String tabel, String numeColoana, int
insert_file.htm
<html> <head> <title>Title </title> </head> <body background="/images/back.jpg"> <table border="0" cellpadding="4" width="100%" height="1" background="/images/back.jpg"> <tr> <td width="21%" align="left" bordercolor="#0099CC" bgcolor="#FFFFFF" height="1" background="../../images/back.jpg"> <hr size="5" color="#0099CC"> </td> </tr> </table> <p align="center"><b> <font color="#0000FF"><font size="5">M</font><font size="4">anagementul </font><font size="5">U</font><font size="4">nei </font><font size="5">B</font><font size="4">aze de </font><font size="5">D</font><font size="4">ate </font><font size="5">M</font><font
size="4">ultimedia</font></font></b> <p align="center"><b><font size="4">Introducerea informatiilor in baza de date </font></b></p> <p align="center"> </p> <form method="POST" action="insert_file.jsp"> <p Completati campurile de mai jos cu informatile care se vor dori a fi introdusa in baza de date.</p> <p align="left" style="margin-bottom: -13"> </p> <p align="left" style="margin-bottom: -13"> </p> <center> <table border="0" cellpadding="4" width="50%"> <tr> <td width="33%"> Nume Fisier </td> <td width="33%"> <INPUT TYPE="file" name="F1"> </td> <td width="34%"> Ex: xxx.gif, xxx.mpg, etc.</td> </tr> <tr> <td width="33%">Informatii</td> <td width="33%"> <textarea rows="8" name="S1" cols="50"></textarea></td> <td width="34%"> Ex: Reprezinta "poza" autorului acestui web site</td> </tr> <tr>
<td width="33%"> </td> <td width="33%"> </td> <td width="34%"><input type="submit" value="Submit" name="B1"></td> </tr> </table> </center> </form> <p align="center"> </p> <p> </p> <table border="0" cellpadding="4" width="100%" height="32" background="/images/back.jpg"> <tr> <td width="21%" align="left" bordercolor="#0099CC" bgcolor="#C0C0C0" height="1" background="/images/back.jpg"> <hr size="5" color="#0099CC">
<p align="left"><img border="0" src="/images/B5OV.GIF" width="36" height="40"> <img border="0" src="/images/B6OV.GIF" width="38" height="40"></td>
</tr>
</table>
</body> </html>
insertFile.jsp
<%@ page import="javax.servlet.http.HttpUtils" %> <%@ page import="java.util.*" %> <%@ page import = "java.sql.*" %> <%@ page import = "java.io.*" %>
<%@ page import = "myPackage.Bean3" %> <jsp:useBean id="bean3" scope="session" class="myPackage.Bean3" /> <html> <head> <title>Fereastra de Vizualizare</title> </head> <body background="/images/back.jpg"> <table border="0" cellpadding="4" width="179" height="32" background="/images/back.jpg"> <tr> <td width="76" align="left" bgcolor="#C0C0C0" height="1"> <p align="center"><b><font size="2"><a href="../../Managementul%20unei%20DB%20MM.htm"> Home Page</a></font></b></td> <td width="77" align="left" bgcolor="#C0C0C0" height="1"> <font size="2"><b><a href="../new_page_4.htm" target="_self">Main Page</a></b></font></td> </tr> </table> <table border="0" cellpadding="4" width="100%" height="1" background="/images/back.jpg"> <tr> <td width="21%" align="left" bordercolor="#0099CC" bgcolor="#FFFFFF" height="1" background="/images/back.jpg"> <hr size="5" color="#0099CC"> <p align="center"><b> <font color="#0000FF"><font size="5">M</font><font size="4">anagementul </font><font
size="5">U</font><font size="4">nei </font><font size="5">B</font><font size="4">aze de </font><font size="5">D</font><font size="4">ate </font><font size="5">M</font><font size="4">ultimedia</font></font></b> <p align="center"> </p> <form method="POST" action="CadruPrincipal.htm"> <% String nume = bean3.getName(); String complet = bean3.F1; String url = "http://193.226.17.8:7070/myRoot/MMFiles/"+nume; if ((nume.endsWith("jpg")) | (nume.endsWith("gif"))) else %> <center> <p align="right"><input type="submit" value="Submit" name="B1"></p> </center> </form> <p align="center"> </p> </td> </tr> </table> <% bean3.setMMFiles(); ftpClient client = new ftpClient();
client.getFis(bean3.getName(), "myLoginID", "myPassword") %> <p> </p> <table border="0" cellpadding="4" width="100%" height="32" background="/images/back.jpg"> <tr> <td width="21%" align="left" bordercolor="#0099CC" bgcolor="#C0C0C0" height="1" background="/images/back.jpg"> <hr size="5" color="#0099CC"> <p align="left"><img border="0" src="/images/B5OV.GIF" width="36" height="40"> <img border="0" src="/images/B6OV.GIF" width="38" height="40"></td> </tr> </table> </body> </html>
ftpClient.java
package myPackage; import sun.net.ftp.*; import sun.net.*; import java.io.*; public class ftpClient extends FtpClient os.close(); } catch (java.io.IOException e) } }
Bean3.java
package myPackage; import java.awt.*; import java.util.*; public class Bean3 public String getF1() public void setF1(String F1) public String getS1() public void setS1(String S1) public boolean validate() if (S1.equals("")) return allOk; } public String getName() // scrierea informatiei in tabelul MMFiles al DB public void setMMFiles() }