J'ai besoin d'écrire une expression EL pour un attribut qui ressemble à ceci:
#{cc.attrs.appreciatedByCurrentUser ? (cc.attrs.count +'<br/>'+ (cc.attrs.count-1)) : ((cc.attrs.count+1) +'<br/>'+ cc.attrs.count)}
Maintenant, le problème est que cela donne une erreur car les chaînes ne peuvent pas être concaténées, comme je le fais. Alors, comment puis-je rectifier cela?
J'utilise JSF 2.0 avec des facettes.
Je résous le problème en utilisant le javascript en ligne suivant
<script type="text/javascript">
var count=#{cc.attrs.count};
document.write(#{cc.attrs.appreciatedByCurrentUser} ? (count-1) +'<br/>'+count : count+'<br/>'+ (count+1));
</script>
Pouvez-vous penser à un problème avec cela?
La concaténation de chaînes dans EL n'est possible qu'en insérant simplement l'expression. Le +
L'opérateur est dans EL exclusivement un opérateur somme. Plus loin, <
et >
sont des caractères non valides dans les attributs XML, vous devez donc les échapper (et demander à <h:outputText>
pour ne plus y échapper par escape="false"
):
<h:outputText value="#{cc.attrs.count}<br/>#{cc.attrs.count-1}" escape="false" rendered="#{cc.attrs.appreciatedByCurrentUser}" />
<h:outputText value="#{cc.attrs.count+1}<br/>#{cc.attrs.count}" escape="false" rendered="#{!cc.attrs.appreciatedByCurrentUser}" />
Vous pouvez également utiliser <c:set>
pour alias l'expression:
<c:set var="appreciated" value="#{cc.attrs.count}<br/>#{cc.attrs.count-1}" />
<c:set var="notAppreciated" value="#{cc.attrs.count+1}<br/>#{cc.attrs.count}" />
<h:outputText value="#{cc.attrs.appreciatedByCurrentUser ? appreciated : notAppreciated}" escape="false" />
Il est possible de concaténer des chaînes dans EL en utilisant la méthode Java.lang.String.concat(String)
. Ainsi, votre code pourrait ressembler à:
<h:outputText value="#{cc.attrs.appreciatedByCurrentUser ? (''.concat(cc.attrs.count).concat('<br/>').concat(cc.attrs.count-1)) : (''.concat((cc.attrs.count+1)).concat('<br/>').concat(cc.attrs.count))}" escape="false" />
Dans ce cas particulier, je choisirais toutefois l'une des options suggérées par M. BalusC car le code ci-dessus n'a pas l'air assez élégant. Dans certains cas, la connaissance de cette technique pourrait cependant être utile.
Je recommanderais à peine d'utiliser javascript comme solution de contournement ici.
C'est la seule chose que je puisse trouver.
<h:panelGroup rendered="#{cc.attrs.appreciatedByCurrentUser}">
<h:outputText value="#{(cc.attrs.count)}" style="display:block;" />
<h:outputText value="#{(cc.attrs.count-1)}" />
</h:panelGroup>
<h:panelGroup rendered="#{not cc.attrs.appreciatedByCurrentUser}">
<h:outputText value="#{(cc.attrs.count+1)}" style="display:block;" />
<h:outputText value="#{(cc.attrs.count)}" />
</h:panelGroup>
En mettant <br>
dans un attribut value générera toujours des erreurs dans JSF, vous devrez donc utiliser display:block
.