Frage

Ich arbeite an einer JSF-Seite, die ein Dropdown hat basierend auf List<SelectItem>:

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

Ich brauche bekommen sowohl den Wert und die Bezeichnung des aktuell ausgewählten Elements. Im Moment bekomme ich nur den Wert. Wie kann ich das Etikett bekommen, auch?

War es hilfreich?

Lösung

Sie können nicht. Das ist nur, wie HTML funktioniert. Sie wissen, JSF ist ein HTML-Code-Generator. Die JSF <h:selectOneMenu> erzeugt ein HTML <select><option>. Das HTML-<select> Element wird nur das value Attribut des <option> Element ausgewählt senden. Es wird nicht das Etikett senden.

Aber das sollte kein großes Problem sein. nämlich Sie bereits kennen sowohl den Wert und die Bezeichnung in der Server-Seite innerhalb der #{bean.availableItems}. Alles, was Sie tun müssen, das zugehörige Etikett zu erhalten, ist es durch den Wert als Schlüssel zu erhalten. Ich schlage vor, es ist ein Map was wiederum machen kann auch in f:selectItems verwendet werden.

Grund Kickoff Beispiel:

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);
        // ...
    }
}

mit

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

und in Folge

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

Eine Alternative ist es, sowohl Namen und den Wert in einem JavaBean Objekt umhüllen eine Einheit darstellt und stellen das gesamte Objekt als Wert, über einen Wandler.

Siehe auch:

Andere Tipps

Stattdessen Karte I die Verwendung versuchte, wie diese und es funktioniert perfekt für mich sowohl ItemValue und ITEMLABEL in der gleichen Eigenschaft zu erhalten, indem „ItemValue“ -Attribut in selectItems-Tag. Wie auch immer keine zusätzlichen Kommas in der ITEMLABEL vorgesehen (@asfas....i hatte das gleiche Problem u so genannten i diesen Ansatz ausgewählt ).

<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>

Im Grunde IssueDesc ist String-Typ in 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;
    }


}

Was passiert, wenn der Wert sollte Integer und Label-String sein und beide sind in Backing Bean benötigt. Mit der Karte in Bohne nicht funktioniert, weil JSF die Karte Schlüssel als Label interpretiert. Im Idealfall wäre es einen LinkedHashMap sein und den Text durch eine Zahl suchen.

Es scheint, den Kopf Nummer zu suchen (Wert) von einem Text (key). Was passiert, wenn einige Implementierung von JSF fügt zusätzlichen Platz zu testen oder Groß- und Kleinschreibung aus irgendeinem Grund ändert. Dann wird der Wert nicht von der Karte zu finden.

Der folgende Ansatz kann auch nützlich sein in immer Wert und Etikett mit Liste :
Hier, Fassade, statesFacade holt Liste der Staaten aus der Datenbank / Enterprise-Bean.

In Ansicht (xhtml Seite):

    <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}"/>

In der Managed Bean (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();
       }
    }

Dies wird den Trick.

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;
}

In Ihrem Beispiel Sie in der availableItems als ‚Liste‘ und selectedItem als ‚Auswahl‘ passieren würden. Diese Methode wird das Etikett Wert entsprechend dem selectedItem zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top