我有一个h:selectOneRadio
已映射到Boolean
支持 bean 中的(不是布尔值)的组件。加载时,单选按钮没有默认选择选项,单选按钮不是必填字段。
示例代码:
JSF 页面摘录:
<h:form>
<h:selectOneRadio value="#{pagecode.test}">
<f:selectItem itemValue="#{true}" itemLabel="Yes"/>
<f:selectItem itemValue="#{false}" itemLabel="No"/>
</h:selectOneRadio>
<h:commandButton value="Save" action="#{pagecode.save}"/>
</h:form>
支持 Java 页面代码:
package pagecode;
public class JSFBooleanTestView extends PageCodeBase {
protected Boolean test;
public Boolean getTest() {
return test;
}
public void setTest(Boolean test) {
this.test = test;
}
public String save() {
return "JSFBooleanTestView";
}
}
faces-config.xml 摘录:
<managed-bean>
<managed-bean-name>pagecode</managed-bean-name>
<managed-bean-class>pagecode.JSFBooleanTestView</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
由于test
未默认为值,因此单选按钮开始时未选中。由于该字段不是必需的,我的期望是在未选择单选按钮的情况下按下保存按钮会导致测试为空。相反,测试被分配为假。
我尝试过的不同选项没有效果:
环境
h:selectOneRadio required="false"
添加到 web.xml:
<context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param>
添加到 web.xml:
<context-param> <param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name> <param-value>false</param-value> </context-param>
所做的工作是添加immediate="true"
到h:commandButton
.
我的问题:
是什么使
h:selectOneRadio
通常将 null 转换为 false?这是预期的行为吗?为什么
immediate="true"
makeh:commandButton
不将空值转换为 false?在导致差异的这种特定情况下,究竟有immediate="true"
什么不同?我知道这immediate="true"
将跳过 JSF 生命周期中的某些阶段,但我不明白在这些阶段中是什么导致了从 null 到 false 的转换。
编辑:
我刚刚意识到我添加immediate="true"
到了h:commandButton
,而不是h:selectOneRadio
. 我的问题已相应编辑。
这在使用 Apache MyFaces 2.0 的 IBM WebSphere Portal 8.0 上的 portlet 应用程序中使用。