Modely
Model je rozhranie, ktoré umožňuje komponente modifikovať (meniť) dáta
bez toho, aby poznala, ako sú tieto dáta získavané. Modelom vo Wicket je
akákoľvek implementácia rozhrania
org.apache.wicket.model.IModel
. Každý komponent môže mať
model. Komponenta, ktoré je model priradený má niekoľko metód pre
nastavenie a získanie modelu a tiež metódy, ktoré sa volajú pri zmene
modelu.
Modely
Pozrieme sa najskôr na najjednoduchšie komponent a tou je Label (popis).
.java
Label label = new Label("label", "Label"); add(label);
Vytvorenie komponenty Label a jej pridanie.
.html
<div wicket:id="label"></div>
Umiestnenie komponenty do html stránky.
zápis
Label label = new Label("label", "Label"); add(label);
je identický so zápisom
Label label = new Label("label", Model.of("Label")); add(label);
Vytvorí sa komponent Label, ktorej model obsahuje reťazec "Label" (metóda
getObject()
vracia reťazec "Label"). Máme síce komponentu s
modelom, ale dáta, ktoré model poskytuje sa nemení. Vytvoríme si teda inú
komponent, u ktorej sa bude objekt vrátený modelom meniť. Je možné si
urobiť vlastnú implementáciu rozhrania IModel, ale pre bežné použitie má
Wicket už pripravených množstvo hotových modelov.
Model
Túto základnú implementáciu rozhrania IModel už poznáme.
Model.of("Label");
Vytvorí model, ktorého GetObject () metóda vždy vráti reťazec "Label". Identický zápis je
new Model("Label");
Ak to zhrniem, model Model zabalí objekt, ktorý dostane v konstruktoru.
Tento objekt je potom vrátený metódou getObject()
.
AbstractReadOnlyModel
Toto je model, ktorý ponúka dáta len na čítanie. Musí sa
naimplementovať iba metóda getObject()
;
.java
IModel<String> timeModel = new AbstractReadOnlyModel<String>() { @Override public String getObject() { return new Date().toString(); } }; Label timeLabel = new Label("timeLabel", timeModel); add(timeLabel);
.html
<div wicket:id="timeLabel"></div>
Vytvorí label, ktorá vracia zakaždým aktuálny čas (ak budete obnovovať stránku, po každom načítaní sa zobrazí aktuálny čas).
IModel<Integer> randomModel = new AbstractReadOnlyModel<Integer>() { private Random gen = new Random(); @Override public Integer getObject() { return gen.nextInt(); } }; Label randomLabel = new Label("randomLabel", randomModel); add(randomLabel);
.html
<div wicket:id="randomLabel"></div>
Vytvorí label, ktorá zobrazuje náhodné číslo.
PropertyModel
Pristupuje k premennej objektu.
public class Person implements Serializable { private String name; private String surname; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } }
.java
Person person = new Person(); person.setName("František"); person.setSurname("Koudelka"); IModel<String> namePropertyModel = new PropertyModel<String>(person, "name"); Label namePropertyLabel = new Label("namePropertyLabel", namePropertyModel); add(namePropertyLabel);
.html
<div wicket:id="namePropertyLabel"></div>
To isté vytvoríme pre surname
a tri riadky kódu pomestia do
jedného.
.java
add(new Label("surnamePropertyLabel", new PropertyModel<String>(person, "surname")));
.html
<div wicket:id="surnamePropertyLabel"></div>
ResourceModel
Tento model vracia lokalizovaný reťazec.
Properties s českými textami ... _cs.properties
label.text=Text popisku
Properties (defaultný) s anglickými textami ... .properties
label.text=Text of the label
.java
IModel<String> resourceModel = new ResourceModel("label.text"); Label resourceLabel = new Label("resourceLabel", resourceModel); add(resourceLabel);
.html
<div wicket:id="resourceLabel"></div>
Pokiaľ bude mať užívateľ v prehliadači nastavenú českú lokalizáciu, text popisku bude v češtine. Pokiaľ bude mať inú lokalizáciu, text bude v angličtine (tých lokalizácií môže byť samozrejme oveľa viac).
Tu je ešte kód pre vytvorenie odkazu pre prepínanie
locale
.
.java
Link localeLink = new Link("localeLink") { @Override public void onClick() { Locale locale = Session.get().getLocale(); if (locale.equals(Locale.ENGLISH)) { Session.get().setLocale(new Locale("cs")); } else { Session.get().setLocale(Locale.ENGLISH); } } }; add(localeLink);
.html
<hr> <a href="#" wicket:id="localeLink">cs <-> en</a>
StringResourceModel
Predchádzajúce model ResourceModel bol zjednodušením modelu StringResourceModel. Tento model ponúka oveľa väčšie možnosti.
... _cs.properties
label.longtext=Jeho jméno bylo {0} a příjmení {1}.
... .properties
label.longtext=His name was {0} and surname {1}.
.java
IModel<String> stringResourceModel = new StringResourceModel("label.longtext", this, null, new Object[]{"Petr", "Novák"}); Label stringResourceLabel = new Label("stringResourceLabel", stringResourceModel); add(stringResourceLabel);
.html
<div wicket:id="stringResourceLabel"></div>
Pri českom locale zobrazí text: "Jeho meno bolo Peter a priezvisko Novák.", Pri inom locale: "His name was Petr and surname Novák." atď.
Iný spôsob použitia StringResourceModel. Tu použijeme objekt person použitý v jednom z predchádzajúcich príkladov.
... _cs.properties
label.otherlongtext=Jeho jméno bylo ${name} a příjmení ${surname}.
... .properties
label.otherlongtext=His name was ${name} and surname ${surname}.
.java
IModel<String> stringResourceModelOther = new StringResourceModel("label.otherlongtext", this, new Model<Person>(person)); add(new Label("stringResourceLabelOther", stringResourceModelOther));
.html
<div wicket:id="stringResourceLabelOther"></div>
Objekt person má tieto hodnoty premenných: name = "František", surname = "Koudelka". Pri českom locale zobrazí text: "Jeho meno bolo František a priezvisko Koudelka.", Pri inom locale: "His name was František and surname Koudelka.".
LoadableDetachableModel
U tohto modelu je potrebné implementovať jedinú metódu load (), ktorá nahrá a vráti dočasný modelový objekt. Ak ste skúšali aktualizovať stránku a potom sa vrátiť napríklad pomocou tlačidla späť, alebo ste medzi stránkami prechádzali a následne sa späť vracali, určite ste zaznamenali, že všetko bolo tak ako má. Stránky, na ktoré ste sa pomocou tlačidla späť vrátili boli také, aké by ste očakávali (rovnaké). Wicket toho dosahuje tak, že celú stránku uloží (serializuje). Ak sa k nej vraciate, deserializuje ju späť a zobrazí. Môže sa ale stať, že dáta poskytvaná modelom a zobrazená na stránke sú veľmi objemná a alebo sa mení, takže tlačidlo späť by zobrazilo už neaktuálne dáta. Toto je možné riešiť pomocou metódy detach () modelu a alebo použiť napríklad LoadableDetachableModel.
.java
IModel<String> detachableModel = new LoadableDetachableModel<String>() { @Override protected String load() { return UUID.randomUUID().toString(); } }; add(new Label("detachableModelLabel", detachableModel));
.html
<div wicket:id="detachableModelLabel"></div>
Metóda UUID.randomUUID (). ToString () generuje náhodný reťazec. Všimnite si, že ak použijete tlačidlo späť, nezobrazí sa pôvodná reťazec, ale reťazec úplne nový - vykoná nové Načítanie modelového objektu.
Prvé načítanie
Po kliknutí na odkaz pre zmenu locale (načíta sa znova stránka).
Po kliknutí na tlačidlo späť.
Vytvorenie vlastného modelu
Vlastné model vytvoríme tak, že vytvoríme triedu, ktorá bude implementovať rozhranie IModel. V príklade použijeme anonymný triedu. Zároveň pridáme odkaz, ktorý po kliknutí zmení hodnotu modelového objektu. Metóda GetObject () bude vracať Reťazec v upper case (veľké písmená). Metódu detach () zatiaľ nevyužijeme.
.java
final IModel<String> myModel = new IModel<String>() { private String str = "default text"; @Override public void detach() {} @Override public String getObject() { return str.toUpperCase(); } @Override public void setObject(String object) { this.str = object; } }; add(new Label("myLabel", myModel));
Odkaz pre zmenu textu.
add(new Link("textLink") { @Override public void onClick() { myModel.setObject("changed text"); } });
.html
<div wicket:id="myLabel"></div> <a href="#" wicket:id="textLink">link</a>
Pri načítaní stránky sa zobrazí text "DEFAULT TEXT" a po kliknutí na link "CHANGED TEXT".
Príloha obsahuje zdrojové kódy.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 4x (2.02 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java