我是 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 的列表。
在 View 页面中它显示正确,但是当我选择一个项目并单击提交按钮时,它在支持 bean 中显示所选用户为 NULL。
我的疑问是我只能为 f:selectItems 或任何其他 bean 列表传递 SelectItem 对象列表 ..??
除了 SelectItem 之外,还有其他方法可以填充 UserBeans 列表。
谢谢你们,
阿尼尔
最佳答案
您已将用户 ID 设置为选择项的值,但您似乎正在尝试绑定(bind) value
一个完全值得的User
bean 中的属性。您需要将其绑定(bind)为用户 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 的操作方法中获取真正的用户一次,而不是让转换器为每个项目执行此操作。
关于带有 SelectItems 的 JSF 2.0 selctOneMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6137421/