web-dev-qa-db-fra.com

Définition et réutilisation d'une variable EL dans la page JSF

Est-il possible de définir une variable et de la réutiliser plus tard dans les expressions EL?

Par exemple :

<h:inputText 
   value="#{myBean.data.something.very.long}"
   rendered="#{myBean.data.something.very.long.showing}"
/>

Je pense à quelque chose comme:

<!-- 
     somehow define a variable here like : 
     myVar = #{myBean.data.something.very.long} 
-->
<h:inputText 
   value="#{myVar}"
   rendered="#{myVar.showing}"
/>

Des idées ? Je vous remercie !

56
bertie

Vous pouvez utiliser <c:set> pour cela:

<c:set var="myVar" value="#{myBean.data.something.very.long}" scope="request" />

Cette expression EL sera ensuite évaluée une fois et stockée dans la portée de la demande. Notez que cela ne fonctionne que lorsque la valeur est disponible pendant afficher le temps de génération . Si ce n'est pas le cas, vous devez supprimer l'attribut scope pour qu'il devienne un véritable "alias":

<c:set var="myVar" value="#{myBean.data.something.very.long}" />

Notez donc que cela ne met pas en cache la valeur évaluée dans la portée de la requête! Il sera réévalué à chaque fois.

N'utilisez pas [~ # ~] [~ # ~] <ui:param>. Lorsqu'il n'est pas utilisé pour passer un paramètre à template comme défini dans <ui:composition> ou <ui:decorate>, et donc en abusant essentiellement, alors le comportement n'est pas spécifié et en fait ce serait un bogue dans l'implémentation JSF utilisé s'il était possible. Cela ne devrait jamais être invoqué. Voir aussi JSTL dans JSF2 Facelets ... a du sens?

104
BalusC

Comme toute vue dans MVC, la page doit être aussi simple que possible. Si vous voulez un raccourci, placez-le dans le contrôleur (le @ManagedBean ou @Named haricot).

Manette:

@Named
public MyBean
{
    public Data getData()
    {
        return data;
    }

    public Foo getFooShortcut()
    {
        return data.getSomething().getVery().getLong();
    ]
}

Vue:

<h:inputText 
   value="#{myBean.fooShortcut}"
   rendered="#{myBean.fooShortcut.showing}"
/>
20
Matt Ball