我面临着一个奇怪的问题: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>
答案 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