mercoledì 19 dicembre 2012

Caricare combo da HashMap con JSF 2.0

Per caricare una combo in un componente JSF si possono seguire varie strade.
In questo post vediamo come caricarla a partire da un HashMap.
Di seguito il codice del managed bean:


package org.primefaces.examples.domain;
import java.util.HashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name="myBean")
@ViewScoped
public class CaricaTest {
private Map<String,String> lista=null;
public Map<String, String> getLista() {
 return lista;
}
public void setLista(Map<String, String> lista) {
 this.lista = lista;
}
public CaricaTest(){
 lista=new HashMap<String, String>();
 lista.put("01", "Primo valore");
 lista.put("02", "Secondo valore");
 lista.put("03", "Terzo valore");
}
private String valore;

public String getValore() {
 return valore;
}

public void setValore(String valore) {
 this.valore = valore;
}

}

Adesso vediamo il codice dell'xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core"  
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">  
   <h:head>
   </h:head>
<h:body> 
<h:form id="form">  
<h:outputText value="Lista: " />  
    <h:selectOneMenu value="myBean.valore">
      <f:selectItems value="#{myBean.lista}" />  
    </h:selectOneMenu>
  </h:form>
</h:body>
</html>

Così facendo però abbiamo un comportamento all'apparenza strano.
A video infatti apparirà la seguente schermata:


Guardando al codice HTML generato vediamo che sono "invertiti" chiave e valore della mappa.
Il comportamento è infatti quello di base del componente, voluto così proprio da specifica.
 La logica è che si preferisce  evitare di far vedere all'utente duplicati nel valore mostrato a video e quindi la key della mappa diventa  la descrizione nella combo e viceversa.
Per impostare la visualizzazione che vogliamo occorre modificare il componente f::selectItems  in questo modo:


<f:selectItems  value="#{myBean.lista.entrySet()}" var="entry" 
     itemValue="#{entry.key}" itemLabel="#{entry.value}" 
     itemDescription="#{entry.value}" />  

In questo modo abbiamo il risultato desiderato (si noti che itemDescription è il tooltip del valore):

Nessun commento:

Posta un commento