Я столкнулся со странной проблемой с компонентом h: selectOneMenu.
Я использую h: selectOneMenu в своем приложении JSF 2. Я создал Arraylist месяцев в своем классе контроллера, который передается в h: selectOneMenu. Начальным элементом раскрывающегося списка является «Любой», значение которого представляет собой пустую строку. Значение h:selectOneMenu привязано к переменной класса объекта «месяц». Переменная месяц инициализируется как «» (пустая строка).
Я создал ValueChangeEvent на h: selectOneMenu. Я написал метод changeMonth (событие) в контроллере, который вызывается при событии изменения значения.
Моя проблема заключается в том, что это событие изменения значения запускается, когда я нажимаю кнопку отправки, даже если значение не изменяется. Это происходит только в том случае, если в раскрывающемся списке установлено значение «Любой». Когда я попытался получить значения для изменения в методе 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>