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.wic­ket.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:
public class Zamestnanec { 
  private String idCislo;
  private String prijmeni;
  private String jmeno;
  // set, get
 }
Nyní vytvořím wicket komponentu:
<wicket:panel>
<span wicket:id=„prij­meni“></span> <span wicket:id=„jme­no“></span> (<span wicket:id=„id­Cislo“></span>)
</wicket:panel>
A k danému HTML i Java kod:
public class ZamestnanecPanel extends Panel {
  public ZamestnanecPa­nel(String id, Zamestnanec z) {
    super(id);
    add(new Label(„prijme­ni“, z.getPrijmeni());
    add(new Label(„jmeno“, z.getJmeno());
    add(new Label(„idCislo“, z.getIdCislo());
  }
 }
Tím mám vlastní komponentu hotovou.Nyní ji stačí využít. Například při zobrazení detailu zaměstnance:
… hlavicka html stranky …
<div class=„detail“>
<span wicket:id=„za­kladni“></span>
… další vlasnosti
</div>
… paticka html stranky.....
K danému HTML i Java kod:
public class DetailPage extends WebPage {
   public DetailPage(String idCislo) {
       super();
       add(new ZamestnanecPa­nel(„zakladni“, service.findBy­Id(idCislo)));
       // dalsi vlastnosti
   }
 }
I když je daný příklad triviální, jasně znázorňuje to, že tvorba vlastních komponent je v Apache Wicket velice jednoduchá a hlavně dobře použitelná. Způsob jak navrhovat takové komponenty je stejný jako v případě tvorby objektově orientovaného kódu. Třídy jsou malé a obsahují jen jednu jasně specifikovanou funkcionalitu. Stejné je to i zde. Myslím, že tohle je ta nejzásadnější věc, která dělá z Apache Wicketu dobrý framework, ve kterém je radost něco psát. Vytvořit komponenty a pak je skládat jako lego :)