【问题标题】:Item Lable in JSF2 selectOneMenuJSF 2 selectOneMenu 中的项目标签
【发布时间】:2012-01-23 08:58:17
【问题描述】:

我在 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 初始化方法中实例化:

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 开始的实例化循环是否存在问题?如果是这样,解决方法是什么?

【问题讨论】:

  • 似乎是您使用的 primefaces 版本中的一个错误,尝试使用稳定版本或更新版本...因为它应该可以工作 primefaces.org/showcase/ui/selectOneMenu.jsf
  • 您使用的是哪个版本的 JSF 和服务器?我尝试使用 JSF 2.1(2.1.1.FCS) 和 Tomcat 7,它将第一个值显示为 'Select Day'。@Daniel 你怎么断定它是 primefaces?
  • user458248 我正在使用 myfaces 2.1.4 和 tomcat 7。Daniel,这不是这个页面上的 primefaces。我正在更新问题以添加一些信息。
  • 我无法在 MyFaces 2.1.4 和 Mojarra 2.1.4 中重现您的问题。您确定 day 不只是在某处预初始化为 1 吗?
  • 完全不确定...事实上这就是问题所在。再次感谢您,BalusC! (我之所以这样,是因为我同时使用该页面进行编辑和进入新的拍卖,并且我想确保在返回页面进入新的拍卖时,一旦编辑了另一个拍卖,我们会删除编辑了拍卖的价值。但除此之外,我会弄清楚如何处理它。)

标签: jsf-2 selectonemenu


【解决方案1】:

到目前为止,您的代码看起来还不错。如果您已使用确切的项目值预初始化 &lt;h:selectOneMenu value&gt;,则会出现您所描述的“问题”。在您的情况下,您很可能在 real 代码中的某处将 day 的值设置为 1。例如,

private int day = 1; // Instead of default 0.

public Bean() {
    setDay(1);
}

等等。


更新:根据您的评论:

之所以这样,是因为我同时使用该页面进行编辑和进入新的拍卖,并且我想确保在返回页面进入新的拍卖时,一旦编辑了另一个拍卖,我们删除编辑的拍卖的价值。但这不是重点,我会弄清楚如何处理它。

将 bean 放入视图范围而不是会话范围。会话范围是输入表单的错误范围。它应该仅用于会话特定数据,例如登录用户、其偏好等。另见Communication in JSF2 - Managed bean scopes

【讨论】:

  • 是的,我确实将其设置为 1。将其设置为 0 可以满足我的需要。关于 ViewScoped,我将如何处理验证?例如,如果用户过去尝试开始拍卖,我必须将其报告回来。执行视图范围会重新初始化字段,迫使用户从头开始填写表单,这不是我想要的。有解决办法吗? (我喜欢使用视图范围并减少会话中的内存。)
  • 只要您在操作方法中返回nullvoid,就不应在每次回发时重新初始化视图范围的bean。但是,由于bug 1492,如果您将其属性之一绑定到标记处理程序属性,则视图范围 bean 将这样做。检查this article 并通过删除/替换标记处理程序来相应地修复代码。
  • 非常感谢 BalusC。我将返回值更改为 null,它现在作为 ViewScoped 工作得很好。我是否正确假设这会使应用程序的内存需求变小?哦,你将把我变成一个 JSF 开发人员 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2013-04-21
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多