我写了这样的代码:
<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中的某些条件将值设置为某个变量?
答案 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>
块。