SeamFramework.orgCommunity Documentation

Capitolo 34. JBoss EL

34.1. Espressioni parametrizzate
34.1.1. Utilizzo
34.1.2. Limitazioni e suggerimenti
34.2. Proiezione

Seam utilizza JBoss EL, il quale fornisce un'estensione allo standard Unified Expression Language (EL). JBoss EL apporta un numero di miglioramenti che incrementano l'espressività e la potenza delle espressioni EL.

Lo standard EL non consente di utilizzare un metodo con parametri definiti dall'utente — sicuramente metodi JSF listener (es. valueChangeListener) prende i parametri forniti da JSF.

JBoss EL rimuove questa restrizione. Per esempio:


<h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>
@Name("hotelBooking")

public class HotelBooking {
   
   public String bookHotel(Hotel hotel) {
      // Book the hotel
   }
}

Come nelle chiamate ai metodi in Java, i parametri sono racchiusi tra parentesi e separati da virgole:


<h:commandButton action="#{hotelBooking.bookHotel(hotel, user)}" value="Book Hotel"/>

I parametri hotel e user verranno valutati come espressioni di valore e passati al metodo bookHotel() del componente.

Qualsiasi valore d'espressione può essere usato come parametro:


<h:commandButton 
   action="#{hotelBooking.bookHotel(hotel.id, user.username)}" 
   value="Book Hotel"/>

E' importante capire bene come funziona quest'estensione a EL. Quando la pagine viene generata, i nomi dei parametri vengono memorizzati (per esempio hotel.id e user.username) e valutati (come espressioni di valore) quando la pagina viene inviata. Non si possono passare oggetti come parametri!

Devi assicurarti che i parametri siano disponibili non solo quando la pagina viene generata, ma anche quando ne viene fatto il submit. Se gli argomenti non possono essere risolti quando la pagina viene inviata, il metodo d'azione verrà chiamato con argomenti null!

Si può passare stringe letterali usando virgolette singole:


<h:commandLink action="#{printer.println('Hello world!')}" value="Hello"/>

EL unificato supporta anche le espressioni di valore, usate per associare un campo ad un bean. Le espressioni di valore utilizzano le convenzioni dei nomi di JavaBean e richiedono get e set. Spesso JSP si attende un'espressione di valore dove solo un recupero (get) è richiesto (es. l'attributo rendered). Molti oggetti, comunque, non hanno nominato in modo appropriato i metodi accessor alle proprietà o i parametri richiesti.

JBoss EL rimuove questa restrizione permettendo che i valori vengano recuperati usando la sintassi del metodo. Per esempio:


<h:outputText value="#{person.name}" rendered="#{person.name.length() 
> 5}" />

Si può accedere alla dimensione di una collezione in maniera analoga:

<h:outputText value="#{person.name}" rendered="#{person.name.length() 
> 5}" />

In generale qualsiasi espressione nella forma #{obj.property} è identica all'espressione #{obj.getProperty()}.

Sono consentiti anche i parametri. Il seguente esempio chiama productsByColorMethod con un argomento stringa letterale:

#{controller.productsByColor('blue')}

Nell'uso di JBoss EL dovresti tenere presente i seguenti punti:

JBoss EL supporta una limitata sintassi di proiezione. Un'espressione di proiezione mappa una sotto-espressione attraverso un'espressione a valori multipli (lista, set, ecc...). Per esempio, l'espressione:

#{company.departments}

potrebbe restituire una lista di dipartimenti. Se occorresse una lista di nomi di dipartimento, l'unica opzione è quella di iterare sulla lista per recuperare i valori. JBoss EL permette questo con l'espressione di proiezione:

#{company.departments.{d|d.name}}

La sotto-espressione è racchiusa da parentesi. In quest'esempio l'espressione d.name viene valutata per ogni dipartimento, usando d come alias per l'oggetto dipartimento. Il risultato di quest'espressione sarà una lista di valori Stringa.

Qualsiasi espressione valida può essere usata in un'espressione, e quindi sarebbe perfettamente valido scrivere la seguente, assumendo che venga usata per le lunghezze di tutti i nomi di dipartimento in un'azienda:

#{company.departments.{d|d.size()}}

Le proiezioni possono essere annidate. La seguente espressione ritorna gli ultimi nomi di ciascun impiegato in ogni dipartimento:

#{company.departments.{d|d.employees.{emp|emp.lastName}}}

Le proiezioni annidate possono comunque rivelarsi un pò difficoltose. La seguente espressione sembra ritornare una lista di tutti gli impiegati in tutti i dipartimenti:

#{company.departments.{d|d.employees}}

Comunque, restituisce una lista contenente una lista di impiegati per ogni singolo dipartimento. Per combinare questi valori è necessario usare un'espressione leggermente più lunga:

#{company.departments.{d|d.employees.{e|e}}}

E' importante notare che questa sintassi non può essere analizzata da Facelets o JSP e quindi non può essere usata in file xhtml o jsp. Anticipiamo che la sintassi di proiezione cambierà nelle future versioni di JBoss EL.