Java 在ApacheWicket中获取对象模型的原因是什么?

Java 在ApacheWicket中获取对象模型的原因是什么?,java,model,wicket,Java,Model,Wicket,我是ApacheWicket的新手,我不明白为什么我们要得到对象的模型。例如,为了保存提交的输入,我们在网页的表单组件中获得了一个类电影的模型; CompoundPropertyModel model = new CompoundPropertyModel(movie); this.setModel(model); this.add(new TextField("title")); this.add(new TextField("year")); 代

我是ApacheWicket的新手,我不明白为什么我们要得到对象的模型。例如,为了保存提交的输入,我们在网页的表单组件中获得了一个类电影的模型;
CompoundPropertyModel model = new CompoundPropertyModel(movie);
      this.setModel(model);
      this.add(new TextField("title"));
      this.add(new TextField("year"));
代码继续

@Override
public void onSubmit() {
    Movie movie = (Movie) this.getModelObject();
    WicketApplication app = (WicketApplication) this.getApplication();
    MovieCollection collection = app.getCollection();
    collection.addMovie(movie);
    this.setResponsePage(new MovieDisplayPage(movie));
}

至少可以说,
CompoundPropertyModel
是一个有争议的模型。它看起来像魔术一样工作,并且有一些不可预见的语义

CompoundPropertyModel
的JavaDoc真正告诉我们:

/**
*一个简单的复合模型,它使用组件的名称作为属性表达式来检索
*嵌套模型对象上的属性。
* 
*CompoundPropertyModel是一个链接模型,因此如果
*该对象是IModel本身的实例。
* 
*@see org.apache.wicket.model.IModel
*@see org.apache.wicket.model.model
*@see org.apache.wicket.model.LoadableDetachableModel
*@see IChainingModel
* 
*@作者乔纳森·洛克
* 
*@param
*模型对象类型
*/
公共类CompoundPropertyModel扩展了ChainingModel,实现了IComponentInheritedModel
神奇之处在于属性路径的解析。具有
null
模型的
TextField
将查找组件层次结构,以查看是否存在具有
icomponentheritedmodel
的父级组件(CompoundPropertyModel实现了该组件)。如果是这样的话,它将使用它作为基于CompoundPropertyModel(最内部)对象根的属性表达式来计算组件标识符

通过这种方式,您可以执行以下操作:

setModel(新的CompoundPropertyModel(person));
添加(新文本字段(“配偶.家庭名称”);
添加(新文本字段(“儿童[0]。年龄”);
相当整洁,但也被认为是魔术

危险在于以下代码:

setModel(新的CompoundPropertyModel(person));
添加(新文本字段(“配偶.家庭名称”);
添加(新文本字段(“儿童[0]。年龄”);
添加(新链接(“删除”){
@凌驾
公共void onClick(){
Person p=getModelObject();
如果(p.isUnderage()){
p、 删除();
}
}
});

当链接检索其模型对象时,它将在未成年人检查之前触发此人的
delete()
方法。所以要小心使用CompoundPropertyModel。

我想你用你的例子回答了这个问题:文本字段不需要知道任何关于信息如何保存的信息,它们只需要使用CompoundPropertyModel。有关wicket模型的更多信息,请阅读:我们将表单组件的模型放到类中,并以某种方式匹配它们的数据。我想我明白了。谢谢你的评论和链接。