问题描述
||
我是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方法中获得真实用户,而不是让转换器对每个项目都做一次。