当初始值为空字符串且新值为null时,将调用valueChangeListener

时间:2015-02-06 10:08:19

标签: jsf jsf-2 selectonemenu

我面临着一个奇怪的问题:h:selectOneMenu组件。

我在JSF 2应用程序中使用了h:selectOneMenu。我在我的控制器类中创建了几个月的Arraylist,它被赋予h:selectOneMenu。下拉列表的起始元素是“Any”,其值为空字符串。 h:selectOneMenu的值与对象类变量“month”相关联。 变量月初始化为“”(空字符串)。

我在h:selectOneMenu上创建了一个ValueChangeEvent。我在控制器中编写了一个方法changeMonth(event),它在Value change event上调用。

我的问题是,即使值未更改,单击提交按钮时也会触发此值更改事件。仅当下拉列表为“任意”时才会发生这种情况。 当我尝试在changeMonth方法中获取更改的值时,我将旧值作为“”(空字符串)并将新值作为null。

理想情况下,不应触发ValueChangeEvent。但是,由于它从空白变为空,这种情况正在发生。为什么会这样?这是JSF 2 h:selectOneMenu组件的问题吗?

我正在粘贴我的控制器代码:

@ManagedBean
@SessionScoped
public class Controller {

private List monthList;
private ObjClass searchVO;

public List getMonthList() {
    List<SelectItem> list = new ArrayList<SelectItem>();
    list.add(new SelectItem("", "Any"));

    for (int i = 1; i <= 12; i++) {
        list.add(new SelectItem(String.valueOf(i), "Month"+i));
    }
    monthList = list;
    return monthList;
}

/**
 * @param monthList
 *            the monthList to set
 */
public void setMonthList(List monthList) {

    this.monthList = monthList;
}
public ObjClass getSearchVO() {
    if (searchVO == null) {
        searchVO = new ObjClass();
    }
    return searchVO;
}

public void setSearchVO(ObjClass searchVO) {
    this.searchVO = searchVO;
}

public void changeMonth(ValueChangeEvent changeEvent) {

    PhaseId phaseId = changeEvent.getPhaseId();
    String oldValue = (String) changeEvent.getOldValue();
    String newValue = (String) changeEvent.getNewValue();

}

}

这是我的对象类:

public class ObjClass {
public String getMonth() {
    return month;
}

public void setMonth(String month) {
    this.month = month;
}

private String month="";

public ObjClass(String month) {
    super();
    this.month = month;
}
public ObjClass() {
}

}

这是我的xhtml表单:

<h:form>


    Dropdown example:

    <h:selectOneMenu valueChangeListener="#{controller.changeMonth}"
                onchange="submit();" id="month"
                value="#{controller.searchVO.month}" title="Select Month">
                <f:selectItems value="#{controller.monthList}" />
    </h:selectOneMenu>

        <br /><br />

  <h:outputText value="#{controller.searchVO.month}"></h:outputText>
            <h:commandButton value="Submit" action="result" />
        <h:commandButton value="Reset" type="reset" />

    </h:form>

1 个答案:

答案 0 :(得分:0)

不要将SelectItem("", "Any")添加到列表中,而是尝试将其替换为:

list.add(new SelectItem(null, "Any", null, false, true, true));

重点是使用SelectItem的 noSelectionOption 属性(构造函数中我们为其指定true的最后一个参数),这表明它是“无选择”选项,更多信息关于该属性可以在SelectItem's Javadoc中找到:

  

指示此组件是否创建选项的标志   代表特殊的“无选择”选项。表达必须   评估为布尔值。默认值为false。

关于上面使用的SelectItem的构造函数,这是Javadocs:提供的描述

  

<强>的SelectItem

public SelectItem(java.lang.Object value,
                  java.lang.String label,
                  java.lang.String description,
                  boolean disabled,
                  boolean escape,
                  boolean noSelectionOption)
     

使用指定的属性值构造一个SelectItem实例。

     

<强>参数:

value - Value to be delivered to the model if this item is selected by the user
label - Label to be rendered for this item in the response
description - Description of this item, for use in tools
disabled - Flag indicating that this option is disabled
escape - Flag indicating that the text of this option should be escaped when rendered.
noSelectionOption - Flag indicating that the current option is a "no selection" option