请考虑以下 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 =地图
'2'=键
问题:
当我只显示#{AuthMsgBean.rw['2'] ne null}
值时,它显示正常(true),但是一旦我尝试将值解析为<c:when test=""/>
,则标记重新执行,就像测试始终为false一样。
如果我在测试中设置了真(test="true"
),则会显示“显示文本”。
可能是<c:when>
表达式之前评估了#{AuthMsgBean.rw['2'] ne null}
标记吗?
如果有,是否有解决方法?
答案 0 :(得分:11)
JSTL和JSF不会像编码时那样同步运行。在JSF视图构建时,它的JSTL首先从上到下运行,以生成仅包含JSF标记的视图。在JSF视图渲染时,它的JSF从上到下再次运行,产生一堆HTML。
显然,当JSTL轮到运行时,#{AuthMsgBean}
不在范围内。当标记放在JSF迭代组件(如<h:dataTable>
。
无论如何,你不想在这里使用JSTL。利用JSF rendered
attribtue。
<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']}" />