【问题标题】:JSF 2 <f:selectItems> not recognizing itemLabel and itemValue attributesJSF 2 <f:selectItems> 不识别 itemLabel 和 itemValue 属性
【发布时间】:2011-10-03 21:37:48
【问题描述】:

我在 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...
}

【问题讨论】:

  • 使用纯文本应该可以。

标签: jsf jsf-2 facelets el


【解决方案1】:

您将Map&lt;String, Contact&gt; 喂给&lt;f:selectItems value&gt;var 属性中的每个项目将是一个 Map.Entry&lt;String, Contact&gt;,它只有 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&lt;Contact&gt;

<f:selectItems value="#{contactsHolder.contacts.values()}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />

或者,将#{contactsHolder.contacts} 改为List&lt;Contact&gt;,以便您的初始视图代码可以正常工作:

<f:selectItems value="#{contactsHolder.contacts}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />

【讨论】:

  • 一如既往,BalusC,非常感谢您快速详细的回答!
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2011-07-18
  • 2012-10-29
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多