【问题标题】:How to get both label and value from f:selectItems如何从 f:selectItems 获取标签和值
【发布时间】:2010-06-29 14:37:44
【问题描述】:

我正在开发一个 JSF 页面,该页面具有基于 List<SelectItem> 的下拉列表:

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

我需要获得both当前所选项目的值和标签。现在我只得到价值。我怎样才能得到标签呢?

【问题讨论】:

    标签: jsf label selectonemenu


    【解决方案1】:

    你不能。这就是 HTML 的工作原理。你知道,JSF 是一个 HTML 代码生成器。 JSF &lt;h:selectOneMenu&gt; 生成 HTML &lt;select&gt;&lt;option&gt; 。 HTML &lt;select&gt; 元素将仅发送所选 &lt;option&gt; 元素的 value 属性。它不会发送它的标签。

    但这应该不是什么大问题。您即已经知道#{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 对象中,并通过转换器将整个对象设置为值。

    另见:

    【讨论】:

    • availableItems.put("value1", "label1"); 应该是 availableItems.put("label1", "value1"); 如果您希望该标签类似于:“label1”和值:“value1”
    • @roadev 仅当您不使用给定的&lt;f:selectItems var="entry"&gt; 示例时。但这完全解决了最初的问题:能够按值获取标签。你的方法会让它再次变得不可能。也许您忘记阅读问题了?
    【解决方案2】:

    我没有使用 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 Company中的String类型

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

      如果 value 应该是 Integer 和 label String 并且两者都需要在 backing bean 中怎么办。在 bean 中使用 Map 不起作用,因为 JSF 将映射键解释为标签。理想情况下,它将是一个 LinkedHashMap 并通过数字搜索文本。

      通过文本(键)搜索数字(值)似乎颠倒了。如果 JSF 的某些实现由于某种原因添加了额外的空间来测试或字母大小写更改怎么办。然后从地图中找不到该值。

      【讨论】:

        【解决方案4】:

        这样就可以了。

        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 作为“列表”传递,将 selectedItem 作为“选择”传递。该方法将返回所选项目对应的标签值。

        【讨论】:

        • 请将此添加到已接受的答案中。它是对它的(轻微)增强/扩展,它本身就是纯代码,没有任何解释。
        • 为什么这被否决了?很高兴知道我是否写了一些不正确的东西让我知道它是什么。看起来 Kukeltje 接受了它作为接受的答案。就我而言,代码已经过测试并且可以正常使用。所以,我真的很想得到一些关于否决票的反馈。
        • 我认为的 3 个原因。当您查看它时,您发布的只是在没有任何上下文的情况下获取标签,甚至该部分比接受和 40 个赞成的答案要复杂得多。第三,在 jsf 中使用 SelectItem 类是最近(自 jsf2 以来)不再需要的。所以它有点老派
        • 足够好。但是......我确实直接回答了这个问题。问题是关于 SelectItem 的,所以,答案适合这个问题。我仍然不明白为什么它被否决而不是简单地留在 0。答案是正确的。但是,谢谢您的回复。我总是很欣赏学习的时刻。
        • 答案中提供的代码工作正常。可能它不是真正优雅的解决方案,而是完全按照要求进行。不知道为什么它被否决
        【解决方案5】:

        以下方法在使用 List 获取值和标签时也可能有用:
        这里,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();
               }
            }
        

        【讨论】:

          猜你喜欢
          • 2013-10-29
          • 2022-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多