使用SelectItems的JSF 2.0 selctOneMenu

Ani*_*nil 4 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>
Run Code Online (Sandbox Code Playgroud)

这里user是UserBean类型,userList是UserBeans列表.在视图页面中它正确显示,但在我选择一个项目并单击提交按钮时,在支持bean中,它将所选用户显示为NULL.

我怀疑的是我只能为f:selectItems或任何其他bean列表传递List of SelectItem对象.??

有没有其他方法可以为SelectItem填充UserBeans列表,而不是SelectItem列表.

谢谢大家,Anil

Bal*_*usC 6

您已将用户ID设置为选择项的值,但您似乎正在尝试将其绑定valueUserBean中的完全属性.您需要将其绑定为用户ID.

<h:selectOneMenu id="users" value="#{MyBean.userId}">
   <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

如果您的唯一目的是能够选择和设置User而不仅仅是ID,那么您需要ConverterUser和之间进行转换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>
Run Code Online (Sandbox Code Playgroud)

@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());
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,这是一项相当昂贵的工作.我建议坚持传递ID并在bean的action方法中获取真正的用户一次,而不是让转换器为每个项目执行它.