web-dev-qa-db-ja.com

faceletsタグの属性で定義されたEL式内の文字列の連結

次のような属性のEL式を記述する必要があります。

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

問題は、文字列を連結できないためにエラーが発生することです。これは私が行っている方法です。では、どうすればこれを修正できますか?

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

これについて何か問題がありますか?

39
Rajat Gupta

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

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氏が提案したオプションの1つを使用します。ただし、この手法を知っていると便利な場合もあります。

ここで回避策としてJavaScriptを使用することはほとんどお勧めしません。

69
SlavaSt

これは私が思いつくことができる唯一のものです。

<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>をvalue属性に設定すると、JSFで常にエラーがスローされるため、display:blockを使用する必要があります。

1
Foumpie