IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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.

model - Tipy a triky pre Wicket

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().

AbstractReadOn­lyModel

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).

Model vracajúci aktuálny čas - Tipy a triky pre Wicket
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.

Model vracajúci náhodné číslo - Tipy a triky pre Wicket

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>
PropertyModel - Tipy a triky pre Wicket

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).

ResourceModel Čeština - Tipy a triky pre Wicket
ResourceModel angličtina - Tipy a triky pre Wicket

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 &lt;-&gt; en</a>

StringResourceModel

Predchádzajúce model ResourceModel bol zjednodušením modelu StringResource­Model. 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ď.

StringResourceModel Čeština - Tipy a triky pre Wicket
StringResourceModel angličtina - Tipy a triky pre Wicket

Iný spôsob použitia StringResource­Model. 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>
StringResourceModel ďalšie - Tipy a triky pre Wicket

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.".

LoadableDetacha­bleModel

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 LoadableDetacha­bleModel.

.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

LoadableDetachableModel prvý načítanie - Tipy a triky pre Wicket

Po kliknutí na odkaz pre zmenu locale (načíta sa znova stránka).

LoadableDetachableModel ďalšie načítanie - Tipy a triky pre Wicket

Po kliknutí na tlačidlo späť.

LoadableDetachableModel späť - Tipy a triky pre Wicket

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".

vlastný model - Tipy a triky pre Wicket
Vlastné model po kliknutí - Tipy a triky pre Wicket

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

 

Všetky články v sekcii
Tipy a triky pre Wicket
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity