Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Utilizzo del motore EL per accedere alle proprietà di una maglietta
EL:$ {shirt.size} Tuttavia, questo non è consentito. Quando il motore EL vede questa sintassi, cerca una proprietà sulla maglietta, non un campo. Ma cos'è una proprietà? Considera una Shirt modificata in cui la dimensione è un campo privato adeguatamente incapsulato con metodi di accesso e di modifica JavaBean standard getSize e setSize. Ora l'espressione diventa una shirt.size scorciatoia per chiamare shirt.getSize(). Questo può funzionare per qualsiasi campo di qualsiasi tipo. Finché abbia un metodo di accesso JavaBean standard, è possibile accedervi in questo modo. Se Shirt avesse un campo denominato styleCategory con una funzione di accesso getStyleCategory, sarebbe possibile accedervi con shirt.styleCategory. Per i campi booleani (e solo i campi booleani) la funzione di accesso può iniziare con get o is. Pertanto, per un campo denominato scaduto con una funzione di accesso getExpired o isExpired, è
possibile accedere al campo conshirt.expired
. Questa non è l'unica tecnica che è possibile utilizzare per accedere alle proprietà all'interno di un JavaBean. Nello spirito dei linguaggi ECMAScript e XPath, è anche possibile accedere alle proprietà utilizzando l'operatore []
. Le seguenti espressioni accedono anche alle proprietà size
, styleCategory
e expired
utilizzando rispettivamente i metodi getSize
, getStyleCategory
e getExpired
o isExpired
.
${shirt["size"]}
${shirt["styleCategory"]}
${shirt["expired"]}
L'operatore []
fa la stessa cosa dell'operatore .
, però può essere utilizzato per accedere ad elementi di una lista o di un array specificando un indice. Può essere usato sia con doppi apici che senza.
Nelle versioni precedenti di EL, era possibile accedere solo alle proprietà JavaBeans. Non è possibile chiamare metodi sugli oggetti. Tuttavia, EL 2.1 haaggiunto la possibilità di chiamare metodi oggetto nei JSP. Quindi, potresti ottenere la taglia di una maglietta con ${shirt.getSize()}
invece di ${shirt.size}
, ma perché dovresti? Quest'ultimo è sicuramente più facile. L'invocazione del metodo è per lo più utile quando un metodo richiede anche un input.
Supponiamo di avere una classe immutabile ComplexNumber che rappresenta numeri complessi matematici. Quella classe avrebbe indubbiamente un metodo plus che ti consente di aggiungere un altro numero ad essa. Puoi chiamare il metodo plus e passare un argomento, e il ComplexNumber risultante sarebbe il valore dell'espressione: ${complex.plus(12)}
.
In questo esempio, il metodo toString viene chiamato implicitamente sul ComplexNumber risultante in modo che venga eseguito il rendering della rappresentazione di stringa di ComplexNumber. Tuttavia, supponi di desiderare che la i nella rappresentazione di stringa fosse formattato in corsivo in modocheassomigliasse a una corretta rappresentazione matematica di un numero complesso. Puoi avere un metodo toHtmlString sulla classe ComplexNumber per ottenere ciò. Puoi quindi renderlo in questo modo: ${complex.plus(12).toHtmlString()} Si tratta di chiamate di metodi concatenate identiche al modo in cui eseguireste questa operazione nel codice Java standard.
Funzioni dell'EL
In EL, una funzione è uno speciale strumento mappato a un metodo statico su una classe. Come i tag XML conformi allo schema, le funzioni vengono mappate in uno spazio di nomi. La sintassi generale di una chiamata di funzione è la seguente, dove [ns] è lo spazio dei nomi, [fn] è il nome della funzione e da [a1] a [an] sono argomenti: ${[ns]:[fn]([a1[,a2[,a3[,...]]]])}
Le funzioni sono definite all'interno dei tag Library Descriptors (TLD), il che può sembrare strano perché le funzioni non sono tag.
Esiste già un insieme di funzioni definite nelJSTL che soddisfano molte delle esigenze degli sviluppatori all'interno dei JSP oggi. Tutte le funzioni gestiscono le stringhe in qualche modo: tagliare, cercare, unire, dividere, eseguire l'escape e altro ancora. Per convenzione, la libreria di funzioni JSTL ha uno spazio di nomi fn; tuttavia, puoi farlo come preferisci nella direttiva taglib. Qui ci sono alcune delle funzioni EL JSTL più comuni e cosa fanno.
${fn:contains(String, String)}
- Questa funzione verifica se la prima stringa contiene una o più istanze della seconda stringa e restituisce true in caso affermativo.
${fn:escapeXml(String)}
- Evita caratteri che potrebbero essere interpretati come XML markup language. Questo è uno strumento particolarmente importante nella prevenzione di attacchi di scripting cross-site (XSS).
${fn:join(String[], String)}
- Questa funzione unisce un array di stringhe utilizzando la stringa specificata come delimitatore. Ad esempio, ciò potrebbe essere utile perSeparare con virgole un array di indirizzi di posta elettronica in un'unica stringa da visualizzare nella pagina.
${fn:length(Object)} - Se l'argomento è una stringa, questa funzione richiama e restituisce il risultato della chiamata del metodo length sulla stringa specificata. Se è una raccolta, una mappa o un array, restituisce le dimensioni di tale collezione, Map o array. Non sono supportati altri tipi. Questa è forse la funzione più utile in JSTL.
${fn:toLowerCase(String)} e ${fn:toUpperCase(String)} - Puoi usare queste funzioni per cambiare una stringa in tutto minuscolo o in tutto maiuscolo.
${fn:trim(String)} - Questa funzione taglia tutto lo spazio bianco da entrambe le estremità della stringa specificata.
Campo statico e accesso al metodo Una novità dell'Expression Language 3.0, è che puoi accedere ai campi statici pubblici e ai metodi statici pubblici all'interno di qualsiasi classe nel percorso classi della
tua JSP. Si accede a campi e metodi statici nello stesso modo in cui si accede a Java, utilizzando il nome completo della classe e il nome del campo o del metodo separati dall'operatore punto. Ad esempio, puoi accedere alla costante MAX_VALUE sulla classe Integer con la seguente espressione:${java.lang.Integer.MAX_VALUE}
. Il nome della classe deve essere completamente qualificato a meno che la classe non venga importata utilizzando la direttiva della pagina JSP. Ricorda che in JSP, come Java, tutte le classi in java.lang vengono importate implicitamente per te. Per questo motivo, l'espressione precedente potrebbe essere scritta in questo modo: ${Integer.MAX_VALUE}
. Con questo è possibile accedere a campi o metodi statici su qualsiasi classe a cui ha accesso la JSP. È importante notare che puoi leggere solo il valore di questi campi. Non puoi scriverci dentro. (Ovviamente, se un campo è anche finale, normalmente non ci si potrebbe scrivere comunque). Chiamare un metodostatico su una classe è altrettanto facile. Supponiamo di voler invertire l'ordine dei bit in un numero e vedere come è cambiato il valore del numero:
${java.lang.Integer.reverse(42)}
${Integer.reverse(24)}
Questa espressione chiama il metodo statico reverse sulla classe Integer e passa il numero 42 come argomento. Oltre a chiamare metodi statici, puoi anche richiamare un costruttore su una classe, che restituisce un'istanza di quella classe con cui è possibile accedere alle proprietà, richiamare metodi o semplicemente forzare una stringa per l'output.
${com.wrox.User()}
${com.wrox.User('First', 'Last').firstName}
Sebbene l'accesso al metodo statico possa sostituire completamente il comportamento delle funzioni EL e delle librerie di funzioni, ciò non significa che le librerie di funzioni non siano necessarie. La precedente chiamata del metodo statico a Integer.reverse potrebbe essere conveniente, ma con una libreria
di funzioni int teorica mappata ai metodi statici di Integer, la seguente espressione è ancora più conveniente:${int:reverse(42)}
Potrebbe non sembrare molto più breve, ma immagina un nome di classe molto più lungo e dovresti capire rapidamente perché le librerie di funzioni sono ancora di grande utilità. Una delle aree in cui l'accesso al campo statico potrebbe essere più utile è con le enumerazioni, che imparerai in seguito.
Enumerazioni
È probabile che tu sia stato esposto alle enumerazioni Java a un certo punto e se usi Java da un po', probabilmente hai familiarità con quanto possono essere utili e potenti. Tradizionalmente, le enumerazioni in EL sono state forzate da e verso stringhe quando necessario. Ad esempio, supponiamo che il tuo JSP avesse una variabile in ambito denominata dayOfWeek e rappresentasse uno dei valori dell'enumerazione java.time.DayOfWeek nella nuova API Java 8 Date and Time. Puoiverificare se dayOfWeek è sabato con la seguente espressione booleana:
```html
Verificare se dayOfWeek è sabato con la seguente espressione booleana:
${dayOfWeek == 'SATURDAY'}
La variabile dayOfWeek qui viene convertita in una stringa e confrontata con "SATURDAY". Questo è diverso da Java, dove questa conversione non avverrebbe mai automaticamente. Sebbene sia utile, non è certamente sicuro per i tipi. Se si scrive un errore di sabato (o se il sabato cessa di essere un giorno della settimana) il tuo IDE probabilmente non lo catturerebbe e se compili JSP durante una build di integrazione continua per verificare la presenza di errori in fase di compilazione JSP, non lo rileverebbe neanche.
Tuttavia, a partire da EL 3.0 è possibile utilizzare la sintassi di accesso ai campi statici per ottenere un riferimento costante enum indipendente dai tipi. Dopo tutto, le costanti enum sono solo campi finali statici pubblici dei loro tipi enum:
${dayOfWeek == java.time.DayOfWeek.SATURDAY}
E, se importi DayOfWeek nel tuo JSP,
```l'espressione è quasi semplice quanto la stringa-come-enum espressione (e più simile a ciò che vedresti nel codice Java): ${dayOfWeek == DayOfWeek.SATURDAY}
Queste ultime due tecniche sono indipendenti dai tipi e saranno convalidate dal tuo IDE e in fase di compilazione. Qualunque cosa tu usi dipende da te, ma ti consigliamo un modo sicuro per i tipi.
Utilizzo di variabili di scope nelle espressioni
Il senso delle variabili di scope e il modo in cui le variabili vengono risolte le rende particolarmente utile e potente. Ricordare dal Capitolo 4 che le JSP hanno una serie di variabili implicite (richiesta, risposta, sessione, uscita, applicazione, configurazione, pageContext, pagina ed eccezione) che è possibile utilizzare per ottenere informazioni dalla richiesta, dalla sessione e dall'ambiente di esecuzione e modificare la risposta. EL ha un insieme di oggetti impliciti che possono essere utilizzati per ottenere informazioni simili.