Cha*_*ncy 1 null jsf boolean jsf-2 selectoneradio
我有一个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>
Run Code Online (Sandbox Code Playgroud)
支持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";
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
由于test没有默认值,单选按钮开始未选中.由于不需要该字段,我的期望是在没有选中单选按钮的情况下按下"保存"按钮会导致测试为空.相反,测试被指定为false.
我尝试过的不同选项没有效果:
设置 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>
Run Code Online (Sandbox Code Playgroud)添加到web.xml:
<context-param>
<param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name>
<param-value>false</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)工作增加immediate="true"了什么h:commandButton.
我的问题:
是什么让h:selectOneRadio正常的转换为空?这是预期的行为吗?
为什么immediate="true"make h:commandButton不将null转换为false?immediate="true"在造成这种差异的特殊情况下,究竟做了什么?我理解immediate="true"将跳过JSF生命周期中的某些阶段,但我不明白这些阶段是什么导致从null转换为false.
我才意识到我加immediate="true"的h:commandButton,不是的h:selectOneRadio.我的问题已经相应编辑.
这在使用Apache MyFaces 2.0的IBM WebSphere Portal 8.0上的portlet应用程序中使用.
像原始包装的行为Boolean,Integer,Double,Character,等得到的原始的默认值false,0,0.0,\u0000分配,而不是等null是针对Apache EL,这是在AO的Tomcat,JBoss应用服务器和WebSphere服务器中使用.它仅影响基于EL 2.1和EL 2.2的版本.自从EL 3.0以来,这种不当行为得到纠正(在我自己的问题报告之后).
使用org.apache.el.parser.COERCE_TO_ZERO确实是解决方案,但您应将其设置为VM参数(系统属性),而不是上下文参数.对于这个特定的问题,它javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL是无关的,但你最应该保留它,以避免String使用空字符串而不是使用空字符串设置类型值null.
所有这些以及一些历史都在博客文章The empty String madness中详细介绍.
| 归档时间: |
|
| 查看次数: |
3651 次 |
| 最近记录: |