在数据表中,当特定条件适用时需要转换值(链接已启用):
<h:outputLink disabled="#{pluginSummary.linkEnabled}" target="_blank" value="http://www.nessus.org/plugins/index.php">
<c:choose>
<c:when test="#{not pluginSummary.isLinkEnabled()}" >
<h:outputText value="#{pluginSummary.pluginid}"/>
</c:when>
<c:otherwise>
<h:outputText value="#{texts[pluginSummary.pluginid]}"/>
</c:otherwise>
</c:choose>
<f:param name="id" value="#{pluginSummary.pluginid}"/>
<f:param name="view" value="single"/>
</h:outputLink>
但奇怪的是,只有第一个条件适用,而且从来没有翻译。为了调试我还添加了 <h:outputText value="#{pluginSummary.isLinkEnabled()}/>
在那里我看到了不同的真假条目,但我的文本从未被翻译。
有人知道 c:choose 在数据表中是否有效吗?我有什么选择?
最佳答案
JSTL 标记和 JSF 标记并不像您期望的编码那样同步运行。 JSTL 标记在 View 构建时运行,JSF 标记在 View 渲染时运行。您可以将其形象化如下:JSTL 首先从上到下运行,然后将生成的结果(没有任何 JSTL 标签!)交给 JSF,JSF 又从上到下运行,为 Web 浏览器生成 HTML。
我知道#{pluginSummary}
被定义为数据表的var
。在 JSTL 运行时,该变量不可用,因此此时它始终为 null
。
您需要使用 JSF 标签/属性。在这种特殊情况下,您希望改用 JSF rendered
属性。
<h:outputText value="#{pluginSummary.pluginid}" rendered="#{not pluginSummary.linkEnabled}" />
<h:outputText value="#{texts[pluginSummary.pluginid]}" rendered="#{pluginSummary.linkEnabled}"/>
(请注意,我还将方法调用更改为属性,因为这样更清楚,因为您不需要传递任何参数)
关于java - <c :choose> not working in datatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580538/