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

Raj*_*pta 39 jsf facelets el jsf-2

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

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

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

我正在使用带有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>
Run Code Online (Sandbox Code Playgroud)

你能想到这个问题吗?

Sla*_*aSt 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" />
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我会选择BalusC先生提出的一个选项,因为上面的代码看起来并不优雅.但在某些情况下,了解这种技术可能会有用.

我几乎不建议在这里使用javascript作为解决方法.

  • 请注意,这需要EL 2.2. (11认同)

Bal*_*usC 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}" />
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用<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" />
Run Code Online (Sandbox Code Playgroud)

  • 对于纯粹的输出组件,这些组件实际上可以忽略不计.无论如何,我使用`ui:param`添加了一个替代方案.使用JavaScript方法,您只需将CPU时间从服务器移动到客户端. (2认同)