<c:choose>未根据<ui:repeat var =“”> </ui:repeat> </c:choose>设置预期值

时间:2013-06-11 13:02:08

标签: jsf-2 jstl

我写了这样的代码:

<ui:repeat var="fstDayWk" value="#{calendarBean.date}">
        <c:choose>
            <c:when test="#{fstDayWk == 'Sun'}">
                <c:set var="fstDayWk" value="7"/>
            </c:when>

            <c:when test="#{fstDayWk =='Mon'}">
                <c:set var="fstDayWk" value="1" />
            </c:when>

            <c:when test="#{fstDayWk =='Tue'}">
                <c:set var="fstDayWk" value="2" />
            </c:when>

            <c:when test="#{fstDayWk =='Wed'}">
                <c:set var="fstDayWk" value="3" />
            </c:when>

            <c:when test="#{fstDayWk =='Thu'}">
                <c:set var="fstDayWk" value="4" />
            </c:when>

            <c:when test="#{fstDayWk =='Fri'}">
                <c:set var="fstDayWk" value="5" />
            </c:when>

            <c:when test="#{fstDayWk =='Sat'}">
                <c:set var="fstDayWk" value="6"/>
            </c:when>
            <c:otherwise>
                <c:set var="fstDayWk" value="1" />
            </c:otherwise>
        </c:choose>
</ui:repeat>

但是fstDayWk的值赋值始终为1.为什么会这样?我如何根据JSF中的某些条件将值设置为某个变量?

1 个答案:

答案 0 :(得分:4)

JSTL标记在视图构建期间运行,当JSF组件树即将基于XHTML文件中的JSF标记构建/构建时。当构建的JSF组件树即将生成HTML代码时,<ui:repeat>等JSF组件依次在视图渲染时运行。

因此,<c:choose><ui:repeat>并不像您对编码所期望的那样同步运行。实际上,它是第一个在视图构建时运行的<c:choose>,然后它是在视图渲染时运行的<ui:repeat>。在<c:choose>运行的那一刻,应该由#{fstDayWk}设置的<ui:repeat>在EL范围内的任何位置都不可用,因此<c:choose>总是在<c:otherwise>条件。

如果您使用<c:forEach>而非<ui:repeat>,则会有效。但是,更好的方法是在模型中使用Map<String, Integer>来维护星期几与其索引之间的映射,这样您就不再需要整个丑陋的<c:choose>块。

另见: