<c:选择>不在数据表中工作</c:选择>

时间:2011-04-07 11:48:21

标签: 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()}/>,在那里我看到了不同的true和false条目,但我的文本从未被翻译过。

有人知道,如果c:选择在数据表中工作吗?我有什么选择?

2 个答案:

答案 0 :(得分:2)

JSTL标记和JSF标记不会像编码所期望的那样同步运行。 JSTL标记在视图构建期间运行,JSF标记在视图渲染时运行。您可以按如下方式对其进行可视化: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}"/>

(请注意,我还将方法调用更改为属性,因为这样更清晰,因为您不需要传递任何参数)

答案 1 :(得分:0)

一个是jstl标签,其他是jsf组件。他们有不同的评估时间。

您应该使用组件的rendered属性来有条件地渲染它们。