Tehnologii avansate de programare
Tehnologii avansate de programare
Tehnologii avansate de programare
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong><br />
Curs 4<br />
Cristian Frăsinaru<br />
acf@infoiasi.ro<br />
Facultatea <strong>de</strong> Informatică<br />
Universitatea ”Al. I. Cuza” Ias¸i
Librării standard <strong>de</strong> taguri (JSTL)<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.1/4
Cuprins<br />
Introducere<br />
Limbajul <strong>de</strong> expresii EL<br />
Taguri <strong>de</strong> bază (Nucleul)<br />
Taguri pentru XML<br />
Taguri pentru interna¸tionalizare<br />
Taguri SQL<br />
Func¸tii<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.2/4
Introducere<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.3/4
Ce reprezintă JSTL ?<br />
Java Standard Tag Library<br />
Librării <strong>de</strong> taguri proprii<br />
Simplificarea creării <strong>de</strong> pagini JSP<br />
Introduce conceptul <strong>de</strong> limbaj <strong>de</strong> expresii (EL)<br />
Standardizarea unor ac¸tiuni<br />
Optimizarea execu¸tiei<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.4/4
Tipuri <strong>de</strong> taguri JSTL<br />
De bază (nucleul) - c<br />
Suport pentru limbajul <strong>de</strong> expresii, controlul<br />
execu¸tiei, gestiune URL-uri<br />
Procesare XML - x<br />
Parsare, transformări<br />
Interna¸tionalizare<br />
Localizare, formatare mesaje, numere ¸si date<br />
Baze <strong>de</strong> date - sql<br />
Conectare, efectuarea <strong>de</strong> secvenâ SQL<br />
Func¸tii - fn<br />
Lucrul cu colec¸tii, ¸siruri<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.5/4
Limbajul <strong>de</strong> expresii (EL)<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.6/4
Ce este EL ?<br />
Limbaj <strong>de</strong> expresii pentru accesarea simplificată a<br />
datelor fără a folosi scriptlet-uri sau expresii JSP.<br />
Exemplu:<br />
<br />
<br />
<br />
;<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.7/4
Sintaxa EL<br />
Expresii<br />
Variabile<br />
Obiecte implicite<br />
Literali<br />
Operatori<br />
Func¸tii<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.8/4
Expresii<br />
Expresiile EL sunt <strong>de</strong> forma ${expresie} ¸si pot fi utilizate:<br />
In continutul tagurilor JSP<br />
<br />
Salut ${utilizator.nume} !<br />
Primul element este: ${colectie[0]}.<br />
<br />
Ca atribute ale tagurilor standard sau proprii<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.9/4
Variabile EL<br />
Referite doar prin numele lor: ${variabila}<br />
Evaluarea:<br />
PageContext.findAttribute(variabila)<br />
Căutarea: page → request → session → application<br />
Proprietă¸tile (valorile) sunt accesate prin:<br />
variabila.proprietate sau<br />
variabila[proprietate].<br />
colec¸tii: variabila.get(valoare)<br />
vectori: variabila[i]<br />
bean-uri: variabila.getProprietate()<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.10/4
Obiecte implicite<br />
pageContext:<br />
servletContext, session, request<br />
pageScope, requestScope, sessionScope,<br />
applicationScope<br />
param, paramValues<br />
hea<strong>de</strong>r, hea<strong>de</strong>rValues<br />
cookie<br />
initParam<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.11/4
Literali<br />
Logici: true, false<br />
Intregi: ca în limbajul Java<br />
Reali: ca în limbajul Java<br />
¸Siruri: "Hello", ’Salut’<br />
null<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.12/4
Operatori<br />
Aritmetici: +, -, *, /, div, %, mod<br />
$1+2 $4/2 - 10 div 5<br />
Logici: and, &&, or, ||, not, !<br />
$true and true || false<br />
Rela¸tionali: ==, eq, !=, ne, , gt,<br />
=, le<br />
$1 >= 2 == 2 ge 3<br />
empty: poate fi folosit pentru a <strong>de</strong>termina dacă o<br />
valoare este vidă<br />
$empty x<br />
Condi¸tional: A ? B : C<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.13/4
Exemple<br />
$param[’nume’] Valoarea unui parametru<br />
$!empty param.nume Existenta unui parametru<br />
$hea<strong>de</strong>r["user-agent"] Browser-ul clientului<br />
$hea<strong>de</strong>r["host"] Adresa server<br />
$initParam.numeImplicit Parametru <strong>de</strong> ini¸tializare<br />
$pageContext.request.contextPath Contextul aplica¸tiei<br />
$pageContext.request.method GET, POST, etc.<br />
$pageContext.session.new E sesiunea nouă ?<br />
$pageContext.servletContext.serverInfo Containerul JSP<br />
$pageContext.exception.message Detalii exceptie<br />
$produse[categorie]<br />
$elemente[0]<br />
$sessionScope.cos.nrArticole<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.14/4
Utilizarea func¸tiilor<br />
Există posibilitatea <strong>de</strong> a <strong>de</strong>fini func¸tii proprii ce vor fi<br />
utilizate în expresiile EL.<br />
Func¸tiile sunt <strong>de</strong>finite ca ¸si tagurile proprii<br />
<br />
...<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.15/4
Definirea func¸tiilor<br />
Definirea clasei<br />
package <strong>de</strong>mo;<br />
public class Functie {<br />
...<br />
public static Tip metoda( argumente ) {<br />
...<br />
}<br />
}<br />
Crearea unui fisier <strong>de</strong>scriptor .tld<br />
<br />
equals<br />
<strong>de</strong>mo.Functie<br />
<br />
Tip metoda( tipuriArgumente )<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.16/4
Taguri <strong>de</strong> bază<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.17/4
Nucleul (c)<br />
Inclu<strong>de</strong>rea:<br />
<br />
Suport pentru limbajul <strong>de</strong> expresii<br />
catch, out, remove, set<br />
Controlul execu¸tiei<br />
if, choose-when-otherwise, forEach,<br />
forTokens<br />
Lucru cu URL-uri<br />
import, redirect, url<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.18/4
Taguri pentru expresii<br />
Setarea/Eliminarea <strong>de</strong> variabile<br />
<br />
...<br />
<br />
Inclu<strong>de</strong>rea unor mesaje pe fluxul <strong>de</strong> ie¸sire<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.19/4
Controlul execu¸tiei<br />
<br />
...<br />
<br />
<br />
... <br />
... <br />
... <br />
<br />
<br />
<br />
...<br />
<br />
Revenirea după excep¸tii<br />
Tagul catch prin<strong>de</strong> orice excep¸tie (Throwable) ce poate<br />
apărea în corpul său ¸si o expune (op¸tional) prin<br />
intermediul unei variabile.<br />
<br />
<br />
...<br />
<br />
<br />
Procesarea nu a putu fi realizata din urmatoarele motive:...<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.21/4
Lucrul cu URL-uri<br />
Inclu<strong>de</strong>rea unei resurse<br />
<br />
<br />
<br />
<br />
<br />
<br />
Redirectarea<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.22/4
Taguri pentru XML<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.23/4
Taguri pentru XML<br />
Inclu<strong>de</strong>rea:<br />
<br />
Taguri <strong>de</strong> bază<br />
out, parse, set<br />
Controlul execu¸tiei<br />
if, choose-when-otherwise, forEach<br />
Transformari<br />
transform<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.24/4
Obiecte implicite<br />
Folosite pentru a accesa informa¸tii ale aplica¸tiei Web din<br />
cadrul unei expresii XPath:<br />
$variabila<br />
$param<br />
$hea<strong>de</strong>r<br />
$cookie<br />
$initParam<br />
$pageScope, $requestScope, $sessionScope,<br />
$applicationScope<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.25/4
Exemplu <strong>de</strong> utilizare XML<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.26/4
Taguri pentru interna¸tionalizare<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.27/4
Interna¸tionalizarea ¸si localizarea<br />
Interna¸tionalizarea - pregătirea unei aplica¸tii astfel<br />
încât GUI să poată fi personalizată func¸tie <strong>de</strong><br />
regiunea cultural-geografică.<br />
Localizarea - adaptarea unei aplica¸tii<br />
interna¸tionalizate la o anumită regiune.<br />
Abordări<br />
Editarea <strong>de</strong> pagini JSP specifice, controlate <strong>de</strong> un<br />
servlet<br />
Folosirea fi¸sierelor <strong>de</strong> resurse<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.28/4
Taguri pentru interna¸tionalizare<br />
Inclu<strong>de</strong>rea:<br />
<br />
Localizare<br />
setLocale, requestEncoding<br />
Mesaje<br />
bundle, message, setBundle<br />
Formatare numere ¸si date<br />
formatNumber, formatDate, parseNumber,<br />
parseDate, setTimeZone, timeZone<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.29/4
Exemplu <strong>de</strong> folosire I18n<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.30/4
Crearea unei clase cu resurse<br />
package <strong>de</strong>mo;<br />
import java.util.*;<br />
public class Mesaje_ro extends ListResourceBundle {<br />
public Object[][] getContents() {<br />
return contents;<br />
}<br />
static final Object[][] contents = {<br />
{"hi", "Salut"},<br />
{"bye", "La reve<strong>de</strong>re"}<br />
};<br />
}<br />
Clasa Mesaje ro va fi plasată în<br />
/WEB-INF/classes/<strong>de</strong>mo.<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.31/4
Crearea unui fi¸sier cu resurse<br />
Mesaje_ro.properties<br />
# Intrarile fisierului vor fi <strong>de</strong> forma:<br />
# cheie = valoare<br />
hi = Salut<br />
bye = La reve<strong>de</strong>re<br />
welcome = Bine ai venit, {0} !<br />
<br />
<br />
<br />
Fi¸sierul va fi plasat <strong>de</strong> asemenea în<br />
/WEB-INF/classes/<strong>de</strong>mo.<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.32/4
Taguri SQL<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.33/4
Taguri SQL<br />
Inclu<strong>de</strong>rea:<br />
<br />
Conectarea la o bază <strong>de</strong> date<br />
setDataSource<br />
Efectuarea <strong>de</strong> secven¸te SQL<br />
query, update, transaction<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.34/4
Conectarea la o bază <strong>de</strong> date<br />
<br />
<br />
Exemplu:<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.35/4
Efectuarea <strong>de</strong> interogări SQL<br />
<br />
Fără parametri<br />
<br />
select nume from profesori<br />
<br />
Cu parametri<br />
<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.36/4
Efectuarea <strong>de</strong> actualizări SQL<br />
<br />
Fără parametri<br />
<br />
update sali set adresa=’la subsol’ where cod=’C112’<br />
<br />
Cu parametri<br />
<br />
update sali set capacitate=? where capacitate is null<br />
<br />
<br />
Modificari efectuate: <br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.37/4
Ob¸tinerea rezultatelor<br />
Rezultatul este ob¸tinut în variabila var.<br />
Domeniul <strong>de</strong> vizibiltate este dat <strong>de</strong> atributul scope.<br />
<br />
<br />
Pentru interogări var este <strong>de</strong> tip<br />
javax.servlet.jsp.jstl.sql.Result.<br />
Pentru actualizari var este un întreg reprezentând<br />
numărul liniilor afectate.<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.38/4
Interfa¸ta Result<br />
Atributul var al unui tag query va con¸tine după execu¸tie<br />
un obiect (bean) <strong>de</strong> tip Result.<br />
public interface Result {<br />
public String[] getColumnNames();<br />
public int getRowCount()<br />
public Map[] getRows();<br />
public Object[][] getRowsByIn<strong>de</strong>x();<br />
public boolean isLimitedByMaxRows();<br />
}<br />
Accesarea valorilor: se va face prin expresii <strong>de</strong> tipul<br />
variabila.proprietate:<br />
<br />
Numar <strong>de</strong> sali: <br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.39/4
Tranzac¸tii<br />
<br />
Tagul transaction este utilizat pentru a efectua o serie<br />
<strong>de</strong> succesivă <strong>de</strong> secven¸te SQL, în mod atomic.<br />
<br />
<br />
update evenimente set cod_profesor=’frasinaru’<br />
where cod=’Ctprog_MO1’<br />
<br />
<br />
update orar set cod_sala=’C308’ where cod_event=’Ctprog_MO1’<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.40/4
Exemplu <strong>de</strong> utilizare SQL<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.41/4
Func¸tii<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.42/4
Func¸tii<br />
Inclu<strong>de</strong>rea<br />
<br />
Dimensiunea unei colec¸tii<br />
length<br />
Lucrul cu ¸siruri<br />
toUpperCase, toLowerCase,<br />
substring, substringAfter, substringBefore, trim, replace,<br />
in<strong>de</strong>xOf, startsWith, endsWith, contains, containsIgnoreCase,<br />
split, join, escapeXml<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.43/4
Utilizarea func¸tiilor<br />
Func¸tiile sunt utilizate în interiorul expresiilor EL sub<br />
forma: fn:numeFunctie(parametri)<br />
Exemple:<br />
Aveti ${fn:length(cosCumparaturi.articole)} articole in cos.<br />
Tagul pentru crearea unu tabel este ${fn:escapeXml()}<br />
<br />
<strong>Tehnologii</strong> <strong>avansate</strong> <strong>de</strong> <strong>programare</strong> – p.44/4