20

私は以下に基づくドロップダウンを持つJSFページに取り組んでいますList<SelectItem>

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

現在選択されているアイテムの値とラベルの両方を取得する必要があります。今のところ、私は値を取得するだけです。どうすればラベルも入手できますか?

4

5 に答える 5

49

できません。これがHTMLの仕組みです。ご存知のとおり、JSFはHTMLコードジェネレーターです。JSF<h:selectOneMenu>はHTMLを生成します<select><option>。HTML要素は、選択した要素の属性<select>のみを送信します。ラベルは送信されません。value<option>

しかし、それは大きな問題ではないはずです。つまり、サーバー側の。内の値とラベルの両方をすでに#{bean.availableItems}知っています。関連付けられたラベルを取得するために必要なのは、キーとしての値で取得することだけです。Mapで使用できるようにすることをお勧めしf:selectItemsます。

基本的なキックオフの例:

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

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

そして結果として

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

別の方法は、名前と値の両方をエンティティを表すjavabeanオブジェクトでラップし、コンバータを介してオブジェクト全体を値として設定することです。

参照:

于 2010-06-29T14:42:30.430 に答える
4

マップを使用する代わりに、私はこのように試しましたが、selectItemsタグの「ItemValue」属性を使用して同じプロパティでItemValueとItemLabelの両方を取得することは完全に機能しています。ただし、ItemLabelに余分なコンマを指定していません@asfas ....私は前述の同じ問題を抱えていたので、このアプローチを選択しました)。

<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はBeanCompanyの文字列型です

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


}
于 2012-09-29T21:37:52.460 に答える
3

値が整数でラベル文字列であり、両方がバッキングBeanで必要な場合はどうなりますか。JSFはマップキーをラベルとして解釈するため、Beanでのマップの使用は機能しません。理想的には、LinkedHashMapであり、テキストを番号で検索します。

テキスト(キー)で検索番号(値)に逆さまに見えます。JSFの実装によって、何らかの理由で大文字と小文字の変更をテストまたはレターするためのスペースが追加された場合はどうなりますか。その後、値はマップから見つかりません。

于 2011-02-08T22:19:41.280 に答える
2

これでうまくいきます。

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

この例では、availableItemsを「list」として渡し、selectedItemを「selection」として渡します。このメソッドは、selectedItemに対応するラベル値を返します。

于 2018-03-29T15:54:59.807 に答える
1

次のアプローチは、 List <SelectItem>を使用して値とラベルを取得する場合にも役立つ場合があります。
ここで、facade、statesFacadeは、データベース/エンタープライズBeanから状態のリストをフェッチします。

ビュー(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}"/>

管理対象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();
       }
    }
于 2014-04-19T08:31:07.293 に答える