使用SelectItems的JSF 2.0 selctOneMenu

时间:2011-05-26 10:56:49

标签: jsf jsf-2

我刚接触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列表。

谢谢大家, 阿尼尔

1 个答案:

答案 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,那么您需要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方法中获取真正的用户一次,而不是让转换器为每个项目执行它。