Wicket中的Model、PropertyModel和CompoundPropertyModel之间有什么区别?

Wicket中的Model、PropertyModel和CompoundPropertyModel之间有什么区别?,wicket,Wicket,我已经开始学习Wicket框架,我遇到了Wicket模型,我阅读了有关Model()、CompouneModel()和CompoundPropertyModel()的内容,但我没有了解它们之间的实际区别。我在谷歌上搜索了这个,但是我没有得到任何关于这个的信息 这给出了CompoundPropertyModel和PropertyModel之间的描述,但仍然不清楚它们之间的区别 我唯一能区别模型和其他两个的是,模型不能处理动态场,而其他两个可以 有人能说出这些模型之间的区别吗?它们都是接口的实现IM

我已经开始学习Wicket框架,我遇到了Wicket模型,我阅读了有关Model()、CompouneModel()和CompoundPropertyModel()的内容,但我没有了解它们之间的实际区别。我在谷歌上搜索了这个,但是我没有得到任何关于这个的信息

这给出了CompoundPropertyModel和PropertyModel之间的描述,但仍然不清楚它们之间的区别

我唯一能区别模型和其他两个的是,模型不能处理动态场,而其他两个可以


有人能说出这些模型之间的区别吗?

它们都是接口的实现IModel

Model是一个基本的实现,它几乎只是一个“数据持有者”,因此您可以在该模型中存储一个对象并获取数据。如果存储的对象是另一个模型(IModel),则此类的附加值是转发以获取和设置模型对象

如果要使用属性表达式获取/设置属性,则类PropertyModel非常有用。请参见一个示例:

class Data {

    private Integer data;
    private String name;

    /* getters and setters */

}
如何使用PropertyModel获取和设置数据:

Data data = new Data();
data.setId(1);
data.setName("data entity");
IModel idModel = new PropertyModel(data, "id");
IModel nameModel = new PropertyModel(data, "name");

System.out.println(data.getId());
// prints '1'
System.out.println(idModel.getObject());
// prints '1'
System.out.println(data.getName);
// prints 'data entity'
System.out.println(nameModel.getObject());
// prints 'data entity'


data.setId(2);
nameModel.setObject("a new name");

System.out.println(data.getId());
// prints '2'
System.out.println(idModel.getObject());
// prints '2'
System.out.println(data.getName());
// prints 'a new name'
System.out.println(nameModel.getObject());
// prints 'a new name'
如果要通过组件的ID向组件传播属性,则类CompoundPropertyModel非常有用。请参见示例(使用相同的类数据):

Java代码(MyPanel.Java):

呈现输出HTML(通过面板):

3
我的名字
请检查。它给出了很好的解释。

你也可以在

上阅读官方文件,这是一个很好的例子。只是需要一些修正:

IModel idModel = new PropertyModel(data, "id");

我想在数据类中应该是这样的

private Integer id;
相反

下一个地方也犯了同样的错误

 add(new Label("data"));
期待

add(new Label("name"));
使一切正确。谢谢你的帮助

IModel idModel = new PropertyModel(data, "id");
private Integer data;
private Integer id;
 add(new Label("data"));
add(new Label("name"));