Java 在ApacheWicket中获取对象模型的原因是什么?
我是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")); 代
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模型的更多信息,请阅读:我们将表单组件的模型放到类中,并以某种方式匹配它们的数据。我想我明白了。谢谢你的评论和链接。