代码之家  ›  专栏  ›  技术社区  ›  SomeFatMan

如何从f:selectitems获取标签和值

  •  17
  • SomeFatMan  · 技术社区  · 16 年前

    我正在处理一个JSF页面,它有一个基于 List<SelectItem> :

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

    我需要得到 二者都 当前选定项的值和标签。现在我只得到这个值。我怎样才能拿到标签呢?

    5 回复  |  直到 8 年前
        1
  •  44
  •   BalusC    8 年前

    你不能。这就是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对象中,并通过转换器将整个对象设置为值。

    参见:

        2
  •  4
  •   mdp    13 年前

    我没有使用map,而是这样尝试,通过在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是bean公司中的字符串类型

        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;
        }
    
    
    }
    
        3
  •  2
  •   asfas    15 年前

    如果值应该是整数和标签字符串,并且这两者都是支持bean所必需的,该怎么办?在bean中使用map不起作用,因为JSF将map键解释为标签。理想情况下,它将是一个Linkedhashmap,并按数字搜索文本。

    看起来像颠倒的数字(值)由一个文本(键)。如果JSF的某些实现由于某种原因增加了测试或字母大小写更改的额外空间,该怎么办?然后在映射中找不到该值。

        4
  •  1
  •   AVA    12 年前

    以下方法在获取值和使用 列表<selectitem> :
    这里,facade和statefacade从数据库/企业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中(Apple BeAN1.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();
           }
        }
    
        5
  •  1
  •   J. Van    8 年前

    这就行了。

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

    在您的示例中,您将传入可用项作为“list”,并将selecteditem作为“selection”。此方法将返回与SelectedItem对应的标签值。