1

我写了这样的代码:

<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 中的某些条件为某个变量设置值?

4

1 回答 1

4

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

因此,<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>在模型中使用 a 来维护星期几与其索引之间的映射,这样您就不再需要整个丑陋的<c:choose>块了。

也可以看看:

于 2013-06-11T13:07:56.713 回答