在使用JSF,JSTL和Trinidad创建的页面上,我有一些带有许多属性的标签。
<tr:selectBooleanRadio
group="#{groupId}"
id="#{groupId}_#{Id}_radio"
selected="#{value.yesterday}"
text="#{msg.ib_selectTimeIntervalRadio_yesterday_label}"
shortDesc="#{ib:fn_coalesce(title,label)}"
simple="#{ib:fn_coalesce(simple,true)}"
styleClass="#{ib:fn_coalesce(styleClass,'selectTimeIntervalRadio')}"/>
我希望在<td>
元素中或直接,有条件地显示它。现在我这样做:
<c:when test="#{not horizontal}">
<tr>
<td>
<tr....>
</td>
</tr>
</c:when>
<c:when test="#{horizontal}">
<tr...>
</c:when>
这样我两次重复同一段代码,这显然很糟糕。我该怎么办?
恕我直言,为tr创建一个新的自定义组件是没用的...调用它会产生同样的问题。也许,我可以有条件地将另一个标签封装在另一个标签中吗?我可以吗?
另一种方式可能是这样:将tr ...标记放在某种变量中,并在构造此变量时使用相同的变量。也许,有可能吗?
您是否知道如何逃避此代码重复?
答案 0 :(得分:2)
如果您使用的是旧版JSP,请将其打包在<f:verbatim>
。
<f:verbatim rendered="#{not horizontal}"><tr><td></f:verbatim>
<tr:selectBooleanRadio ... />
<f:verbatim rendered="#{not horizontal}"></td></tr></f:verbatim>
如果您正在使用JSPX或Facelets,这会在上述构造中产生XML错误,这在XML中是非法的,请在<h:outputText escape="false">
中将其转义。
<h:outputText value="<tr><td>" escape="false" rendered="#{not horizontal}" />
<tr:selectBooleanRadio ... />
<h:outputText value="</td></tr>" escape="false" rendered="#{not horizontal}" />