2015-02-06 51 views
0

我面臨h:selectOneMenu組件的奇怪問題。valueChangeListener在初始值爲空時被調用字符串和新值爲空

我在我的JSF 2應用程序中使用h:selectOneMenu。我在我的控制器類中創建了一個數月的Arraylist,它被賦予h:selectOneMenu。下拉菜單的起始元素是「Any」,其值是一個空白字符串。 h:selectOneMenu的值綁定到對象類變量「month」。 變量月初始化爲「」(空字符串)。

我在h:selectOneMenu上創建了一個ValueChangeEvent。我在控制器中寫了一個方法changeMonth(event),它在Value change事件上被調用。

我的問題是,當我單擊提交按鈕時,即使該值未被更改,也會觸發此值更改事件。只有當下拉菜單位於「任何」時纔會發生這種情況。 當我嘗試在changeMonth方法中獲取更改的值時,我將舊值作爲「」(空字符串)並將新值作爲空值。

理想情況下,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> 

回答

0

反而增加SelectItem("", "Any")到該列表,請嘗試將其替換爲:

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

點是使用noSelectionOption的SelectItem(在我們指定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 
+0

嗨塔裏克,那也不行。您能否請您在當地重現準確的代碼並告訴我您觀察到了什麼結果? – Stacklin 2015-02-09 06:00:51

+0

好的,我會在今天晚些時候嘗試它 – Tarik 2015-02-09 07:57:50

+0

試試這個http://stackoverflow.com/a/6306137/4170582 – Tarik 2015-02-09 16:57:35