Все они являются реализациями интерфейса IModel.
Класс Модель - это базовая реализация, то есть почти как «держатель данных», поэтому вы можете сохранить объект в этой модели и получить. Добавленная ценность этого класса заключается в том, чтобы пересылать, чтобы получить и установить объект модели, если сохраненный объект является другой моделью (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'
Класс CompoundPropertyModel полезно, если вы хотите propage свойства компонентов их идентификаторов. Смотрите пример (используя тот же класс данных):
Java Code (MyPanel.java):
class MyPanel extends Panel {
public MyPanel(IModel<Data> model) {
super(new CompoundPropertyModel<Data>(model));
add(new Label("id"));
add(new Label("data"));
}
}
Markup (MyPanel.html):
<wicket:panel>
<span wicket:id="id">placeholer for id</span>
<span wicket:id="name">placeholer for id</span>
</wicket:panel>
Java Код с использованием MyClass:
// 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)));
Вынесено выход HTML (на панели):
<span>3</span>
<span>my name</span>