În prezent cea mai populara aplicatie Internet este, fara îndoiala, World Wide Web, pe scurt WWW. Aceasta permite utilizatorilor din întreaga lume sa colaboreze utilizând o serie de documente aflate într-o continua schimbare. În WWW exista o distinctie clara între partea de client si partea de server a aplicatiei. Un server WWW gestioneaza o serie de documente si le trimite la cerere clientilor. Browserul Web (clientul) are facilitati care permit utilizatorilor sa solicite documente stocate pe un server Web, afisându-le pe monitor într-un format corespunzator, în mod grafic. Protocolul utilizat pentru realizarea comunicatiei client - server este numit HyperText Transfer Protocol. Fiecare actiune în cadrul acestui protocol consta dintr-o cerere emisa de client în format ASCII si un raspuns elaborat de server, conform conventiilor MIME.
Componentele Web respecta tehnologia platformelor Java pentru constructia aplicatiilor care contin pagini Web dinamice, cum ar fi HTML, DHTML, XHTML si XML. Tehnologiile Java Server Pages sau Java Servlets, extind capacitatile serverelor Web, oferind o serie întreaga de avantaje, cum ar fi faptul ca pot rula pe orice platforma indiferent pe care a fost creat programul, accentueaza refolosirea componentelor JavaBeans sau Enterprise JavaBeans. Ele formeaza asa - numitul container web, parte integranta din Java 2 Enterprise Edition, ceea ce îi confera multe facilitati pentru aplicatiile Web.
Procesarea form-urilor HTML folosind Servleti sau JSP, este una dintre cele mai întâlnite operatii executate pe Web în acest moment lucru ce se va observa si în exemplele capitolului de fata. De asemenea, acest capitol se vrea a fi o scurta, dar îndrazneata prezentare a conceptelor de baza întâlnite în utilizarea tehnologiilor bazate pe limbajul Java care au ca rol fundamental dezvoltarea aplicatiilor web.
Java Servlets sunt programe Java, independente de platforma, utilizate pentru a extinde capacitatile serverelor web. Se poate face o paralela între ceea ce reprezinta servletii pentru serverul web si ceea ce reprezinta applet - urile pentru client. Ambele sunt programe Java compilate (bytecode) care pot fi încarcate dinamic si extind capacitatile masinii. Totusi, appletul este o componenta client - side, care ruleaza într-un browser web, în interiorul unei pagini web sau a unei interfete grafice, iar servletii fac parte din asa - numitele componente server - side, interactionând cu motorul servletului, suportat de catre serverul web, având la baza conceptul de comunicatie cerere - raspuns (bazat la rândul lui pe protocolul HTTP).
Aplicatia client, de exemplu web browser, acceseaza serverul web si trimite o cerere. Aceasta cerere este procesata de catre motorul servletului, instalat pe server - ul web. Acesta returneaza un raspuns servletului iar servletul returneaza la rândul lui raspuns HTTP clientului.
Servletii folosesc clase din pachetele javax.servlet (pachetul Servlet principal) si javax.servlet.http (extensie a pachetului principal, pentru servlet-uri care raspund cererilor HTTP).
Caracteristic serveletilor HTTP avem:
procesarea si/sau stocarea unor date trimise de un form HTML
asigura un continut dinamic, de exemplu, returnarea unor date dintr-o baza de date
administrarea mai multor cereri HTTP
Modul traditional de a adauga unele noi functii unui server web este cunoscutul model Common Gateway Interface (CGI). Acesta poate astfel permite server-ului pornirea unui proces extern ce preia informatii privind o anume cerere, prin intermediul unor variabile de mediu si care trimite datele de raspuns printate. Fiecare cerere este administrata într-un proces de o instanta separata a programului (script-ului) CGI.
Avantajele servletilor fata de CGI:
Servlet-ul nu ruleaza într-un proces separat, acesta elimina posibilitatea crearii de noi procese pentru fiecare cerere
Servletul este încarcat în memorie si ramâne acolo între cereri. Un program CGI este încarcat pentru fiecare cerere CGI. Exista o singura instanta care raspunde cerereilor simultane, acesta duce la salvarea de memorie si permite servletilor o administare mai usoara a datelor.
Servlet-ul poate fi rulat de motorul servletului (Servlet Engine) într-o zona restrictiva (Sandbox), fapt care permite folosirea sigura a potentialelor.
Toti servletii implementeaza interfata Servlet sau, de cele mai multe ori, extind clasa HttpServlet care implementeaza interfata Servlet.
Interfata Servlet defineste metode pentru a initializa un servlet si de a comunica cu clientii.
Când un servlet acepta o cerere de la un client, el primeste doua obiecte:
ServletRequest
ServletResponse
Ambele încapsuleaza comunicarea client - server.
Interfata ServletRequest permite servletului accesul la unele informatii cum ar fi numele parametrilor trimisi (pasati) de client, protocolul (http, https, ftp) folosit de client, numele clientului.
De asemenea ofera o clasa ServletInputStream prin care servletul primeste date de la clientii care folosesc protocolul HTTP prin metode ca POST si PUT. Subclasele lui ServletRequest permit serverului recuperarea de date specifice protocolului. De exemplu, clasa HttpServletRequest contine metode care pot accesa informatii specifice din antetul HTTP.
Interfata ServletResponse ofera metode pentru a raspunde clientului. Permite servletului setarea ContentLength (lungimea câmpului de date) precum si setarea tipului de date returnat MIME type oferind un ouput stream prin intermediul metodei getWriter(), sau a clasei ServletOutputStream.
Subclasele lui ServletResponse, ofera servletului mai multe capabilitati specifice protocolului. De exemplu HttpServletResponse contine metode care permit servletului manipularea de câmpuri specifice protocolului HTTP.
Cilclul de viata al unui servlet defineste modul în care servletul este încarcat si initializat, modul în care el primeste si raspunde cererilor, precum si modul de terminare a actiunii lui.
Încarcarea si instantierea - motorul servletului este cel care realizeaza aceste taskuri, când acesta îsi începe activitatea, când acesta trebuie sa raspunda unor cereri venite de la client. Motorul servletului foloseste facilitatile de încarcare ale claselor Java, putând realiza încarcarea fie de pe un sistem local de fisiere, fie de pe unul aflat la distanta, sau chiar de pe o sursa de retea.
Initializarea - dupa încarcare, motorul servletului trebuie sa initializeze servletul. Initializarea este utilizata în special pentru citirea datelor persistente, ce pot fi stocate, pentru initializarea conexiunii la o baza de date, precum si pentru stabilirea referintelor la alte resurse. Cea care furnizeaza servletului informatii de initializare este metoda init() a interfetei javax.servlet.Servlet, astfel ca servletul este pregatit pentru autoconfigurare. Obiectul de configurare, de tip ServletConfig, este transmis ca si parametru metodei init(). Acesta este implementat în motorul servletului, permitând servletului sa acceseze parametrii pereche nume - valoare din informatia de configurare. De asemenea, furnizeaza acces la obiectul de tip ServletContext.
Tratarea cererilor - dupa ce este initializat servletul este gata pentru a raspunde cererilor clientilor, reprezentate ca obiect de tip ServletRequest. Servletul raspunde cererii printr-un obiect de tip ServletResponse. Când un client executa o cerere, motorul servletului trimite servletului ambele obiecte, atât response cât si request ca si parametrii metodei service(), definita de interfata Service, implementata de catre servlet.
Distrugere unui servlet - motorul serverului nu este obligat pentru a mentine în viata un servlet pe toata perioada de rulare a serverului. În cazul în care motorul servletului doreste eliberarea unor resurse, sau oprirea sa, se va apela metoda destroy(), implementata de servlet, respectând în prealabil un anumit interval de timp dupa executia ultimului apel al metodei service().
Definirea obiectului de tip ServletContext - prin utilizarea acestui tip de obiect servletul poate trata evenimente, poate obtine resurse si obiecte de la motorul servletului, de exemplu, obiect de tip RequestDispatcher. Un servlet poate rula într-un singur context de servlet, dar servleti diferiti pot avea vizualizari diferite asupra motorului servletului.
Sesiuni HTTP. Pentru a realiza o aplicatie web, trebuie sa se asigure identificarea unor serii de cereri unice trimise de clientul aflat la distanta. Java Servlet API furnizeaza o interfata simpla care sa permita motorului servletului utilizarea unui numar de tehnici de tratare a sesiunii dedicata unui utilizator.
Servletii implementeaza interfata javax.servlet.Servlet. Astfel:
Se pot scrie servleti care implementeaza direct aceasta interfata dar de obicei acest lucru nu este necesar, deoarece de obicei servletii sunt folositi cu protocolul HTTP, utilizând o clasa mai specializata javax.servlet.http.HttpServlet
Clasa HttpServlet implementeaza interfata Servlet prin extinderea clasei de baza GenericServlet si ofera un mod de lucru pentru manipularea protocolului HTTP. Ea poate suporta mai multe fire de executie simultane rulând mai multe metode service(). În cazurile în care se doreste ca un singur serviciu sa ruleze la un moment dat, aditional se implementeaza si interfata SingleThreadModel. Aceasta nu impune scrierea unor alte metode, ajunge doar implementarea intrefetei.
Clasa HttpServlet este o clasa abstracta, iar clasa care o extinde trebuie sa suprascrie unele metode proiectate pentru a manevra cereri HTTP. Aceste metode sunt :
doGet pentru a manevra cereri de tip GET si HEAD
doPost pentru cereri de tip POST
doPut pentru cereri de tip PUT
doDelete pentru cereri de tip DELETE
Implicit aceste metode returneaza mesaj de BAD_REQUEST (400).
Ca si avantaje ale servleturilor putem aminti comunicatia inter-servlet. Pe un server exista mai multe servleturi. Prin apelarea metodei getServletNames(), se returneaza lista cu ceilalti servleti. Comunicarea însa este putin mai complicata deoarece trebuie sa se aiba în vedere ca servletii sunt încarcti de ClassLoader. Pentru a putea face o comunicare trebuie definita o interfata care este încarcata de de SystemLoader si prin care se poate face comunicarea (cu ajutorul obiectelor).
Servletul poate face o cerere spre server la fel ca orice client. Poate accesa resursele pasive ale serverului cum sunt fisierele HTML prin metoda getResouce() din clasa ServletContext. De asemenea mai poate executa:
trimiterea de cookies
internationalizare
autentificarea unui user dupa sesiune (Sessions ).
Accesarea unei baze de date prin intermediul unui servlet
|
DBHandler.java |
|
import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import myPackage.myBean; public class DBHandler extends HttpServlet else } catch (Exception e) |
Afisarea continutului unui form HTML într - o pagina HTML generata dinamic de catre un Servlet
|
Form2.java |
|
package myPackage; import java.io.PrintWriter; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; public class Form2 extends HttpServlet fileReader.close(); responseWriter.close(); |
Citirea a trei imagini de la un URL clar stabilit, a 5 String-uri dintr-o baza de date si afisarea lor în interiorul unei pagini HTML dinamice alaturi de 5 componente grafice de tip .
|
Form1.java |
|
package myPackage import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; public class Form1 extends HttpServlet } catch (Exception e) out.println("<html>" + "<head><title>First Form</title></head>" + "<body bgcolor=\"#FFFFFF\">" + "<center>" + "<hr> <br> " + "<h1>" + "<font size=\"+3\" color=\"blue\">Connected to </font>" + "<font size=\"+3\" color=\"blue\">The Testing System </font>" + "</h1>" + "</center>" + "<br> <hr> <br> "); for(int i=1;i<=strTab.length;i++) out.println("<Form Method=Post>"+ "<br> <hr> <br> "+ "<input type=\"submit\" value=\"Submit\">"+ "<br> <hr> <br> "); out.close(); } |
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:
|
<HTML> |
Paginile JSP sunt create sa suporte mai multe tipuri de documente structurate, îndeosebi HTML si XML. În general, JSP-urile folosesc anumite informatii pe care le trimit la server într-o cerere HTTP care interactioneaza cu datele existente pe acesta si creaza dinamic un raspuns organizat într-un format standard (HTML, DHTML, XML, etc.) sau într-un format text sau neorganizat ce va fi trimis înapoi clientului. O aplicatie Web are la baza:
Java Runtime Environment, ce va rula obligatoriu pe server
JSP page, care preia cererile si genereaza un continut dinamic
Java Servlets, cu acelasi rol ca si JSP
JavaBeans, componenta server-side care încapsuleaza comportamente si stari
pagini statice HTML, XML, DHTML,.
Java Applets sau JavaBeans, componente client-side si eventual alte fisiere Java de tip class
Java Runtime Environment care sa ruleze pe client si care sa poata fi încarcate prin plug-in
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 atât continut cât 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:
|
<%@ directive %> |
În exemplul de mai sus se specifica asignarea
valorii value ca si atribut. O
directiva poate contine n
optiuni ale perechilor atribut/valoare. La momentul potrivit veti
observa utilitatea acestor directive. Exista trei directive, diferite de
specificatiile JSP: page, include si taglib.
Aceasta directiva defineste informatii disponibile global pentru JSP. În cele ce urmeaza vom aminti câteva setari care vor afecta direct compilarea unei pagini JSP :
-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.
Directiva include este folosita pentru înserare de cod si text . Are urmatoarea sintaxa:
|
<%@ include file="relativeURLspec" %> |
De obicei fisierul spre care se
face referire este fie un fisier text,
fie unul HTML, dar nu este exclus sa fie chiar o sursa JSP.
JSP prezinta un mecanism de extindere a setului curent de tag-uri JSP care se realizeaza prin crearea unei bilbioteci de tag-uri, taglib.
Se specifica astfel faptul ca o pagina foloseste tag-uri particularizate, unice prin nume si asociaza prefixul tag pentru distingerea lor în utilizare. Sintaxa arata astfel:
|
<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %> |
uri: referentiaza un URI care în mod unic
numeste un set de taguri.
prefix: defineste prefixul
folosit pentru a distinge o instanta a tag-ului particularizat.
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 câteva actiuni standard:
<jsp:useBean> instantiaza un obiect de tip JavaBean având 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 într-un String pregatind-o pentru afisare
<jsp:include> furnizeaza un mecanism pentru a include resurse statice si dinamice în pagina JSP curenta. Are sintaxa:
|
<jsp:include page="urlSpec" flush="true" /> |
sau
|
<jsp:include page="urlSpec"
flush="true"> |
<jsp:forward>
permite ca un motor JSP sa
comunice runtime, cererea
curenta catre o resursa statica, Servlet sau alt JSP. Actiunea se
termina efectiv când se termina executia paginii curente. Are sintaxa:
|
<jsp:forward page="relativeURLspec" /> |
sau
|
<jsp:forward
page=relativeURLspec"> |
<jsp:plugin> face posibila generarea unei pagini HTML care contine constructii dependente de browser, de exemplu, OBJECT sau EMBED, care va rezulta în download-ul unui plug-in Java si în executia subsecventiala a appletului specificat sau a componentei JavaBeans. Exista posibilitatea înlocuirii tag-ului <jsp:plugin> de un tag <object> sau <embed>, în functie de cerere, si noul tag este trimis ca raspuns. Atributele actiunii <jsp:plugin> furnizeaza date de configurare pentru prezentarea elementului. Are sintaxa:
|
<jsp:plugin
type="pluginType" |
Un exemplu simplu de pagina JSP care combina Script HTML si Beans este cel de mai jos, care afiseaza numele de login al clientului când acesta solicita o pagina prin intermediul unui form HTML:

Pagina contine comenzi sablon, întâlnite în orice pagina HTML si câteva elemente JSP, subliniate. Raspunsul este creat pe baza comenzilor HTML. Când 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.
O pagina JSP este executata într-un container JSP (JSP container), instalat pe un server Web. Acesta preia cererile de la client si le livreaza paginii JSP, returnând rezultatele. Structura semantica a JSP-ului este aceeasi ca si la servleti, prin descrierea modului de creare a obiectul raspuns pornind de la un obiect cerere, pentru un anumit protocol dat, cu posibilitatea folosirii unor alte obiecte deja create. Toate containerele JSP trebuie sa suporte protocolul HTTP, ca si protocol cerere/raspuns. Un container JSP poate sa suporte si alte protocoale. Obiecte cerere/raspuns implicite sunt de tip HttpServletRequest si HttpServletResponse. De asemenea o pagina poate sa indice cum se trateaza anumite evenimente, de exemplu, JSP 1.1 poate doar sa initializeze si sa distruga un event. O pagina JSP este reprezentata de o JSP page implementation class care implementeaza interfata javax.servlet.Servlet. De multe ori paginile JSP sunt implementate folosind JSP translation phase care se poate utiliza o singura data, urmata de un request processing phase, care se foloseste o singura data pe cerere.
O pagina va contine câteva declaratii, comenzi standard (fixed template), actiuni (action instances) cel mai frecvent încuibarite si elemente script. Când o cerere este livrata paginii, toate aceste elemente sunt folosite ca sa creeze obiectul raspuns ce se returneaza clientului. O pagina JSP descrie etapele de creare a unui obiect reponse pe baza unui obiect request pentru un protocol dat, cu posibilitatea crearii si/sau utilizarii altor obiecte. O pagina JSP este executata de un container JSP; cererile trimise paginii sunt livrate de catre container unei JSP page implementation care este o subclasa de Servlet.
O aplicatie Web este o colectie de resurse disponibile prin intermediul unor URL-uri. Aceste resurse includ pagini JSP, Java Servlets, pagini statice si alte resurse sau clase bazate pe tehnologia Java folosite de componentele server-side. Pe lânga acestea exista si clase (cum ar fi applet-uri Java, componente JavaBeans) ce pot fi folosite de client prin download. O aplicatie Web are o descriere a desfasurarii (deployment descriptor) web.xml care contine informatii despre JSP, Servleti si alte resurse folosite de catre aceasta. În utilizarea JSP 1.1 este obligatoriu ca toate aceste resurse sa fie asociate implicit cu o instanta unica ServletContext si accesibile prin aceasta. Instanta este disponibila ca obiect implicit application. JSP mosteneste notiuni despre aplicatiile Web de la Servlet 2.2. Aplicatia careia îi apartine pagina JSP este reflectata în obiectul application si are influenta în semantica elementelor ca si instructiunea include, actiunea jsp:include, sau actiunea jsp:forward.
Un container JSP este o entitate la nivel de sistem care permite managementul rularii programului si suport pentru componentele JSP si Servlet.
O componenta Web este fie un Servlet, fie o pagina JSP. Aceasta componenta poate folosi serviciile propriului container. Elementul servlet web.xml este folosit pentru a descrie ambele tipuri de componente web. Majoritatea componentelor de tip pagina JSP sunt definite implicit în descriptorul desfasurarii programului, prin folosirea unei extensii implicite .jsp.
O clasa JSP page implementation defineste o metoda jspService() care mapeaza cererea în obiect de tip response. Detaliile acestei transformari sunt specifice fiecarui limbaj, dar în cazul nostru sunt tratate doar cele generale. Aproape tot continutul paginii JSP este dedicat descrierii datelor ce vor fi puse în stream-ul de scriere, returnat clientului. Descrierea este bazata pe un obiect JspWriter, out. Acesta poate avea mai multe valori, initial, out este un nou obiect JspWriter. Acesta poate fi diferit de stream-ul obtinut prin apelul metodei response.getWriter() si este obiectul initial de iesire.
În interiorul unor anumite actiuni, out poate fi temporar realocat pentru o alta instanta a obiectului JspWriter, încuibarita. De obicei, continutul sau rezultatul procesarii continutului acestor stream-uri temporare este adaugat stream-ului out apoi reasignat. Unele stream-uri încuibarite sunt puse într-un buffer si necesita o creare explicita pentru a returna continutul lor. Daca obiectul initial de iesire JspWriter este într-un buffer, atunci în functie de valoarea atributului autoFlush din instructiunile paginii, continutul buffer-ului va fi automat transferat în stream-ul de scriere ServletResponse sau este lansata o exceptie buffer overflow. Daca JspWriter nu este într-un buffer, continutul sau va fi trecut direct în stream-ul de scriere.
Instructiuni (directive)
Instructiunile sunt mesaje destinate containerul JSP. In JSP 1.1 acestea au urmatoarea sintaxa:
|
<%@ directive *%> |
Între "<%@" si "*%>" pot exista spatii libere fara sa apara nici un fel de probleme. Singurul necaz este acela ca aceasta sintaxa nu este compatibila XML, pentru rezolvare trebuind sa se faca o mapare a comenzilor. Instructiunile nu returneaza nimic în stream-ul de scriere curent.
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 aplicându-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 câteva 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 script-urilor 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 pâna atunci întâlnirea 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 cînd language are ca parametru java.
session: indica faptul ca pagina implica prezenta unei sesiuni http. Daca valoarea este "true", atunci implicit variabila "session" de tipul javax.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 buffer-ului 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. Ramâne de mentionat ca obiectul Throwable este transferat catre error page implementation prin 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.
O pagina JSP poate crea si/sau accesa anumite obiecte Java pentru a procesa o anumita cerere. Unele obiecte sunt create implicit, ca rezultat al unei instructiuni, iar altele explicit prin anumite actiuni. De asemenea, obiectele pot fi create direct, prin scrierea unui script. Odata creat, un obiect are un scope attribute care arata unde este referinta sa si când aceasta este stearsa. Obiectele pot fi accesibile script-ului prin intermediul unor variabile scripting-level, care vor fi descrise mai pe larg în sectiunea "Obiecte si variabile". Obiectele sunt întotdeauna create în cadrul unei pagini JSP, care trebuie sa returneze un anumit obiect raspuns. Exista urmatoarele atribute de tip domeniu de vizibilitate (scope) definite de JSP:
page obiectele sunt accesibile numai în cadrul paginii în care au fost create. Toate referintele la un astfel de obiect ar trebui eliberate dupa ce este formulat si trimis un raspuns. Referintele la aceste obiecte sunt stocate în obiectul pageContext.
request - obiectele sunt accesibile din toate paginile care proceseaza aceeasi cerere unde au fost create. Referintele se gasesc în obiectul request, si trebuie eliberate dupa ce cererea a fost procesata; fac exceptie cererile transmise în cadrul executiei curente.
session obiectele sunt accesibile în toate paginile care proceseaza cereri din aceeasi sesiune cu cea în care au fost create. Referintele trebuie eliberate dupa ce sesiunea asociata se termina si sunt stocate în obiectul session, asociat cu activarea paginii.
application obiectele pot fi accesate din paginile care proceseaza cereri ce sunt în aceeasi aplicatie cu cea în care au fost create. Referintele se gasesc în obiectul application.
Elementele JSP pot fi de doua tipuri instructiuni si actiuni. Instructiunile furnizeaza informatii globale care sunt conceptual independente de orice cerere primita de JSP. Actiunile sunt dependente de detaliile fiec[rei cereri primite. Ele pot crea anumite obiecte si le pot face disponibile elementelor script prin variabile de tipul scripting-specific.
Sintaxa actiunilor o urmeaza pe cea a elementelor XML, având un tag de start, un body si un tag de sfârsit:
|
<mytag attribute = "attribute value" .> .body. </mytag> |
Sintaxa unei instructiuni:
|
<%@ directive .%> |
Un element JSP contine un element type care descrie numele tag-ului, atributele valide si forma lui.
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 sfârsit, 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.
Un obiect poate fi accesibil elementelor script din cod printr-o variabila. Un element poate defini o variabila în doua locuri: imediat dupa tag-ul de start sau dupa ce a fost închis cu tag-ul de sfirsit. Variabilele contin o referinta la obiectul definit de respectivul element, cu toate ca mai exista o referinta dependenta de domeniul de vizibiliate al obiectului. Mentionam faptul ca numele si tipul variabilei pot fi dependente de limbajul script folosit, acesta putând influenta modul de expunere al caracteristicilor obiectului.
Script-urile, actiunile si elementele beans reprezinta toate mecanismele care pot fi implementate pentru descrierea comportamentului dinamic al unei pagini JSP. Specificatiile JSP nu limiteaza folosirea acestora, lasând programatorul sa le foloseasca în functie de aplicatia dorita. Exista anumite actiuni standard care sunt folosite în interactiunea cu orice Bean. Un Bean extins, implementând interfata Tag, devine un tag handler si poate fi folosit direct în pagina.
Între cele douǎ tehnologii existǎ mai multe asemanari, dar si deosebiri majore. Nu se poate spune care dintre cele doua tehnologii este mai puternica fiecare are punctele sale forte dar si puncte vulnerabile.
Punctele comune ar fi:
ASP foloseste obiecte ActiveX pentru o mai mare functionalitate iar JSP foloseste JavaBeans
Atât ASP cât si JSP sunt limbaje interpretate, ASP-ul este convertit în Pcod iar JSP-ul în bytecode.
ASP-ul permite crearea de functii separate de cod iar JSP-ul poate utiliza clase si variabile declarate extern
Exista si anumite deosebiri:
ASP foloseste ca limbaj Visual Basic Script pe când JSP este focalizat pe Java
ASP-ul este deja un produs inclus în Internet Information Server al firmei Microsoft pe când JSP este suportat de servere mult mai puternice
Ce are în plus JSP:
Limbajul Java este mult mai puternic decât 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 raspândit 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 gândire 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 pâna când tehnologia axata pe componente a câstigat 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 încât, valorile, datele si informatiile returnate de aceste componente sǎ poata fi încadrate si aranjate în pagini HTML.
JSP poate fi folosit atât de catre programatorii Java avansati cât si de catre programatorii care n-au o experienta vasta în domeniul programarii Java deoarece acestia pot utiliza componentele pe care cei dintâi 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.
Sintaxa elementelor JSP are la baza XML. Fiecare element are un tag de start (care include si numele elementului), eventual anumite atribute, un body optional, un tag de sfârsit, sau pot sa aiba un tag gol cu atribute de genul:
|
<my tag attr1="attribute value" .> body </mytag> |
sau,
|
<mytag attr1="attribute value" .> |
Dupa cum se vede, valoarea atributelor se scrie între ghilimele sau apostroafe. De mentionat este faptul ca tag-urile JSP sunt case-sensitive, ca si în XML sau XHTML. Toate paginile JSP au un echivalent valid în XML. Elementele care folosesc sintaxa alternativa sunt de forma: <% .. %>. Toate elementele JSP care au tag-uri de start si stop distincte (si un body inclus) trebuie sa înceapa si sa se sfârseasca în acelasi fisier. Daca un element are un tag gol, este tratat ca si unul care are un tag de start, unul de stop si un body gol. Acestea se numesc elemente goale (empty elements). Liniile goale (white spaces) nu sunt luate în considerare dar este indicat sa nu apara în program.
Exista doua etape logice în procesarea fisierelor sursa a paginilor JSP:
Translatia (compilarea) din sursa JSP în fisier JSP page implementation class.
Procesarea cererilor pentru fiecare client în parte de catre o instanta a JSP page implementation class.
Erorile pot sa apara în orice moment al acestui proces. În continuare vor fi prezentate metodele de tratare a acestora.
Erorile de translatie
Translatia fisierului sursa printr-un container JSP poate avea loc oricând î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 întâlnim error status code 500 (Server Error).
Erori pe durata procesarii cererilor
De-a lungul procesarii cererilor clientilor pot apǎre 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.
3.3.5. Containerul JSP
Asa cum s-a mai spus, o pagina JSP este executata de un container JSP, instalat pe serverul web. Containerul livreaza cererile clientului catre pagina JSP si rǎspunsurile acesteia înapoi clientului. Semantica modelului aflat în spatele paginilor JSP este aceeasi ca si în cazul servletilor: o pagina descrie cum sa fie creat obiectul response din obiectul request pentru protocolul Servlet, cu posibilitatea de a crea si/sau folosi în proces alte obiecte. Tot aici pot fi indicate cum sunt tratate anumite evenimente (pt JSP1.1 numai init si destroy).
Protocolul vǎzut din punctul de vedere al serverului Web
Entitatea care proceseaza cererile si creaza raspunsurile trebuie sa se comporte ca si o clasa Java, care implementeaza protocolul descris de servlet. Un container JSP localizeaza mai întâi o instanta a unei astfel de clase dupa care proceseaza cererile în concordanta cu protocolul sus - amintit. Uneori containerul trebuie sa creeze anumite clase dinamice din pagina sursa, înainte de a crea obiectul raspuns. Prin acestea, se defineste un contract între container si JSP page implementation class. Daca este folosit protocolul HTTP, contractul este descris de catre clasa HttpServlet.
Protocolul vǎzut de catre autorul paginii JSP
Un astfel de contract este definit si între container si pagina. Acest contract este generat automat prin folosirea metodei _jspService(). Aceasta descrie actiunile ce trebuie facute la întâlnirea unor metode cum ar fi init() sau destroy().
Constrângerile dintre JSP container si JSP page apar pentru ca clasa Servlet corespunzatoare paginii trebuie sa implementeze interfata HttpJspPage, pentru protocolul HTTP.
Containerul JSP creaza o clasa de interpretare pentru fiecare pagina JSP în parte. Numele acesteia este dependent de container. Crearea acestei clase poate fi facuta de catre un container sau poate fi implicata o superclasa furnizata de catre programator, prin atributul extends din comanda jsp. Acest mecanism este destul de complicat, fiind recomandat sa se foloseasca cu multa atentie. Pentru rezolvarea cererilor va fi folosit protocolul Servlet si pot fi folosite o serie de alte clase aditionale, eexistente în acelasi pachet cu clasa de implementare pentru a fi portabil în orice container.
API Contracts
Contractul dintre un container JSP si o clasa Java de implementare a paginii JSP corespunde interfetei Servlet. Contractul dintre JSP container si JSP page este descris în cele ce urmeaza:
jspInit() - Metoda este definita optional în pagina JSP. Metoda este invocata când pagina JSP este initializata. Când metoda este apelata, toate metodele in servlet, inclusiv getServletConfig() sunt disponibile.
jspDestroy() - Metoda este definita optional în pagina JSP si este invocata înaintea distrugerii paginii.
_jspService(<ServletRequestSubtype>, <ServletResponseSubtype>) - Metoda nu poate fi definita în pagina JSP. Containerul JSP genereaza automat aceasta metoda, luând în considerare continutul paginii JSP. Metoda este invocata pentru fiecare cerere client.
Request and response parameters
Dupǎ cum s-a vǎzut 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.
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 pǎstreaza 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 decât 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(); _jspService(<SRequest> request, <SResponse> response) |
Chiar si cu buffer-ul activat se poate folosi redirectarea metodelor dintr-un script prin invocarea directa a comenzii response.redirect(URL).
Precompilarea
O pagina care foloseste protocolul HTTP va receptiona cereri HTTP. Containerele JSP1.1 trebuie sa suporte un precompilation protocol simplu, precum si câteva reserved parameter names elementare. Sa nu se confunde protocolul de precompilare cu notiunea de compilare a unei pagini JSP într-un Servlet.
Toate numele parametrilor request care încep cu "jsp" sunt rezervati si nu pot fi folositi oricum, decât asa cum se specifica în specificatii. Toate paginile JSP trebuie sa ignore orice parametru care incepe cu "_jsp".
O cerere catre o pagina JSP care contine un parametru cerere cu numele "jsp_precompile" este o precompilation request. Un astfel de parametru poate sa nu contina nici o valoare sau o valoare "true" sau "false". În toate cazurile cererile nu trebuie livrate paginii JSP.
Intentia cererii de precompilare este aceea de a avertiza containerul sa precompileze pagina JSP în propria clasa de implementare. Acest lucru este dat de valoarea parametrului "true" sau fara valoare, cu mentiunea ca în aceste cazuri cererea poate fi doar ignorata. În exemplele de mai jos în liniile 1, 2 si 4 cererea nu va fi trimisa paginii, în 3 si 5 cererea va fi trimisa fara nici o modificare, iar în 6 este incorecta, generând o eroare Server Error:
|
?jsp_precompile ?jsp_precompile="true" ?jsp_precompile="false" ?foogar="foobaz" & jsp_precompile="true" ?foobar="foobaz" & jsp_precompile="false" ?jsp_precompile="foo" |
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, afectând 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, putând 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 cât 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 interfata javax.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 a doua metode aditionale atunci când handler-ul manipuleaza body-ul: doInitBody() si doAfterBody().
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 când 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 când este întilnit tag-ul de sfârsit. Rezultatul acesteia indica daca mai este evaluat sau nu ce a mai ramas din pagina. Un caz particular des întâlnit este folosirea unui body gol.
Actiuni cu body
În acest caz sunt invocate metodele doInitBody() si doAfterBody(), definite în interfata BodyTag. Astfel, evaluarea este fǎcuta 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 sfârsit 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 într-un 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 câteva 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 cu PageContext.
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:bar att1="." att2="." att3="." /> BODY </x:bar> |
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ǎ taglib ce 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 taglib-location. Deci:
taglib: este un subelement al aplicatiei web: <! element web-app . taglib* . >. Acest element are la rândul sau alte doua subelemente si un atribut:
<!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.
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 id ID #IMPLIED xmlns CDATA #FIXED *https://java.sun.com/j2ee/dtds/web-jsptaglibrary_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 implementând 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, required?, rtextvalue?)>. Are trei subelemente de forma:
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:
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 si BodyTagSupport. Un tag handler are anumite proprietǎti 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 ramân 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 târziu printr-o variabila script. Metoda getVariableInfo() este folosita pentru a furniza informatii despre fiecare variabila care va fi creata la request time când respectiva actiune este executata. Rezultatul acestei metode este o matrice având 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 sǎu 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 pânǎ la sfârsitul paginii
AT_END - variabila este vizibila dupa tag-ul end al actiunii care o defineste pâna la sfârsitul 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 târziu, 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:
|
<action> <bar/> </action> |
Aceastǎ facilitate este suportata de catre metoda statica findAncestorWithClass(Tag,Class) din Tag care utilizeaza o referintǎ la tag-ul parinte tinut de catre fiecare instanta Tag în parte, care efectiv furnizeaza o stivǎ run-time. În foarte multe cazuri exista anumite constrângeri în legǎtura cu folosirea actiunilor, care daca nu sunt respectate determina lansarea unor exceptii catre utilizator.
Informatii sintactice în TLD (Tag Library Descriptor)
TLD contine anumite informatii sintactice de baza. În mod particular, atributele sunt descrise incluzând 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 constrângerile descrise în TLD sunt obligatorii.
Desi JSP-urile pot fi folosite pentru majoritatea scopurilor, exista anumite situatii când servletii sunt mai indicati.
Servletii sunt potriviti pentru generarea de date binare ca de exemplu imagini sau continut special. Cererile pentru acel tip de continut sunt mapate la servleti care stiu sa genereze acel tip de continut, dar din punctul de vedere al clientului web, el cere o imagine normala. Singura presupunere facuta este ca clientul suporta formatul de imagine generat.
Un exemplu comun pe Internet este un servlet care genereaza un grafic cu cotatiile la bursa cu date luate on-line dintr-o baza de date. Aceasta imagine este stocata în memorie si regenerata în fiecare minut. Astfel se salveaza timp si creste performanta atât pentru ciclurile de executie cât si pentru accesul la fisiere.
Servletii sunt un mecanism portabil pentru extinderea functionalitatii unui server web. De exemplu, daca este nevoie sa fie suportat un nou format de date, se creaza un servlet care apoi este mapat pentru acel tip de date.
Un bun exemplu este un servlet care extinde un server web pentru paginile JSP. Acest servlet parcurge toate fisierele care au extensia jsp si le compileaza în servleti. Acesti servleti rezultati sunt apoi executati de un container web si raspunsul rezultat este trimis la client.
3.3.6.3. Paralela pagini JSP - Servleti
Depinzând de componenta echipei de dezvoltare, de constrângerile 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 ramâne 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.
Extinderea unei aplicatii SMTP Client utilizând Java Server Pages:
|
FormMail.htm |
|
<HTML> <HEAD> <TITLE>MailForm</TITLE> </HEAD> <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">[email protected]</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">[email protected]</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> </form> </BODY> </HTML> |
|
FormMail.jsp |
|
<%@ page import="javax.servlet.http.HttpUtils" %> <%@ page import="java.util.*" %> <%@ 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> <BR> <A HREF="FormMail.htm">Click here to send another!</A> |
Afisarea unui element multimedia (imagine, sunet, secventa audio - video) citit de la un URL clar stabilit.
|
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 = "https://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 id) public String getR1() public void setR1(String R1) |
Introducerea numelui unui fisier multimedia într-o baza de date realizându-se totodata transferul lui într-un subdirector pe masina unde ruleaza serverul web, dupa vizualizarea continutului acestui fisier.
|
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 = "https://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) |
|
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() |
3.4. Bibliografie
https://java.sun.com/docs/books/tutorial/index.html
www.codeguru.com/java/
www.javaworld.com
Oracle 8, Release 8.0.5. Documentation Libtrary
|