具有SelectItems的JSF 2.0 selctOneMenu

问题描述

|| 我是JSF技术的新手,目前在我们的项目中,我们使用的是带有Spring和Hibernate集成的JSF 2.0。对于h:selectOneMenu和f:selectItems,我有一个疑问。 从数据库中,我获得了UserBeans列表。我正在使用like
<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的列表。 在视图页面中,它可以正确显示,但是当我选择一项并单击“提交”按钮时,在支持bean中,它将所选用户显示为NULL。 我的疑问是我只能为f:selectItems或任何其他bean列表传递SelectItem对象的列表。 除了SelectItem的SelectItem之外,还有其他方法可以填充UserBeans列表。 谢谢你们, 安尼尔     

解决方法

您已经将用户ID设置为选择项的值,但是您似乎正在尝试将ѭ1绑定到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,Object value) {
        return String.valueOf(((User) value).getId());
    }

}
但是,这是一项非常昂贵的工作。我建议坚持传递ID并仅在bean的action方法中获得真实用户,而不是让转换器对每个项目都做一次。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...