web-dev-qa-db-fra.com

Concaténation de chaînes dans l'expression EL définie dans un attribut d'une balise facelets

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.


MODIFIER:

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?

39
Rajat Gupta

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}&lt;br/&gt;#{cc.attrs.count-1}" escape="false" rendered="#{cc.attrs.appreciatedByCurrentUser}" />
<h:outputText value="#{cc.attrs.count+1}&lt;br/&gt;#{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}&lt;br/&gt;#{cc.attrs.count-1}" />
<c:set var="notAppreciated" value="#{cc.attrs.count+1}&lt;br/&gt;#{cc.attrs.count}" />
<h:outputText value="#{cc.attrs.appreciatedByCurrentUser ? appreciated : notAppreciated}" escape="false" />
39
BalusC

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('&lt;br/&gt;').concat(cc.attrs.count-1)) :  (''.concat((cc.attrs.count+1)).concat('&lt;br/&gt;').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.

69
SlavaSt

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.

1
Foumpie