1

我有一个如图所示的豆子

@ManagedBean
@RequestScoped
public class Demo {
private int value1;
private String value2;

..getter and setter..

这是我的 xhtml 页面 demo.xhtml

<h:form>
        <p:panelGrid columns="2">
        <p:outputLabel value="id"></p:outputLabel>
        <p:inputText value="#{demo.value1}"></p:inputText>
        <p:outputLabel value="name"></p:outputLabel>
        <p:inputText value="#{demo.value2}"></p:inputText>
        </p:panelGrid>
    </h:form>

整数值如何在客户端页面中获取 0 值 在此处输入图像描述

我已经读到在请求处理生命周期中,对于第一次请求,jsf 运行时将创建新视图并直接进入渲染阶段。如何在没有流程验证阶段的情况下将值设置到客户端页面。

我从 jsf 2.0 完整参考中阅读了这些行

*Initial request to view the register.xhtml page

Since this
is an initial request (also referred to as a “non-postback” request) to view the
registration page, the Restore View phase creates an empty View (UIViewRoot)
component tree and stores it in the FacesContext instance.

创建视图后,生命周期立即直接进入渲染响应阶段,因为请求中没有传入字段数据进行验证或处理(也称为“非回发”请求)。*

我认为这句话有助于理解我的问题。从生命周期的角度期待答案

4

4 回答 4

9

你的第一个问题是int不能为空,它是一个原语。请改用整数。

按照您的意愿,您会遇到与这里的几篇文章相关的问题COERCE_TO_ZERO

为了防止这种行为,您可以将 web.xml 中的上下文参数javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL配置为 true

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

此外,您可能需要在 tomcat 的启动脚本中添加一个 VM 参数。 -Dorg.apache.el.parser.COERCE_TO_ZERO=false

网上有几篇关于这个话题的好文章

于 2013-09-26T06:12:15.480 回答
1

int发生这种情况是因为字段的默认值为0. 有关这方面的更多信息,您可以在此处的 Java 语言规范中找到。

如果要显示一个空字段,则必须使用Integer包装类型而不是简单int类型。这样,该字段的初始值将为空,并将显示为一个空字段。

于 2013-09-26T06:12:12.757 回答
1

Java 原语不能null,另一方面,对象可以。根据 Java 语言规范“变量的初始值”的第 4.12.5 节,编译器会将您private int value1;简单地视为,因为values的默认值为. 因此,您的字符串的默认值为.private int value1 = 0;int0null

因此,您得到value1零和value2空字符串。

还值得注意的是,它与 JSF 无关,因为它只是一个基本的 Java 问题。

于 2013-09-26T06:12:39.947 回答
0

即使您使用整数包装类型而不是 int 原始类型,也只有显示字段将为 NULL。但是,如果您不为其提供任何值,即如果该字段留空,JSF 会再次将零附加到该字段。

于 2014-04-19T18:49:04.167 回答