当初始值为空字符串且新值为 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串中就不存在该属于,请问如何在值为空的时候也保留该字符串

count的一些用法

用前导零填充字符串,使其在 SQL Server 2008 中的长度为 3 个字符

java成员变量怎么默认初始化

XStream将java对象解析为xml字符串时,过滤掉节点值为空的节点