Prosinec 29th, 2008Apache Wicket - Znovupoužitelné komponenty
Tvorba vlastních komponent je u komponentově orientovaného web frameworku, důležitá vlastnost. Jen težko bych hledal projekt, který by si vystačil s existujícími vlastnostmi a komponenty daného rámce a nesnažil se o vlastní tvorbu.
Pokud bych Wicket srovnával s JSF na této úrovni, musel bych více podrobněji znát tvorbu komponent v JSF. Ať jsem se snažil sebevíc, nikdy jsem úplně neodhalil výhody vlastních komponent v JSF. Ten postup mi přišel natolik složitý a nesmyslný, že v tomto případě jsem vždy sáhnul po něčem existujícím (RichFaces, Tomahawk, atd.). V JSF mám v tomto ohledu jen teoretickou znalost, která mi ovšem stačí k tomu, abych se do nečeho takového, jako je tvorba vlastních komponent, vůbec nepouštěl.
Ve Wicketu je situace naprosto rozdílná. Samotný framework mě v podstatě nutí rozsekávat danou prezentaci do několika menších celků, které se později dají znovu použít. Navíc je situace o to snažší, že není potřeba se učit či používat nové věci. Bohatě stačí znalost základních komponent a jejich využití. Vše ostatní vyplyne samo.
Pro tvorbu nové komponenty je nejčastěji používán „org.apache.wicket.markup.html.panel.Panel“, od kterého má vlastní komponenta dědí. Díky tomu získám základní vlastnosti, které bych musel jinak znovu tvořit. Podobnost lze najít u Swingu, kde vlastní komponenty nejčastěji dědí od JPanelu.
Na malém příkladu ukážu, jak vytvořit komponenu, která bude obsahovat základní informace o zaměstnanci. Tuto komponentu poté budu moci využít např. při kliknutí na detail zaměstnance, při výpisu zaměstnanců, apod. Všude, kde budu chtít znát základní informace o daném zaměstnanci.
Nejprve doménový model:private String idCislo;
private String prijmeni;
private String jmeno;
// set, get
}
<span wicket:id=„prijmeni“></span> <span wicket:id=„jmeno“></span> (<span wicket:id=„idCislo“></span>)
</wicket:panel>
public ZamestnanecPanel(String id, Zamestnanec z) {
super(id);
add(new Label(„prijmeni“, z.getPrijmeni());
add(new Label(„jmeno“, z.getJmeno());
add(new Label(„idCislo“, z.getIdCislo());
}
}
<div class=„detail“>
<span wicket:id=„zakladni“></span>
… další vlasnosti
</div>
… paticka html stranky.....
public DetailPage(String idCislo) {
super();
add(new ZamestnanecPanel(„zakladni“, service.findById(idCislo)));
// dalsi vlastnosti
}
}