以下示例:
<h:selectOneMenu value="#{bean.value}">
<f:selectItem itemValue="#{null}" itemDisabled="#{true}" noSelectOption="#{true}" itemLabel="choose one" />
<f:selectItem itemValue="FEMALE" itemLabel="female" />
<f:selectItem itemValue="MALE" itemLabel="male" />
<f:converter converterId="myConverter" />
</h:selectOneMenu>
在初始加载时,bean的值为null
,因此选择了please select选项。如果用户什么都不选择,浏览器将不会提交一个值(所选选项被禁用),JSF将把该值设置为一个空字符串。如果页面再次呈现,则没有相应的值,JSF将不会呈现选定的属性,大多数浏览器将预选第一个未禁用的值。令人不快的
我想我可以用一个转换器很容易地改变这一点,它将空字符串转换为null
在CCD_ 3中。但在这种情况下,转换器不会被调用。
有人知道为什么吗?
我知道我可以用javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
改变这种行为但这导致了其他领域的其他问题。
我通过手动设置所选属性解决了问题:
<f:selectItem itemValue="#{null}" itemDisabled="#{true}" noSelectOption="#{true}" itemLabel="choose one" />
<f:passThroughAttributes value="#{bean.attributes}" />
</f:selectItem>
public Map<String, String> getAttributes() {
Map<String, String> attributes = new HashMap<>();
if (value == null || "".equals(value)) {
attributes.put("selected", "selected");
}
}
return attributes;
}