Wicket中的Model,PropertyModel和CompoundPropertyModel有什么区别?

Mad*_*ddy 8 wicket

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

链接提供了CompoundPropertyModel和PropertyModel之间的描述,但仍然不能正确区分.

只有我可以区分Model和其他两个的东西是模型不能用于动态字段,而其他两个可以.

有人可以给出这些模型之间的区别吗?

Mar*_*ejc 10

所有这些都是接口IModel的实现.

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

如果要使用属性表达式获取/设置属性,则类PropertyModel非常有用.看一个例子:

class Data {

    private Integer data;
    private String name;

    /* getters and setters */

}
Run Code Online (Sandbox Code Playgroud)

如何使用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'
Run Code Online (Sandbox Code Playgroud)

如果要通过其ID将组件的属性支持,则类CompoundPropertyModel非常有用.查看示例(使用相同的类Data):

Java代码(MyPanel.java):

class MyPanel extends Panel {

    public MyPanel(IModel<Data> model) {
        super(new CompoundPropertyModel<Data>(model));
        add(new Label("id"));
        add(new Label("data"));
    }
}
Run Code Online (Sandbox Code Playgroud)

标记(MyPanel.html):

<wicket:panel>
    <span wicket:id="id">placeholer for id</span>
    <span wicket:id="name">placeholer for id</span>
</wicket:panel>
Run Code Online (Sandbox Code Playgroud)

使用MyClass的Java代码:

// in a Page, Panel or an other Component
Data data = new Data();
data.setId(3);
data.setName('my name');
add(new MyPanel(Model.of(data)));
Run Code Online (Sandbox Code Playgroud)

渲染输出HTML(由面板):

<span>3</span>
<span>my name</span>
Run Code Online (Sandbox Code Playgroud)