java - <c :choose> not working in datatable

标签 java jsf jstl

在数据表中,当特定条件适用时需要转换值(链接已启用):

<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/

相关文章:

java - Jackson Custom Serializer 用于带注释的类

jsf - 怎么去掉周围???在 bundle 中找不到消息时

java - 在 JSTL 中添加不同的时间

jSTL 使用 foreach 索引访问第二个数组值

java - 返回 JComponent 的实际大小,如显示的那样

java - 为 Void 方法创建 Junit 测试

jsf - <f :viewParam> not working when using <ui:composition template>

java - JSF-<h :outputText> making some of words Bold

java - 使用枚举来检索页面 bean

java - 在Java中通过并行合并不等大小的列表来创建列表