Java JSF:为什么UIComponents需要一个无参数构造函数?
如果没有一个组件,组件呈现ok,但是使用AJAX和其中的可重新呈现目标失败(IllegalStateException) 我猜UIComponents需要符合JavaBeans规范。但是为什么它们需要非参数构造函数呢?如果我从模板调用Java JSF:为什么UIComponents需要一个无参数构造函数?,java,jsf,Java,Jsf,如果没有一个组件,组件呈现ok,但是使用AJAX和其中的可重新呈现目标失败(IllegalStateException) 我猜UIComponents需要符合JavaBeans规范。但是为什么它们需要非参数构造函数呢?如果我从模板调用UIComponent,我知道运行时需要使用非args构造函数初始化一个类,然后设置任何属性,但在本例中,我以编程方式添加组件,如下所示: MyComponent comp = new MyComponent("foo", "bar"); getChildren()
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)
。感谢链接。读过这篇文章后,我想我还是遗漏了一些东西。无论如何,这可能是另一个问题。谢谢你的支持!