【问题标题】:How to access the selected label and selected description in jsf selectOneMenu where selectOneMenu is bound with javax.faces.model.SelectItem objects?如何在 jsf selectOneMenu 中访问选定的标签和选定的描述,其中 selectOneMenu 与 javax.faces.model.SelectItem 对象绑定?
【发布时间】:2011-12-01 23:44:30
【问题描述】:

这是针对 JSF 2.0 的(请注意 - 这是 mojerra 实现,我没有使用 Icefaces、myfaces 等)

考虑一下,我的表单中只有一个下拉列表,并且下拉列表绑定了一个 SelectItems 对象列表,其中存储了值、标签和描述。

在我的 Value change actionlistener 事件中,如何访问选定的值、标签和描述。我只能访问选定的值吗?

示例代码-

在我的 xhtml 中 - 下拉列表是 -

<h:selectOneMenu onchange="submit()" valueChangeListener="#{person.changeDD}" value="#{person.selectedValue}">
    <f:selectItems value="#{person.lists}"></f:selectItems>
</h:selectOneMenu>

其中 person 是 bean 的名称

ModelBean-

@ManagedBean(name="person")
@SessionScoped
public class PersonBean implements Serializable{

private String selectedValue;

private List<SelectItem> lists=new ArrayList<SelectItem>(); 
public PersonBean() {
        lists=new ArrayList<SelectItem>();
        lists.add(new SelectItem("1","India","desc1"));
        lists.add(new SelectItem("2","canada","desc2"));
        lists.add(new SelectItem("3","america","desc3"));
    }
//getters and setters


public void changeDD(ValueChangeEvent vce) throws IOException{
        System.out.println("in value change");
        System.out.println("New value-->"+vce.getNewValue().toString());
//I have access only to the selected value and not to the description and label

    }
}   

请帮忙

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    在我的 Value change actionlistener 事件中,我如何访问选定的值、标签和描述。我只能访问选定的值吗?

    这确实也只是 HTML &lt;select&gt; 元素发送的内容。 您需要自己维护可用值和SelectItems 的映射。

    @ManagedBean(name="person")
    @SessionScoped
    public class PersonBean implements Serializable {
    
        private String selectedValue;
        private Map<String, SelectItem> availableValues;
        private List<SelectItem> lists; 
    
        public PersonBean() {
            availableValues = new LinkedHashMap<String, SelectItem>();
            availableValues.put("1", new SelectItem("1", "India", "desc1"));
            availableValues.put("2", new SelectItem("2", "canada", "desc2"));
            availableValues.put("3", new SelectItem("3", "america", "desc3"));
            lists = new ArrayList<SelectItem>(availableValues.values());
        }
    
        public void changeDD(ValueChangeEvent event) {
            String selectedValue = (String) event.getNewValue();
            SelectItem selectedItem = availableItems.get(newValue);
            // ...
        }
    
    }
    

    【讨论】:

    • 非常感谢 Balusc。上帝保佑你:)
    • 不客气。由于您是新来的,请不要忘记标记已接受的答案,这有助于(最)解决问题。另见meta.stackexchange.com/questions/5234/…
    • 好的,谢谢。我试图将答案标记为有用,但它需要 15 名声望 :(
    • 那为什么SelectItem的源码中没有equals&hasCode方法呢?从列表中获取 SelectItem 会更容易。
    【解决方案2】:

    你可以通过为它们设置变量并为变量创建getter和setter来做到这一点

    在你的 bean 中,例如。在您的 bean 中创建描述

      private String description;
    
      public String getDescription(){
           return description;
      }
    
      public void setDescription(String desc){
           description = desc;
      }
    

    对于任何变量也是如此。

    对不起,我误会了

    你可以的

    //String selectedvalue
    SelectItem selectedValue;//create getters setter
    public void changeDD(ValueChangeEvent vce) throws IOException{
        System.out.println("in value change");
        System.out.println("New value-->"+vce.getNewValue().toString());
        String description = selectedValue.getDescription();
    
    }
    }
    

    【讨论】:

    • 您好 ChingPing- 感谢您的及时答复。然而,上述实现抛出运行时异常严重:JSF1073: javax.faces.event.AbortProcessingException 在处理 PROCESS_VALIDATIONS 3 期间捕获:java.lang.ClassCastException: java.lang.String 无法转换为 javax.faces.model.SelectItem 6- 2011 年 10 月 1:43:19 AM com.sun.faces.context.ExceptionHandlerImpl 日志严重:/default.xhtml @26,123 valueChangeListener="#{person.changeDD}":java.lang.ClassCastException:java.lang.String 不能被强制转换为 javax.faces.model.SelectItem :( :(
    【解决方案3】:

    最好的方法是使用自定义对象作为您的 SelectItems 的值并为它们实现自定义转换器:
    http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html

    在 JSF 2 中,您可以像这样轻松实现自定义转换器:
    http://www.mkyong.com/jsf2/custom-converter-in-jsf-2-0/

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2015-11-24
      • 2013-04-21
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多