Forms 带继承的表单处理

Forms 带继承的表单处理,forms,inheritance,wicket,Forms,Inheritance,Wicket,我有一个模型,可以描述如下: (非常简单。我的实际类每个都有大约10个或20个字段。) 我已经解决了持久性问题,现在我正在尝试创建一个表单,在这个表单中,用户应该能够创建这些类的对象(狗和猫) 我希望大致如下: (我已经实现了HTML和启用/禁用输入字段。) To我的问题:如何最好地实现表单处理?我不知道如何直接使用PropertyModels等,因为模型对象的类型取决于第一个Dog/Cat选择 如果Wicket保证字段的处理顺序与它们在网页中的显示顺序相同,那么我想我可以在处理动物类型输入

我有一个模型,可以描述如下:

(非常简单。我的实际类每个都有大约10个或20个字段。)

我已经解决了持久性问题,现在我正在尝试创建一个表单,在这个表单中,用户应该能够创建这些类的对象(狗和猫)

我希望大致如下:

(我已经实现了HTML和启用/禁用输入字段。)

To我的问题:如何最好地实现表单处理?我不知道如何直接使用PropertyModels等,因为模型对象的类型取决于第一个Dog/Cat选择


如果Wicket保证字段的处理顺序与它们在网页中的显示顺序相同,那么我想我可以在处理动物类型输入后创建模型对象(因为它是第一个表单组件),并让其余字段使用PropertyModel。

首先,您应该考虑将动物类型选择与表单的其余部分分开,因为如果用户在输入一些数据后决定更改类型,则需要丢弃一些条目。这可以通过对表单的这一部分进行轴化并使用onChange事件来清理数据和切换模型来实现

当您这样做时,您可能想考虑从继承切换到组合,以避免复制数据。我不知道这是否仍然与您的持久性策略兼容,但您可以始终将完成的数据复制到持久性层

例如,如果CatModel不是从AnimalModel继承,而是包含如下所示的AnimalModel:

public class CatModel {

    private final AnimalModel parent;
    private String meowingSound;

    public CatModel(AnimalModel parent) {
        this.parent = parent;
    }

    public int getNumLegs() {
        return parent.getNumLegs();
    }

    public void setNumLegs(int numLegs) {
        parent.setNumLegs(numLegs);
    }

    public String getMeowingSound() {
        return meowingSound;
    }

    public void setMeowingSound(String meowingSound) {
        this.meowingSound = meowingSound;
    }

    public AnimalModel getParent() {
        return parent;
    }

}
(跳过接口)

您可以从(同样构造的)DogModel获取AnimalModel来初始化CatModels“继承”的数据

public class AnimalModel {

    private int numLegs;

    public int getNumLegs() {
        return numLegs;
    }

    public void setNumLegs(int numLegs) {
        this.numLegs = numLegs;
    }
}

为了完整性,AnimalModel…

您可以将动物类型选择与表单的其他部分分开,例如通过将其轴化并使用onChange事件将表单模型切换到与所选类型匹配的模型(在需要时复制数据)…对。这将是另一种选择。不过,这将是大量的抄袭。但这也许是最好的解决方案。如果你对模型使用合成(比如CatModel和DogModel都包含动物模型和委托方法),你可以只移动“继承”部分……这听起来是个好主意。然而,我对Wicket还不熟悉,从来没有用这种方式创作过模型。想写一个答案并详细说明一下吗?(哦,还有一件事:如果用户输入“mjau”作为喵喵叫的声音,选择dog,然后重新选择cat,如果保留“mjau”就好了。这可能与您建议的方法相同吗?)我的模型类有很多依赖继承的虚拟方法和内部类,因此,不幸的是,改变构图不是一种选择。(除非你说的是一些辅助类,但是我必须在两个不同的类中复制每个字段。)我想你必须坚持复制。很明显,我们正在使用非常不同类型的模型。对我来说,(wicket的)模型只不过是一个数据容器。。一些成员、getter、setter,可能还有一些与dao、equals、hashCode对话的代码,大多数情况下都是这样。早在我决定创建web前端之前,我就设计了这些类,我不愿意切换到。