web-dev-qa-db-fra.com

Comment obtenir à la fois l'étiquette et la valeur de f: selectItems

Je travaille sur une page JSF qui a une liste déroulante basée sur List<SelectItem>:

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

J'ai besoin d'obtenir les deux la valeur et l'étiquette de l'élément actuellement sélectionné. Pour l'instant, je ne reçois que la valeur. Comment puis-je également obtenir l'étiquette?

18
SomeFatMan

Tu ne peux pas. Voilà comment fonctionne HTML. Vous savez, JSF est un générateur de code HTML. Le JSF <h:selectOneMenu> Génère un HTML <select><option>. L'élément HTML <select> N'enverra que l'attribut value de l'élément <option> Sélectionné. Il n'enverra pas son étiquette.

Mais cela ne devrait pas être un gros problème. Vous savez déjà connaissez à la fois la valeur et le libellé côté serveur, à l'intérieur du #{bean.availableItems}. Tout ce que vous devez faire pour obtenir l'étiquette associée est de l'obtenir par la valeur en tant que clé. Je suggère d'en faire un Map qui à son tour peut également être utilisé dans f:selectItems.

Exemple de lancement de base:

public class Bean {
    private String selectedItem; // +getter +setter
    private Map<String, String> availableItems; // +getter

    public Bean() {
        availableItems = new LinkedHashMap<String, String>();
        availableItems.put("value1", "label1");
        availableItems.put("value2", "label2");
        availableItems.put("value3", "label3");
    }

    public void submit() {
        String selectedLabel = availableItems.get(selectedItem);
        // ...
    }
}

avec

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItems value="#{bean.availableItems.entrySet()}" var="entry"
        itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>

et en résultat

<p>Selected label is #{bean.availableItems[bean.selectedItem]}</p>

Une alternative consiste à encapsuler le nom et la valeur dans un objet javabean représentant une entité et à définir l'objet entier comme valeur, via un convertisseur.

Voir également:

46
BalusC

Au lieu d'utiliser Map, j'ai essayé comme ça et cela fonctionne parfaitement pour moi d'obtenir à la fois ItemValue et ItemLabel dans la même propriété en utilisant l'attribut "ItemValue" dans la balise selectItems .Comment jamais fourni aucune virgule supplémentaire dans le ItemLabel ( @ asfas .... j'ai eu le même problème que celui mentionné, j'ai donc choisi cette approche ).

<h:selectOneMenu  value="#{company.issueDesc}"   required="true" onchange="submit()">
     <f:selectItem itemLabel="-- Select a Issue -- " itemValue="0"/>  
     <f:selectItems value="#{company.issueList}" var="model" itemLabel="#{model.IssueDesc}" itemValue="#{model.Code},#{model.IssueDesc}" >
      </f:selectItems>
</h:selectOneMenu>

IssueDesc est un type de chaîne dans Bean Company

    public Class Company{

      private String issueDesc;    // getters and setters
      private int code;  // getters and setters
      private List<T>issueList; // getters and setters.


         public void getLblandVal(){

           String desc=getIssueDesc();
           String[] str_ary=desc.split(",");
           String s1=str_ary[0];
           String s2=str_ary[1];
          // parse **s1** to int;
    }


}
4
mdp

Que faire si la valeur doit être Integer et étiqueter String et les deux sont nécessaires dans le bean de sauvegarde. L'utilisation de Map dans le bean ne fonctionne pas car JSF interprète la clé de map comme une étiquette. Idéalement, ce serait un LinkedHashMap et rechercher le texte par un nombre.

Semble à l'envers pour rechercher le numéro (valeur) par un texte (clé). Que faire si une implémentation de JSF ajoute de l'espace supplémentaire pour tester ou modifier les majuscules pour une raison quelconque. La valeur n'est alors pas trouvée sur la carte.

2
asfas

Ça fera l'affaire.

private String getLabel(List<SelectItem> list, String selection) {
    String label = "";
    for (int i = 0; i < list.size(); i++) {
        if(selection.equals((String)list.get(i).getValue())) {
            label = (String)list.get(i).getLabel();
            break;
        }
    }

    return label;
}

Dans votre exemple, vous passeriez les éléments disponibles en tant que "liste" et les éléments sélectionnés en tant que "sélection". Cette méthode renvoie la valeur d'étiquette correspondant à l'élément selectedItem.

1
J. Van

L'approche suivante peut également être utile pour obtenir de la valeur et étiqueter en utilisant Liste <SelectItem>:
Ici, façade, statesFacade récupère la liste des états du bean de base de données/entreprise.

En vue (page xhtml):

    <h:selectOneMenu id="statesSelectUi" value="#{applicationBean1.state}">
        <f:selectItems value="#{applicationBean1.stateSelectItems}"/>
        <f:ajax render="selectedItem" event="change" execute="statesSelectUi"/>
    </h:selectOneMenu>
    <br/>
    <br/>
    <h:outputText id="selectedItem" value="#{applicationBean1.selectedState}"/>

Dans le bean géré (applicationBean1.Java):

private String state;

/**
     * @return the stateSelectItems
     */
    public List<SelectItem> getStateSelectItemsItems() {
        stateSelectItems.add(new SelectItem("-1","--- Select state ---"));
        int statesCount = statesFacade.count();
        List<StateSelectItems> states;
        states = statesFacade.findAll();
        for (int i = 0; i < statesCount; i++) {
            stateSelectItems.add(new SelectItem(states.get(i).getStateSlNo(), states.get(i).getStateName()));
        }
        return stateSelectItems;
    }


       public String getSelectedState(){
       if("".equals(getState()) || getState() ==null){
        return "";
       }else{
        return "Selected State : " + getStateSelectItems.get(Integer.parseInt(getState())).getValue()+", "++ getStateSelectItems.get(Integer.parseInt(getState())).getLabel();
       }
    }
1
AVA