连接facelets标记的属性中定义的EL表达式中的字符串

时间:2011-09-12 09:59:56

标签: jsf jsf-2 facelets el

我需要为属性写一个EL表达式,如下所示:

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

现在的问题是,这会产生错误,因为字符串无法连接,就像我这样做。那我怎么能纠正这个呢?

我正在使用带有facelets的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 个答案:

答案 0 :(得分:69)

可以使用java.lang.String.concat(String)方法在EL中连接字符串。因此,您的代码可能如下所示:

<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作为解决方法。

答案 1 :(得分:39)

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

答案 2 :(得分:1)

这是我唯一能想到的。

<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