JSF 2.0 selctOneMenu with SelectItems
Iam new to JSF technology, currently in our project we are using JSF 2.0 with spring and hibernate integration.I have one doubt regarding h:selectOneMenu and f:selectItems. From the Database i'm getting a list of UserBeans.I'm using like
<h:select开发者_如何学PythonOneMenu id="users" value="#{MyBean.user}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>
Here user is of type UserBean and userList is the list of UserBeans. In the view page it is showing correctly but in the backing bean when i select one item and click on submit button, it showing the selected user as NULL.
My doubt is i can only pass List of SelectItem objects for the f:selectItems or any other beans list ..??
Is there any other way to populate the list of UserBeans otherthan SelectItem for selectItems.
Thank you All, Anil
You have set the user ID as value of the select items, but you seem to be trying to bind the value
to a fullworthy User
property in the bean. You need to bind it as an user ID.
<h:selectOneMenu id="users" value="#{MyBean.userId}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>
If your sole intent is to be able to select and set User
instead of only the ID, then you need a Converter
to convert between User
and String
. That's because HTTP/HTML doesn't understand Java objects. It only understands strings. Here's a kickoff example:
<h:selectOneMenu id="users" value="#{MyBean.user}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user}" />
</h:selectOneMenu>
with
@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());
}
}
However, this is a pretty expensive job. I'd suggest to stick to passing ID around and obtain the real user in the bean's action method just once instead of letting the converter do it for every single item.
精彩评论