JSF中f:param的条件渲染

时间:2014-09-15 10:56:48

标签: jsf jsf-2.2

我正在使用<h:outputLink>,如下所示。

<c:set var="cid" value="1"/>
<c:set var="sid" value="2"/>

<h:outputLink value="Test.jsf">
    <h:outputText value="Link"/>

    <f:param name="cid" value="#{cid}"/>
    <f:param name="sid" value="#{sid}"/>
</h:outputLink>

这只是一个例子。两个查询字符串参数都是动态的。所以,这里使用的<c:set>只是为了演示。

在任何时候,可能存在一个,两个或没有参数。在这种情况下,如果只有一个或不存在,则参数/ s被不必要地附加到不应发生的URL。防止将不必要的查询字符串参数附加到URL需要条件呈现<f:param>

JSTL <c:if>,如下所示

<c:if test="${not empty cid}">
    <f:param name="cid" value="#{cid}"/>
</c:if>

没用。

如何才能在<f:param>内有条件地呈现<h:outputLink>

2 个答案:

答案 0 :(得分:16)

<f:param>disable (not disabled!) attribute用于此目的。

<f:param name="cid" value="#{cid}" disable="#{empty cid}" />
<f:param name="sid" value="#{sid}" disable="#{empty sid}" />

请注意,这在早于2.1.15的Mojarra版本中存在错误,因为它们将实际的UIParameter属性标记为disble而不是disable。另请参阅issue 2312

对于<c:if>方法,只有在视图构建期间#{cid}#{sid}可用时才会有效。换句话说,如果它们仅在视图渲染时间期间可用,则它将失败,例如,当他们依赖于转发器组件的var时。另请参阅JSTL in JSF2 Facelets... makes sense?

另见:

答案 1 :(得分:2)

你不喜欢这种解决方案吗?

<f:param name="#{cid == null ? '' : 'cid'}" value="#{cid}"/>
<f:param name="#{sid == null ? '' : 'sid'}" value="#{sid}"/>