我刚接触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>
此处用户的类型为UserBean,userList是UserBeans的列表。 在视图页面中它正确显示,但在我选择一个项目并单击提交按钮时,在支持bean中,它将所选用户显示为NULL。
我怀疑是我只能传递f:selectItems或任何其他bean列表的SelectItem对象列表。??
是否有其他方法可以为SelectItem填充UserBeans列表,而不是SelectItem列表。
谢谢大家, 阿尼尔
答案 0 :(得分:6)
您已将用户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的action方法中获取真正的用户一次,而不是让转换器为每个项目执行它。