Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF:为什么UIComponents需要一个无参数构造函数?_Java_Jsf - Fatal编程技术网

Java JSF:为什么UIComponents需要一个无参数构造函数?

Java JSF:为什么UIComponents需要一个无参数构造函数?,java,jsf,Java,Jsf,如果没有一个组件,组件呈现ok,但是使用AJAX和其中的可重新呈现目标失败(IllegalStateException) 我猜UIComponents需要符合JavaBeans规范。但是为什么它们需要非参数构造函数呢?如果我从模板调用UIComponent,我知道运行时需要使用非args构造函数初始化一个类,然后设置任何属性,但在本例中,我以编程方式添加组件,如下所示: MyComponent comp = new MyComponent("foo", "bar"); getChildren()

如果没有一个组件,组件呈现ok,但是使用AJAX和其中的可重新呈现目标失败(IllegalStateException)

我猜UIComponents需要符合JavaBeans规范。但是为什么它们需要非参数构造函数呢?如果我从模板调用
UIComponent
,我知道运行时需要使用非args构造函数初始化一个类,然后设置任何属性,但在本例中,我以编程方式添加组件,如下所示:

MyComponent comp = new MyComponent("foo", "bar");
getChildren().add(comp);

因此,我没有调用非args构造函数,我不知道为什么JSF会这样做,因为AJAX应该只重新呈现组件,而不是从组件类创建新实例?

问题是JSF组件会在请求之间自动序列化和反序列化。默认构造函数(虽然在理论上不是绝对必要的)使这变得更容易,并且是可序列化API所需要的

从文档中:

允许不可序列化的子类型的步骤 要序列化的类,子类型 可以承担储蓄的责任 以及恢复 超类型的公共、受保护和(如果 可访问的)包字段。这个 子类型可能承担此责任 仅当它扩展的类具有 无参数构造函数可访问 初始化类的状态。这是一个 声明类可序列化时出错 如果不是这样的话。错误 将在运行时检测到


问题是JSF组件会在请求之间自动序列化和反序列化。默认构造函数(虽然在理论上不是绝对必要的)使这变得更容易,并且是可序列化API所需要的

从文档中:

允许不可序列化的子类型的步骤 要序列化的类,子类型 可以承担储蓄的责任 以及恢复 超类型的公共、受保护和(如果 可访问的)包字段。这个 子类型可能承担此责任 仅当它扩展的类具有 无参数构造函数可访问 初始化类的状态。这是一个 声明类可序列化时出错 如果不是这样的话。错误 将在运行时检测到


您没有调用它,但是JSF可能需要实例化该组件


看看这个接口(它是由
UIComponent
实现的)。它明确声明不需要参数构造函数。这是因为这是一种保存和恢复状态的自定义机制。

您没有调用它,但JSF可能需要实例化该组件


看看这个接口(它是由
UIComponent
实现的)。它明确声明不需要参数构造函数。这是因为这是一种保存和恢复状态的自定义机制。

JSF框架必须能够实例化
UIComponent
类的新实例。不需要在请求之间将UI树保存在RAM中,在这种情况下,将使用反射来恢复它


UIComponent
实现不实现
Serializable
,也不是JavaBean(根据严格的定义)。实现
Serializable
是没有用的,因为组件可以与其状态有1:n的关系(例如,它们是重复控件的子对象)。

JSF框架必须能够实例化
UIComponent
类的新实例。不需要在请求之间将UI树保存在RAM中,在这种情况下,将使用反射来恢复它


UIComponent
实现不实现
Serializable
,也不是JavaBean(根据严格的定义)。实现
Serializable
是没有用的,因为组件与其状态(例如,它们是重复控件的子控件)之间可能存在1:n的关系。

注意:java序列化不使用构造函数。JSF执行自己的“序列化”。@Bozho:这意味着JSF使用无参数构造函数进行(反)序列化,而普通Java序列化不使用该构造函数?注意:Java序列化不使用该构造函数。JSF执行它自己的“序列化”。@Bozho:这意味着JSF确实使用了无参数构造函数进行(反)序列化,而普通Java序列化则没有?这似乎是事实,但问题是为什么(由于(反)序列化)…你是第一个指出JSF特定序列化机制的人,带指向州政府的指针。选择接受的答案,谢谢:)似乎是这样,但问题是为什么(由于(反)序列化)…你是第一个指出JSF特定序列化机制的人,指针指向StateHolder。选择作为接受答案,谢谢:)关于1:n关系的有趣注释。我想(没有真正考虑)当一个循环被重新渲染时,旧的孩子会被丢弃,而新的孩子会被创建?JSF是否足够智能,能够在创建新实例/修改一些旧实例的同时以某种方式保留和重新呈现旧实例?@Tuukka Mustonen-确切的行为由组件定义。有关更多详细信息,请参见中的
setRowIndex(int)
。感谢链接。读过这篇文章后,我想我还是遗漏了一些东西。无论如何,这可能是另一个问题。谢谢你的支持!关于1:n关系的有趣注释。我想(没有真正考虑)当一个循环被重新渲染时,旧的孩子会被丢弃,而新的孩子会被创建?JSF是否足够智能,能够在创建新实例/修改一些旧实例的同时以某种方式保留和重新呈现旧实例?@Tuukka Mustonen-确切的行为由组件定义。有关更多详细信息,请参见中的
setRowIndex(int)
。感谢链接。读过这篇文章后,我想我还是遗漏了一些东西。无论如何,这可能是另一个问题。谢谢你的支持!