我在JSF 2应用程序中使用selectOneMenu,允许用户选择一个月中的某一天。出于某种原因,我无法获得标签,“选择日”出现。这就是我在做的事情:
<h:selectOneMenu id="startDay" value="#{bean.day}">
<f:selectItem itemLabel="Select Day" itemValue=""/>
<f:selectItems value="#{bean.days}"/>
</h:selectOneMenu>
bean中的代码是这样的:
private int day;
private List<Integer>days;
我在@PostConstruct init方法中进行实例化:
days = new LinkedList<Integer>();
for(int i=1; i<=31; i++) {
days.add(i);
}
一切正常,但值显示在“1”而不是“选择日”。我在上面的标签上尝试了不同的变化但没有任何效果。我错过了什么?
编辑:我也有一个显示年份的类似小部件,它以相同的方式初始化,但是从2012年开始循环。像这样:
years = new LinkedList<Integer>();
for(int i=2012; i<=2020; i++) {
years.add(i);
}
这很好用,按预期显示“选择年份”。实例化循环从1开始的问题是什么?如果是这样,那么解决方法是什么?
答案 0 :(得分:1)
到目前为止,您的代码看起来很好。如果您已使用项目值预先初始化<h:selectOneMenu value>
,则会出现您所描述的“问题”。在您的情况下,您很可能已在真实代码中的某处将day
的值设置为1
。例如,
private int day = 1; // Instead of default 0.
或
public Bean() {
setDay(1);
}
等等。
更新:根据您的评论:
我是这样做的,因为我正在使用该页面进行编辑和进入新的拍卖,我想确保当回到页面进入新的拍卖时,一旦另一次拍卖被编辑,我们删除已编辑的拍卖值。但除此之外,我会弄清楚如何处理它。
将bean放在视图范围而不是会话范围中。会话范围是输入表单的错误范围。它应仅用于会话特定数据,例如登录用户,其首选项等。另请参阅Communication in JSF2 - Managed bean scopes。