我在Facelets页面中有以下下拉列表:
<h:selectOneMenu value="#{contactBean.selectedContact}" converter="#{contactConverter}">
<f:selectItems value="#{contactsHolder.contacts}" var="contact"
itemLabel="#{contact.firstName}" itemValue="#{contact}" />
</h:selectOneMenu>
问题是,无论我为itemLabel
(JSF EL表达式还是纯文本)放入什么,它都不会显示。知道我做错了吗?
这是ContactConverter
:
@ManagedBean(name = "contactConverter")
@RequestScoped
public class ContactConverter implements Converter, Serializable {
@ManagedProperty(value = "#{contactsHolder}")
private ContactsHolder contactsHolder;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return contactsHolder.getContacts().get(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return ((Contact) value).getContactID();
}
//getter & setters...
}
ContactsHolder
:
@ManagedBean
@SessionScoped
public class ContactsHolder implements Serializable {
private Map<String, Contact> contacts;
@PostConstruct
public void init() {
contacts = new LinkedHashMap<String, Contact>();
//get Contacts data and populate map...
}
//getters & setters...
}
答案 0 :(得分:12)
您正在向Map<String, Contact>
提供<f:selectItems value>
。 var
属性中的每个项目都是Map.Entry<String, Contact>
,其中只有getKey()
和getValue()
方法分别返回String
地图关键字和Contact
地图值。 Map.Entry
类确实没有getFirstName()
方法。
相应修复:
<f:selectItems value="#{contactsHolder.contacts}" var="contact"
itemLabel="#{contact.value.firstName}" itemValue="#{contact.value}" />
或者,如果您的目标是支持Servlet 3.0 / EL 2.2的容器,该容器允许调用非getter方法,那么您可以使用Map#values()
来获取Collection<Contact>
:
<f:selectItems value="#{contactsHolder.contacts.values()}" var="contact"
itemLabel="#{contact.firstName}" itemValue="#{contact}" />
或者,将#{contactsHolder.contacts}
改为List<Contact>
,以便初始查看代码能够正常运行:
<f:selectItems value="#{contactsHolder.contacts}" var="contact"
itemLabel="#{contact.firstName}" itemValue="#{contact}" />