代码之家  ›  专栏  ›  技术社区  ›  Tuukka Mustonen

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

  •  1
  • Tuukka Mustonen  · 技术社区  · 14 年前

    如果没有,组件就可以呈现ok,但是,使用AJAX和它内部的可重新呈现目标失败(illegalstateeption)。

    我想UIComponents需要符合JavaBeans规范,但是为什么它们需要非args构造函数呢?如果我打电话 UIComponent 从模板中,我了解到运行时需要使用非参数构造函数初始化类,然后设置任何属性,但在本例中,我是以编程方式将组件添加为:

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

    所以我没有调用非args构造函数,我也不知道为什么JSF作为AJAX应该只重新呈现组件,而不是从组件类创建一个新实例?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Bozho    14 年前

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

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

        2
  •  2
  •   Sean Patrick Floyd    14 年前

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

    Serializable 文件:

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

        3
  •  2
  •   McDowell rahul gupta    14 年前

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

    UIComponent公司 实现不实现 Serializable 并且不是JavaBeans(根据严格的定义)。实施 可串行化 不会有用,因为组件可以与其状态有1:n关系(例如,它们是重复控件的子级)。