jsf 2 - JSF 2.0 selctOneMenu with SelectItems



我是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来在UserString之间转换。这是因为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的操作方法中获得一次真正的用户,而不是让转换器对每一个项目都这样做。

相关内容

  • 没有找到相关文章

最新更新