SeamFramework.orgCommunity Documentation

Chapitre 34. JBoss EL

34.1. Les expressions paramétisées
34.1.1. Utilisation
34.1.2. Les limitations et les astuces
34.2. La projection

Seam fourni un extention pour le Langage d'Expression Unifiée (EL) standardisé appelé JBoss EL. JBoss EL fournit un nombre d'amélioration qui augmente l'expressivité et la puissance des expressions EL.

Le EL standard ne vous permet d'utiliser une méthode où l'utilisateur définir les paramètres — bien sur, les méthodes d'écoute de JSF (par exemple, un valueChangeListener) prends les paramètres fournis par JSF.

JBoss EL retire cette restriction. Par exemple:


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

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

Appelez juste cette méthode depuis Java, les paramètres sont entourés par des parenthèses, et séparés par des virgules:


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

Les paramètres hotel et user seront évalués comme des expressions de valeur et passés à la méthode du composant bookHotel().

Tout expression de valeur peut être utilisé comme un paramètre:


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

Il est important de bien comprends comme cette extension de EL fonctionne. Quand la page est rendu, le paramètres names est stocké (par exemple, hotel.id et user.username) et évalués (comme des expressions de valeur) quand la page est soumise. Vous ne pouvez passer des objets comme des paramètres!

Vous devez vous assurer que les paramètres sont disponibles pas seulement quand la page est rendue mais aussi quand elle est soumis. Si l'argument ne peut être résolu quand la page est soumise la méthode d'action sera appelée avec des arguments null!

Vous pouvez aussi passer des chaines de caractères en utilisant les apostrophes:


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

EL unifié supporte aussi les expressions de valeur, utilisés pour trouver un champs d'un bean arrière. Les expressions de valeurs utilise les conventions de nommage des JavaBeans et s'attends à une paire d'assesseurs. Souvent JSF attends une expression de valeur avec seulement une lecture (get) est nécéssaire (par exemple l'attribut rendered). Beaucoup d'objets, cependant, n'ont pas les asseceurs de propriétés dénommé de manière approprié ou nécéssite des paramètres.

JBoss EL retire cette restriction qui permet aux valeurs d'êre retrouvé en utilisant la syntaxe des méthodes. Par exemple:


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

Vous pouvez accéder à la taille de la collection de manière similaire:

#{searchResults.size()}

En égénral, toute expression de la forme #{obj.property} devrait être indentique à l'expression #{obj.getProperty()}.

Les paramètres sont aussi permis. L'exemple suivant appelle productsByColorMethod avec un argument chaine de caractère litérale:

#{controller.productsByColor('blue')}

Avec l'utilisation de JBoss EL, vous devriez garder les points suivants en tête:

JBoss EL supporte une syntaxe de projection limitée. Une expression de projection correspond une sous-expression au travers d'expression de multiples valeurs (list, set, etc...). Par exemple, l'expression:

#{company.departments}

doit retourner une liste de département. Si vous avez seulement besoin d'une liste de noms de département, votre seule option est d'itérer au travers de la liste pour retrouver les valeurs. JBoss EL permet cela avec une expression de projection:

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

La sous-expression est entouré par des accolades. Dans cet exemple, l'expression d.name est évalué pour chaque département, en utilisant d comme un alias sur l'objet département. Le résultat de cette expression est une liste de valeurs String.

Toute expression valide peut être utilisée comme une expression, ainsi il est parfaitement valide d'écrire ce qui suit, en supposant que vous avez une utilisation de la longeurs de tous les noms de département dans une entreprise:

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

Les projections peuvent être liée. L'expression suivante retourne les noms de familles de chaque employé dans chaque département:

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

Les projections liées peuvent être légèrement épineuse, toutefois. L'expression suivante devrait faire comme si elle retourne une liste de tous les employés dans tous les départements:

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

Cependant, elle retourne actuellement une liste contenant une liste des employés pour chaque département individuellement. Pour combiner les valeurs, il est nécéssaire d'utiliser une expression légèrement plus longue:

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

Il est important de noter que la syntaxe ne peut être analysé par les Facelets ou par JSP et ainsi ne peut être utilisé dans les fichiers xhtml ou JSP. Nous anticipons que la syntaxe de projection va changer dans les futures versions de JBoss EL.