JSF 中 f:param 的条件渲染

Posted

技术标签:

【中文标题】JSF 中 f:param 的条件渲染【英文标题】:Conditional rendering of f:param in JSF 【发布时间】:2014-11-08 21:17:46 【问题描述】:

我正在使用<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>

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

在任何时候,都可能存在任何一个、两个或一个参数。如果只有一个或一个都不存在,则参数/s 会不必要地附加到不应发生的 URL 上。防止将不必要的查询字符串参数附加到 URL 需要有条件呈现 &lt;f:param&gt;

JSTL &lt;c:if&gt; 如下

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

没用。

如何在&lt;h:outputLink&gt; 内有条件地渲染&lt;f:param&gt;

【问题讨论】:

【参考方案1】:

&lt;f:param&gt; 有一个 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。

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

另见:

f:param tag attribute 'disable' is not work

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于JSF 中 f:param 的条件渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何不在 JSF 中渲染整个块?

防止 JSF <f:param> 中的 XSS 反射

根据用户角色渲染 JSF 组件

有条件地渲染 tr,使用 ui:repeat 构建表

JSF2 - 为啥渲染响应不重新渲染组件设置?

具有渲染属性的jsf组件验证失败