2011-05-26 91 views
4

Iam不熟悉JSF技术,目前在我们的项目中,我们使用JSF 2.0进行spring和hibernate集成。我对h:selectOneMenu和f:selectItems有一个疑问。 从数据库中,我正在使用像JSF 2.0 selctOneMenu with SelectItems

<h:selectOneMenu id="users" value="#{MyBean.user}"> 
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" /> 
</h:selectOneMenu> 

这里用户获得UserBeans.I'm的列表类型的UserBean和用户列表是UserBeans名单。 在视图页面中显示正确,但在辅助bean中,当我选择一个项目并单击提交按钮时,它将选定的用户显示为NULL。

我的疑问是我只能通过SelectItem对象列表的f:selectItems或任何其他的bean列表.. ..?

是否有任何其他方式来为selectItems填充UserBeans的SelectItem列表。

谢谢大家, 阿尼尔

+0

请仅分享一点点代码。 – 2011-05-26 10:57:58

+0

编辑你的问题不要发表评论与代码。 – 2011-05-26 11:00:18

+0

谢谢....克雷姆 – Anil 2011-05-26 11:04:00

回答

6

您已设置用户ID作为选择项目的价值,但你似乎是试图将value绑定到bean中的fullworthy User属性。您需要将其绑定为用户标识。

<h:selectOneMenu id="users" value="#{MyBean.userId}"> 
    <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" /> 
</h:selectOneMenu> 

如果你唯一的目的是为了能够选择和设置User而不是只有ID的,那么你需要一个ConverterUserString之间的转换。这是因为HTTP/HTML不理解Java对象。它只理解字符串。这里有一个开球例如:

<h:selectOneMenu id="users" value="#{MyBean.user}"> 
    <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user}" /> 
</h:selectOneMenu> 

@FacesConverter(forClass=User.class) 
public class UserConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     try { 
      return userService.findById(Long.valueOf(value)); 
     } catch (SomeException e) { 
      throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to User", value)), e); 
     } 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return String.valueOf(((User) value).getId()); 
    } 

} 

然而,这是一个非常昂贵的工作。我建议坚持传递ID,并在bean的action方法中获取真正的用户一次,而不是让转换器为每个项目执行此操作。

+0

谢谢BalusC ....我必须做什么来绑定完整的用户bean作为选定的用户... – Anil 2011-05-26 11:20:09

+1

使用'Converter'。我用一个例子更新了答案。 – BalusC 2011-05-26 11:25:19

+0

非常感谢Balusc ...但我更新了我的代码,将userId和一个onchange事件放在了我的selectOneMenu中,像这样onchange =“alert(' - '+'document.getElementById('users')。value);它显示了所有对象的列表toString值... – Anil 2011-05-26 11:32:00