我在 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...
}
最佳答案
您正在喂食 Map<String, Contact>
至 <f:selectItems value>
. var
中的每一项属性将是 Map.Entry<String, Contact>
只有 getKey()
和 getValue()
返回 String
的方法映射键和 Contact
分别映射值。 Map.Entry
类(class)确实没有 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>
相反,您的初始 View 代码将起作用:<f:selectItems value="#{contactsHolder.contacts}" var="contact"
itemLabel="#{contact.firstName}" itemValue="#{contact}" />
关于JSF 2 <f :selectItems> not recognizing itemLabel and itemValue attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7640973/