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
[code lang=”xml”]
<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>
[/code]
2. Managed Bean
AutoComplete
[code lang=”java”]
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;
}
}
[/code]
3. Assumed DataSource
PlayerDataSource.java
[code lang=”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;
}
}
[/code]
4. The Associated Converter
PlayerConverter.java
[code lang=”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 "";
}
}
[/code]
5. The POJO
Player.java
[code lang=”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();
}
}
[/code]
6. Primefaces AutoComplete + completeMethod + POJO Demo
The below snapshot shows you using of autoComplete in conjunction with Pojo.
[wpdm_file id=65]
Leave a Reply