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