当初始值为空字符串且新值为 null 时调用 valueChangeListener
Posted
技术标签:
【中文标题】当初始值为空字符串且新值为 null 时调用 valueChangeListener【英文标题】:valueChangeListener is invoked when initial value is empty string and new value is null 【发布时间】:2015-04-06 10:42:32 【问题描述】:我在使用 h:selectOneMenu 组件时遇到了一个奇怪的问题。
我在我的 JSF 2 应用程序中使用 h:selectOneMenu。我在我的控制器类中创建了一个月份的 Arraylist,它被赋予了 h:selectOneMenu。下拉列表的起始元素是“Any”,其值为空字符串。 h:selectOneMenu 的值与对象类变量“月”相关联。 变量月份初始化为“”(空字符串)。
我在 h:selectOneMenu 上创建了一个 ValueChangeEvent。我在控制器中编写了一个方法 changeMonth(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】:不要将SelectItem("", "Any")
添加到列表中,而是尝试将其替换为:
list.add(new SelectItem(null, "Any", null, false, true, true));
重点是使用 SelectItem 的 noSelectionOption 属性(我们为其分配true
的构造函数中的最后一个参数),这表明它是“无选择”选项,有关此的更多信息属性可以在SelectItem's Javadoc中找到:
标志表明该组件是否创建了该选项 表示特殊的“无选择”选项。表达式必须 评估为布尔值。默认值为 false。
关于上面使用的SelectItem的构造器,这是Javadocs:提供的描述
选择项目
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
【讨论】:
嗨,Tarik,这也不起作用。您能否在您的本地复制确切的代码并告诉我您观察到什么结果? 好的,我今天晚些时候试试以上是关于当初始值为空字符串且新值为 null 时调用 valueChangeListener的主要内容,如果未能解决你的问题,请参考以下文章
Terraform 中的可选变量在值为 null 时不会被忽略
gson实体转json时当字段值为空时,json串中就不存在该属于,请问如何在值为空的时候也保留该字符串