我刚接触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
您已将用户ID设置为选择项的值,但您似乎正在尝试将其绑定value
到User
Bean中的完全属性.您需要将其绑定为用户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,那么您需要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>
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方法中获取真正的用户一次,而不是让转换器为每个项目执行它.
归档时间: |
|
查看次数: |
5409 次 |
最近记录: |