以下是该方案: -
ControllerBean : -
private String attributeName;
private String attributeValue;
//setter getters of the attributeName and attributeValue
属性: -
<ui:repeat var="attribute"
value="#{controllerBean.attributeList}">
<h:outputLabel value="#{attribute.attributeName}"/>
<h:inputText value="#{attribute.attributeValue}">
</ui:repeat>
JSF代码:
{{1}}
问题: -
一切正常,所有值都与列表绑定。当在文本框中填充attributeValue时,它会在相应的属性中更新。当我更改属性的值时,它也反映在辅助bean中。
但是当我尝试清除文本框的内容时,它不会将attributeValue设置为空字符串(或null)。它将以前填充的值保留在bean中。因此,用户永远不能将特定属性的值更新为null。
知道为什么吗?我该怎么做才能解决这个问题?
答案 0 :(得分:0)
您没有关闭<h:inputText>
并使用@ViewScoped
给定代码我可以保存空值。添加到commandButton action
属性,方法打印出列表中的每个元素,看看它是否真的没有改变。
支持Bean
@Named(value = "cbean")
@ViewScoped
public class Cbean implements Serializable{
private List<Attribute> attributeList = new ArrayList<>();
public List<Attribute> getAttributeList() {
return attributeList;
}
public Cbean() {
}
@PostConstruct
private void init() {
for (int i = 0; i < 10; i++) {
Attribute a = new Attribute();
a.setAttributeName("name" + i);
a.setAttributeValue("value" + i);
attributeList.add(a);
}
}
public void print() {
for (Attribute a : attributeList) {
System.out.println("name = " + a.getAttributeName() + " value = " + a.getAttributeValue());
}
}
}
XHTML
<h:form>
<ui:repeat var="attribute"
value="#{cbean.attributeList}">
<h:outputLabel value="#{attribute.attributeName}"/>
<h:inputText value="#{attribute.attributeValue}"/>
</ui:repeat>
<h:commandButton value="Submit" action="#{cbean.print()}" />
</h:form>
删除第3个元素的内容后:
Info: name = name0 value = value0
Info: name = name1 value = value1111
Info: name = name2 value =
Info: name = name3 value = value3
Info: name = name4 value = value4
Info: name = name5 value = value5
Info: name = name6 value = value6
Info: name = name7 value = value7
Info: name = name8 value = value8
Info: name = name9 value = value9