考虑以下jstl选择:
<c:choose>
<c:when test="#{AuthMsgBean.rw['2'] ne null}">
Display Text
</c:when>
<c:otherwise>
<ph:outputText id="pan" value="Component pan could not be created." />
</c:otherwise>
</c:choose>
AuthMsgBean = Bean
rw = Map
'2' = Key
问题:
当我简单地显示#{AuthMsgBean.rw['2'] ne null}
值时,它显示fine (true),但是一旦我尝试将值解析为<c:when test=""/>
时,When标记的反应就好像测试始终为false。
如果我在测试(test="true"
)中设置为true,则显示文本。
是否<c:when>
标签在#{AuthMsgBean.rw['2'] ne null}
表达式之前求值?
如果是,是否有解决方法?
JSTL和JSF不像您期望的那样同步运行。在JSF视图构建期间,JSTL首先从上到下运行,以生成只有JSF标记的视图。在JSF视图呈现期间,是JSF再次从上到下运行以生成一堆HTML。
显然,轮到JSTL运行时,#{AuthMsgBean}
不存在于作用域中。当标签被放置在JSF迭代组件(如<h:dataTable>
)中时,就会发生这种情况。
无论如何,您都不想在这里使用JSTL。使用JSF的rendered
属性。
<h:panelGroup rendered="#{not empty AuthMsgBean.rw['2']}">
Display Text
</h:panelGroup>
<h:outputText id="pan" value="Component pan could not be created." rendered="#{empty AuthMsgBean.rw['2']}" />
参见:
- 有条件地显示JSF组件