The rich:autocomplete component looks like a simple input component, but has advanced options and features to provide suggestions to the user during input.
There are four different modes for how it fetches suggestions:
1) provides suggestions for US state names using the cachedAjax mode with minChars="2".
2) Same suggestions in lazyClient mode. Additionally allows multiple selections using tokens (comma and space chars). This means you will be able to separate different values with a space or comma and get a separate suggestions for any of them. The autofill attribute is set to false so you will notice values are not automatically added.
3) With the selectFirst attribute set to false pressing enter will not choose the value from list automatically, but just submit currently entered value.
<!DOCTYPE html> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich"> <h:form id="form"> <p> <b>1)</b> provides suggestions for US state names using the <b>cachedAjax</b> mode with <i>minChars="2"</i>. </p> <rich:autocomplete mode="cachedAjax" minChars="2" autocompleteMethod="#{autocompleteBean.autocomplete}" /> <p> <b>2)</b> Same suggestions in <b>lazyClient</b> mode. Additionally allows multiple selections using tokens (comma and space chars). This means you will be able to separate different values with a space or comma and get a separate suggestions for any of them. The <b>autofill</b> attribute is set to false so you will notice values are not automatically added. </p> <rich:autocomplete mode="cachedAjax" tokens=", " minChars="1" autofill="false" autocompleteMethod="#{autocompleteBean.autocomplete}" /> <p> <b>3)</b> With the <b>selectFirst</b> attribute set to false pressing enter will not choose the value from list automatically, but just submit currently entered value. </p> <rich:autocomplete mode="cachedAjax" tokens="," minChars="1" autofill="false" selectFirst="false" autocompleteMethod="#{autocompleteBean.autocomplete}" /> </h:form> </ui:composition>
package org.richfaces.demo.autocomplete; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.RequestScoped; import org.richfaces.demo.tables.model.capitals.Capital; @ManagedBean @RequestScoped public class AutocompleteBean { private String value; private List<String> autocompleteList; @ManagedProperty(value = "#{capitalsParser.capitalsList}") private List<Capital> capitals; public AutocompleteBean() { } @PostConstruct public void init() { autocompleteList = new ArrayList<String>(); for (Capital cap : capitals) { autocompleteList.add(cap.getState()); } } public List<String> autocomplete(String prefix) { ArrayList<String> result = new ArrayList<String>(); if ((prefix == null) || (prefix.length() == 0)) { for (int i = 0; i < 10; i++) { result.add(capitals.get(i).getState()); } } else { Iterator<Capital> iterator = capitals.iterator(); while (iterator.hasNext()) { Capital elem = ((Capital) iterator.next()); if ((elem.getState() != null && elem.getState().toLowerCase().indexOf(prefix.toLowerCase()) == 0) || "".equals(prefix)) { result.add(elem.getState()); } } } return result; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public List<String> getAutocompleteList() { return autocompleteList; } public void setAutocompleteList(List<String> autocompleteList) { this.autocompleteList = autocompleteList; } public List<Capital> getCapitals() { return capitals; } public void setCapitals(List<Capital> capitals) { this.capitals = capitals; } }