webentwicklung-frage-antwort-db.com.de

Verketten von Zeichenfolgen innerhalb eines EL-Ausdrucks, der in einem Attribut eines Facelets-Tags definiert ist

Ich muss einen EL-Ausdruck für ein Attribut schreiben, das ungefähr so ​​aussieht:

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

Das Problem ist nun, dass dies einen Fehler verursacht, da Strings nicht so verkettet werden können, wie ich es tue. Wie kann ich das korrigieren?

Ich verwende JSF 2.0 mit Facelets.


EDIT:

Ich löse das Problem mit dem folgenden Inline-Javascript

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

Können Sie sich ein Problem damit vorstellen?

39
Rajat Gupta

Die Verkettung von Zeichenfolgen in EL ist nur durch einfaches Einfügen in den Ausdruck möglich. Der Operator + Ist in EL ausschließlich ein Summenoperator. Außerdem sind < Und > Ungültige Zeichen in XML-Attributen. Sie müssen sie also entziehen (und <h:outputText> Anweisen, sie nicht noch einmal mit escape="false" Zu entziehen. ):

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

Alternativ können Sie auch <c:set> Als Alias ​​für den Ausdruck verwenden:

<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

Es ist möglich, Strings in EL mit der Java.lang.String.concat(String) -Methode zu verketten. So könnte Ihr Code aussehen:

<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 diesem speziellen Fall würde ich jedoch eine der von Herrn BalusC vorgeschlagenen Optionen wählen, da der obige Code nicht sehr elegant aussieht. In einigen Fällen kann es jedoch hilfreich sein, diese Technik zu kennen.

Ich würde kaum empfehlen, Javascript als Workaround zu verwenden.

69
SlavaSt

Dies ist das einzige, was ich mir einfallen lassen kann.

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

Putting <br> in einem value-Attribut wirft immer Fehler in JSF auf, daher müssen Sie display:block.

1
Foumpie