Объединение строк в выражении EL, определенном в атрибуте тега facelets - PullRequest
39 голосов
/ 12 сентября 2011

Мне нужно написать выражение EL для атрибута, который выглядит примерно так:

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

Теперь проблема в том, что это дает ошибку, поскольку строки не могут быть объединены, как я это делаю.Так как я могу исправить это?

Я использую JSF 2.0 с лицевыми панелями.


РЕДАКТИРОВАТЬ:

Я решаю проблему, используя следующий встроенный javascript

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

Можете ли вы подумать о любой проблеме с этим?

Ответы [ 3 ]

69 голосов
/ 10 ноября 2012

Можно объединить строки в EL, используя метод java.lang.String.concat(String). Таким образом, ваш код может выглядеть так:

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

Однако в этом конкретном случае я бы выбрал один из вариантов, предложенных г-ном BalusC, поскольку приведенный выше код выглядит не совсем элегантно. В некоторых случаях знание этой техники может быть полезным.

Я бы вряд ли порекомендовал использовать здесь в качестве обходного пути JavaScript.

39 голосов
/ 12 сентября 2011

Объединение строк в EL возможно только путем вставки в выражение. Оператор + в EL исключительно оператор сумм. Кроме того, < и > являются недопустимыми символами в атрибутах XML, поэтому вам необходимо их экранировать (и дать указание <h:outputText>, чтобы они не экранировались еще раз 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}" />

В качестве альтернативы, вы также можете использовать <c:set> для псевдонима выражения:

<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" />
1 голос
/ 12 сентября 2011

Это единственное, что я могу придумать.

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

Установка <br> в атрибуте значения всегда будет вызывать ошибки в JSF, поэтому вам придется использовать display:block.

...