我需要为属性写一个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>
你能想到这个问题吗?
答案 0 :(得分:69)
可以使用java.lang.String.concat(String)
方法在EL中连接字符串。因此,您的代码可能如下所示:
<h:outputText value="#{cc.attrs.appreciatedByCurrentUser ? (''.concat(cc.attrs.count).concat('<br/>').concat(cc.attrs.count-1)) : (''.concat((cc.attrs.count+1)).concat('<br/>').concat(cc.attrs.count))}" escape="false" />
在这种特殊情况下,我会选择BalusC先生建议的其中一个选项,因为上面的代码看起来不太优雅。但在某些情况下,了解这种技术可能会有用。
我几乎不建议在这里使用javascript作为解决方法。
答案 1 :(得分:39)
EL中的字符串连接只能通过在表达式中内联来实现。 +
运算符在EL中仅为和运算符。此外,<
和>
在XML属性中是无效字符,因此您必须将它们转义(并指示<h:outputText>
不再通过escape="false"
转义它们):
<h:outputText value="#{cc.attrs.count}<br/>#{cc.attrs.count-1}" escape="false" rendered="#{cc.attrs.appreciatedByCurrentUser}" />
<h:outputText value="#{cc.attrs.count+1}<br/>#{cc.attrs.count}" escape="false" rendered="#{!cc.attrs.appreciatedByCurrentUser}" />
或者,您也可以使用<c:set>
为表达式添加别名:
<c:set var="appreciated" value="#{cc.attrs.count}<br/>#{cc.attrs.count-1}" />
<c:set var="notAppreciated" value="#{cc.attrs.count+1}<br/>#{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
。