|
Overview Prima di analizzare le caratteristiche dei singoli tag, è bene esaminare il nuovo linguaggio introdotto da JSTL in quanto utilizzato, per la valutazione runtime di espressioni, da tutte le sue librerie di tag: EL, un linguaggio che promette di sempificare l'accesso ai dati di applicazione poichè non utilizza scriptlets e/o expressions jsp. Inoltre probabilmente il supporto a EL sarà standard nella prossima versione finale 2.0 delle specifiche JSP. Se così dovesse essere, si potrà usarlo al posto delle expression jsp non soltanto per passare valori a runtime agli attributi dei custom tag JSTL, ma di tutte le action jsp, e persino nel testo template. Una nota preliminare sull'utilizzo del termine attributo: da qui in poi esso è utilizzato, a seconda del contesto, per indicare sia un attributo di un tag, che un oggetto memorizzato in uno scope jsp (page,request, session, application). Finora per valorizzare a runtime un attributo di un tag col valore, es., di un bean, si è utilizzato una expression jsp: <x:aTag att="<%= pageContext.getAttribute("aName") %>"> Adesso EL permette di accedere ad un oggetto con una sintassi semplificata: <x:atag att="${aName}"> Come visto per prima cosa una espressione EL deve essere dunque racchiusa dai delimitatori ${ e } . Ogni valore che non comincia con ${ è trattato come literal e parsato come tale. <c:if test="true" /> EL utilizza poi una sintassi simile a quella di JavaScript, nel senso che accede a strutture dati - sia rappresentandole come proprietà di un oggetto o di uno scope - come si vedra in seguito- (con l'operatore .)
- che come elementi di un vettore associativo la cui chiave è il name della property stessa (con l'operatore ["name"] ),
- sia infine come elementi di una lista, specificando con l'operatore [] l'index dell'elemento richiesto.
Così le proprietà di JavaBeans e le entry di tipo java.util.Map possono essere accedute in questo modo: ${myObj.myProperty} ${myObj["myProperty"]} ${myObj[varCheContieneIlNome]} Le prime due accedono alla property myProperty dell'oggetto myObj, mentre la terza accede ad una property dello stesso oggetto, il cui nome però è conservato in una variabile, e valutato perciò a runtime. Nel caso in cui l'oggetto sia invece del tipo java.util.List, o un array, si potrà accedere ai suoi elementi interni soltanto col secondo operatore ([]), specificando l'index (int) dell'elemento stesso: ${myList[2]}$ ${myList[aVar + 1]}$ cart memorizzato in session scope: <c:if test="${sessionScope.cart.numberOfItems > 0}"> </c:if> Cosa può fare EL Entro i suoi delimitatori, EL può gestire espressioni che contengono come operandi puntatori ad oggetti -custom ed impliciti- e/o letterali, e gli operatori più comuni: Per esempio : <c:if test="${bean1.a < 3}" /> Letterali invece contenuti in una espressione EL e che devono essere ritornati come String devono essere messi a loro volta entro delimitatori di stringa, che per EL sono sia singoli che doppi apici <mytags:example attr1="an expression is ${'${'}true}" /> Accesso ad attributi custom di page, request, session, application Qualsiasi ogetti memorizzato in uno scope JSP valido (page, request, session, or application) può essere acceduto da EL, compresi gli oggetti impliciti, come vedremo. Per esempio si può accedere ad una proprietà firstName di un bean customer che è memorizzato come attributo di request, con questa espressione: ${customer.firstName} Gli attributi sono acceduti per nome, con uno scope opzionale, nel senso che EL valuta un nome di variabile cercandolo come attributo di PageContext, ossia eseguendo PageContext.findAttribute(String) . Il che equivale ad una rucerca su tutti gli scope jsp, da page fino ad application Se non trova nulla ritorna null. Accesso ad oggetti impliciti jsp JSTL ridefinisce un set di oggetti impliciti, la maggior parte dei quali trattati come java.util.Map ossia Vettori associativi: - pageContext - l'oggetto PageContext
- pageScope - per l'accesso agli attributi in page scope
- requestScope - per l'accesso agli attributi memorizzati in request scope
- sessionScope - per l'accesso agli attributi memorizzati in session scope
- applicationScope - per l'accesso agli attributi memorizzati in application scope
- param - per l'accesso al singolo parametro di request (equivale a ServletRequest.getParameter(String) )
- paramValues - per l'accesso a tutti i parametri di request (equivale a ServletRequest.getParameterValues(String))
- header - per l'accesso al singolo header di request (equivale a ServletRequest.getheader(String) )
- headerValues - per l'accesso a tutti gli header di request (equivale a ServletRequest.getHeaders(String))
- cookie - per l'accesso al singolo Cookie (equivale a HttpServletRequest.getCookie(String) )
- initParam - per l'accesso al singolo parametro di inizializzazione della jsp (equivale a ServletRequest.getInitParameter(String) )
Esempi ${pageContext.request.contextPath} ritorna il contextPath (ottentuo da HttpServletRequest ) ${sessionScope.cart.numberOfItems} ritorna il valore della property numberOfItems dell'attributo denominato cart, memorizzato in session ${param["mycom.productId"]} ritorna il valore del parametro di request mycom.productId ${header['User-Agent']} ritorna il valore dell'header di request "User-Agent" Grazie a tali oggetti impliciti, per esempio, nel caso esempio di ${customer.firstName } si può restringere l'ambito di ricerca specificando subito lo scope richiesto: in pratica se esiste un attributo customer in session, le prime due espressioni seguenti ritorneranno lo stesso oggetto mentre la terza ritornerà null: ${customer} ${sessionScope.customer} ${requestScope.customer} Letterali EL supporta i seguenti tipi di letterali: String - Racchiuso in singoli o doppi apici . Apici che devono essere trattati come tali e non come delimitatori devono essere preceduti dal carattere di escape ( \' in a string enclosed with single quotes; \" in a string enclosed with double quotes).
Integer Floating Point - Il separatore decimale è il punto (.) . Può essere specificato un esponente con e o E, seguita da un int
Boolean Null Operatori Sono disponibili i seguenti operatori: Aritmetici: + , - , * , / e div , % e mod , - Logici: and , && , or , || , not , ! relazionali: == , eq , != , ne , < , lt , > , gt , <= , ge , >= , le . empty: operatore prefisso che permette di verificare se un puntatore è null o p. es. un oggetto è vuoto Da notare lo speciale operatore prefisso empty (es empty A ritorna true se il puntatore A è null o contiene una stringa "" oppure se è una Lista vuota) Ciò che non è presente in EL sono le assegnazioni (=), e gli operatori condizionali if/else , o while . Per tali funzionalità ci sono le action, poichè EL non è considerato un vero linguaggio di programmazione ma soltanto un linguaggio di accesso ai dati
|