我是JSF技术的新手,目前在我们的项目中,我们正在使用带有spring和hibernate集成的JSF 2.0。我对h:selectOneMenu和f:selectItems有一个疑问。从数据库中,我得到了一个UserBeans列表。我像一样使用
<h:selectOneMenu id="users" value="#{MyBean.user}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>
这里user的类型是UserBean,userList是UserBeans的列表。在视图页面中,它显示正确,但在backingbean中,当我选择一个项目并单击submit按钮时,它将所选用户显示为NULL。
我的疑问是,我只能为f:selectItems或任何其他bean列表传递SelectItem对象列表。。??
除了selectItems的SelectItem之外,还有其他方法可以填充UserBeans列表吗。
谢谢大家,Anil
您已经将用户ID设置为选择项的值,但您似乎正在尝试将value
绑定到bean中一个完整的User
属性。您需要将其绑定为用户ID。
<h:selectOneMenu id="users" value="#{MyBean.userId}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>
如果您的唯一目的是能够选择和设置User
,而不仅仅是ID,那么您需要一个Converter
来在User
和String
之间转换。这是因为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的操作方法中获得一次真正的用户,而不是让转换器对每一个项目都这样做。