JSTL c:选择c:不在JSF页面中工作

时间:2011-09-15 21:53:53

标签: java jsf jstl

请考虑以下 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}标记吗?

如果有,是否有解决方法?

1 个答案:

答案 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']}" />

另见: