it-swarm.it

Concatenare stringhe all'interno dell'espressione EL definita in un attributo di un tag facelets

Ho bisogno di scrivere un'espressione EL per un attributo che va in questo modo:

#{cc.attrs.appreciatedByCurrentUser ? (cc.attrs.count +'<br/>'+ (cc.attrs.count-1)) : ((cc.attrs.count+1) +'<br/>'+ cc.attrs.count)}

Ora il problema è che questo dà un errore poiché le stringhe non possono essere concatenate, nel modo in cui lo sto facendo. Quindi, come posso correggere questo?

Sto usando JSF 2.0 con facelets.


EDIT:

Sto risolvendo il problema utilizzando il seguente javascript incorporato

            <script type="text/javascript">
                var count=#{cc.attrs.count};
                document.write(#{cc.attrs.appreciatedByCurrentUser} ? (count-1) +'<br/>'+count  : count+'<br/>'+ (count+1));
            </script>

Riesci a pensare a qualche problema con questo?

39
Rajat Gupta

La concatenazione di stringhe in EL è possibile solo inserendo semplicemente nell'espressione. Il + L'operatore è in EL esclusivamente un operatore di somma. Ulteriore, < e > sono caratteri non validi negli attributi XML, quindi devi evitarli (e istruire <h:outputText> per non sfuggirle ancora una volta di 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}" />

In alternativa, puoi anche utilizzare <c:set> per alias l'espressione:

<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

È possibile concatenare le stringhe in EL usando il metodo Java.lang.String.concat(String). Quindi il tuo codice potrebbe apparire come:

<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" />

In questo caso particolare, tuttavia, sceglierei una delle opzioni suggerite dall'onorevole BalusC perché il codice sopra non sembra abbastanza elegante. In alcuni casi, tuttavia, conoscere questa tecnica potrebbe essere utile.

Non consiglierei di usare javascript come soluzione alternativa qui.

69
SlavaSt

Questa è l'unica cosa che posso inventare.

<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>

Mettendo <br> in un attributo value genererà sempre errori in JSF, quindi dovrai utilizzare display:block.

1
Foumpie