In my previous post, I have explained how to use Primefaces AutoComplete component in conjunction with completeMethod. But what if the user has decided to use a Plain Old Java Object (POJO) instead of using simple strings object as most of time that case it happens.
Using a domain objects within autoComplete isn’t trivial as it contains some additional component for making it works. At this tutorial you are going to develop a simple Primefaces application that adhered to using POJO for the autocomplete functionality.
- Read : PrimeFaces Tutorials
1. The View
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> <script name="jquery/jquery.js" library="primefaces"></script> </h:head> <f:view> <h:form prependId="false"> <h1>JavaBeat Primefaces Example</h1> <h2>Primefaces - AutoComplete + completeMethod + Pojo</h2> <h:outputText value="Enter name of the player you wish to see statistics for :"/> #{' '} <p:autoComplete value="#{autoComplete.player}" completeMethod="#{autoComplete.complete}" var="player" itemValue="#{player.playerId}" itemLabel="#{player.playerName}"></p:autoComplete> </h:form> </f:view> </html>
2. Managed Bean
AutoComplete
package net.javabeat.primefaces; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.SessionScoped; import net.javabeat.primefaces.data.Player; import net.javabeat.primefaces.util.PlayerDataSource; @ManagedBean @SessionScoped public class AutoComplete { @ManagedProperty("#{playerDataSource}") private PlayerDataSource ds; private Player player; public AutoComplete (){ } public List<Player> complete(String query){ // Assumed Datasource return ds.queryByName(query); } public Player getPlayer() { return player; } public void setPlayer(Player player) { this.player = player; } public PlayerDataSource getDs() { return ds; } public void setDs(PlayerDataSource ds) { this.ds = ds; } }
3. Assumed DataSource
PlayerDataSource.java
package net.javabeat.primefaces.util; import java.util.ArrayList; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import net.javabeat.primefaces.data.Player; @ManagedBean @SessionScoped public class PlayerDataSource { public List<Player> players = new ArrayList<Player>(); public PlayerDataSource(){ // Assumed Player Player player = new Player(); player.setPlayerId("1"); player.setPlayerName("Anderias Muller"); player.setPlayerPosition("CF"); player.setPlayerAge("24"); // Add Player players.add(player); // Assumed Player player = new Player(); player.setPlayerId("2"); player.setPlayerName("Olaf Thon"); player.setPlayerPosition("CM"); player.setPlayerAge("29"); // Add Player players.add(player); // Assumed Player player = new Player(); player.setPlayerId("3"); player.setPlayerName("Oliver Khan"); player.setPlayerPosition("GK"); player.setPlayerAge("31"); // Add Player players.add(player); } public List<Player> getPlayers() { return players; } public void setPlayers(List<Player> players) { this.players = players; } public List<Player> queryByName(String name){ // Assumed search using the startsWith List<Player> queried = new ArrayList<Player>(); for(Player player: this.players){ if(player.getPlayerName().startsWith(name)){ queried.add(player); } } return queried; } }
4. The Associated Converter
PlayerConverter.java
package net.javabeat.primefaces.converter; import javax.faces.bean.ManagedProperty; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.FacesConverter; import net.javabeat.primefaces.data.Player; import net.javabeat.primefaces.util.PlayerDataSource; @FacesConverter public class PlayerConverter implements Converter{ @ManagedProperty("#{playerDataSource}") private PlayerDataSource ds; public PlayerDataSource getDs() { return ds; } public void setDs(PlayerDataSource ds) { this.ds = ds; } @Override public Object getAsObject(FacesContext context, UIComponent component,String value) { for(Player p : ds.getPlayers()){ if(p.getPlayerId().equals(value)){ return p; } } return null; } @Override public String getAsString(FacesContext context, UIComponent component,Object value) { if(value instanceof Player){ Player player = (Player)value; return player.getPlayerId(); } return ""; } }
5. The POJO
Player.java
package net.javabeat.primefaces.data; public class Player { private String playerId; private String playerName; private String playerPosition; private String playerAge; public String getPlayerId() { return playerId; } public void setPlayerId(String playerId) { this.playerId = playerId; } public String getPlayerName() { return playerName; } public void setPlayerName(String playerName) { this.playerName = playerName; } public String getPlayerPosition() { return playerPosition; } public void setPlayerPosition(String playerPosition) { this.playerPosition = playerPosition; } public String getPlayerAge() { return playerAge; } public void setPlayerAge(String playerAge) { this.playerAge = playerAge; } public boolean equals(Object obj){ if(obj instanceof Player){ Player player = (Player)obj; if(this.playerId.equals(player.getPlayerId())){ return true; } } return false; } public int hashCode(){ return this.playerId.hashCode(); } }
6. Primefaces AutoComplete + completeMethod + POJO Demo
The below snapshot shows you using of autoComplete in conjunction with Pojo.
[wpdm_file id=65]