在数据表中,当某个条件适用时(链接已启用),需要转换值:
<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:选择在数据表中工作吗?我有什么选择?
答案 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
属性来有条件地渲染它们。