Skip to content

Wicket Devel

rinkesj edited this page Jun 15, 2014 · 47 revisions

#Wicket development page

  • zde mate nejaky uzitecny informace pro vyvoj nad novym portalem v technologii Wicket. Je to psany bez diakritiky a ne moc zrovna spravne cesky ale je to spis takovej muj mensi blog o tom co a jak se delo a deje. Presnej progres a popis zmen bude po te uveden v bakalarske praci.
  • pokud bude nekdo novy zacinat vyvoj na frameworku wicket je dobry se opravdu seznamit s technologii od zacatku pomoci nejakych tutorialu nebo knih. Framework neni slozitej. Ale snazit se ho pochopit z kodu je hloupost. Usnadnite si praci a usetrite cas kdyz se rovnou podivate na nejaky dobry zdroj.

##Co by se melo predelat v budoucnu:

  • datova vrstva - predelat tak aby pri volani DAO se urcovalo razeni prvku v listu a tim padem prvky v listu radila database. Razeni co je implementovano doted pomoci comparatoru za pomoci reflexe je pomaly reseni.
  • Implementace datumu predelat z Timestamp do cehokoliv jinyho. Doporucuju JodaDateTime knihovnu. Nebo obyc Date. Hibernate s tim pracovat umi a Timestamp hodne pridelava praci pro vyvoj.
  • Pouzit Criteria pri pri praci s listama na urovni hibernatu. Umozni to pomoci jednoducheho postupu filtrovat data na urovni databaze. Seznamy budou moci mit filtry. To by mohlo vyresit problem s vyhledavanim jenom urciteho objektu.
  • Vsechny vycty hodnot prepsat do ENUMu. Nektery uz ted jsou prepsany. (UserRole, GroupRole, Laterality, Gender)
  • Vsechny konstanty pouzite nekde v projektu do CoreConstants nebo do pomocnych trid.
  • SECURITY stranek a pristupy na ne. Dost se zamichavaj ROLE a GROUP ROLE. Az na konci meho projektu jsem si vsiml ze experimenter neni ROLE_EXPERIMENTER ale GROUP_ROLE_ADMIN nebo GROUP_ROLE_EXPERIMENTER. A group role se ziskavaj pres SecurityFacade. Mozny vylepseni pro zabezpeceni stranek je neptat se na strance jestli mam prislusne group role ale mit role a group role uz pripraveny v session a pridat group role do anotaci v hlavickach stranky. Tim se vyresi jejich viditelnost v menu a zaroven se bude lepe resit zabezpeceni stranek.

OPSWI

  • History page - nema vyplneny data v tabulce. Proc ? Nejsou v databazi ?
  • register page: zlobi calendar. DONE
  • register page: zlobi captcha. DONE
  • obecne: vyjimky atd skryty za internal error page. pri development modu se neskryvaji. DONE
  • entity: pro všechny equals + hashcore pres ID {III.}
  • security: dodat group prava do session {II.}
  • spring: prepracovat contexty tak aby bezel jen 1. {I.}
  • test database : drop datafiles z testovani velkych souboru DONE
  • generic parameter : pripravit panel pro generic parametr {II.}
  • FB/LI login: testovani po migraci na novy server. Login OK, Registration TEST
  • bug: ListPersonDataProvider : getIterator je tam if co dela sublist ale nevrati ho...mozna exc. DONE
  • mount internal error page. DONE
  • account overview markup no group visibilita neni ve wicket enclosure DONE

##EEG Old Portal - git branch

  • puvodni verze portalu pred nastupem technologie Wicket.
  • Spring MVC + JSP templates.

##BUGS

  • klidne sem piste bugy co jste nasli s popisem. Nebo vytvorit ISSUE nebo oboji.
  • NASEL JSEM BUG VE WICKETU. Problem je v aktualne nejnovejsi verzi. Pri pouziti FileUploadFieldu a submit akce vyvolane Ajaxovym tlacitkem nebo linkem. Aktualne tahle kombinace neni funkcni v opere od verze 12+. Nahlaseno na wicket bug tracker.

##Wicket * postrehy z prace s wicketem. Mam jich hafec ze to snad nejde ani sepsat.

  • projekt po stazeni jde spustit pres maven. Prikaz "mvn jetty:run-war". Projekt pobezi na adrese localhostu na portu 8080. http://localhost:8080/
  • Pro stranky je pripravenej predek MenuPage kterej obsahuje hlavicku, paticku a horni menu, pres setPageTitle tomu vyplnite title v hlavicce html. Obsahuje zakladni Feedback panel pro zpravy. Pres metodu getFeedback se na nej dostanete. A zbytek si do stranky musite uz pridat. Priklad WelcomePage, atd.
  • v package wui/app najdete tridu ktera mountuje stranky do wicketu na danou URL. takze pokud vite URL tak stranku kterou hledate najdete v teto tride kde u url najdete primo class. Mountovani slouzi k tomu aby nebylo URL moc dlouhy. Defaultne je URL vytvoreno pomoci kompletniho vypisu package.
  • pro praci s properties klickama pro ziskani retezce ze souboru properties je napsana pomocna trida(/eeg-database/src/main/java/cz/zcu/kiv/eegdatabase/wui/components/utils/ResourceUtils.java). Trida obsahuje staticke metody ktere vraci bud primo string nebo model pro wicket obsahujici string ktery je pod properties klickem v pameti.
  • pro praci s parametrama stranek pro odkazy a prechody mezi strankama je napsana pomocna trida(/eeg-database/src/main/java/cz/zcu/kiv/eegdatabase/wui/components/utils/PageParametersUtils.java). Trida je schopna generovat objekt PageParameters ktere slouzi pro predavani parametru strankam.
  • Predkove pro stranky jsou 2. BasePage definuje jen nektere zabezpeceni a defaultni pararameter DEFAULT_PARAM_ID. Tento parameter slouzi pro jednodussi pouziti parametru stranek protoze PageParameterUtils umi generovat pomoci metody "getDefaultPageParameters(...)" rovnou parametry pro stranku kde parameter je pouzit prave tento DEFAULT_PARAM_ID. Pouzivam ho pro prechod treba z listu na detail kdy jako tento parameter dam ID objektu co chci zobrazit. Na detailu stranky si jen vytahnu z parametru pres tento stejny klic ID objektu co chci zobrazit na detailu a zobrazim tento objekt pomoci stranky. Krasnej priklad je treba Seznam uzivatelu a jejich detail.

Datova vrstva a architektura vrstev.

  • pro pristup k datum z hibernatu jsou napsany objekty DAO. Pri pridani tabulky do projekty vznika entity a je dobry k ni rovnou napsat DAO.
  • Pro pristup k datum z wicketu se pouziva konstrukce FACADE > SERVICE > DAO. Duvod je jednoduchy. Rozvrstveni usnadnuje vyvoj a zmeny. Facada slouzi pro volani SERVICE a prozatim neslouzila k nicemu vic ale jedna dalsi vrstva se hodi. Service resi transakce. Metody v ni ktere volaji DAO a pracuji s daty v databazi by meli mit anotaci TRANSACTIONAL. Zaroven se v SERVICE provadi dodatecna logika nad datovou vrstvou. Treba pri registraci se resi poslani emailu. Pri vytvoreni nove skupiny se zde provadi jeste vytvoreni defaultnich ciselniku. DAO by potom melo manipulovat primo s hibernatem pomoci HQL nebo criterii.
  • pekny priklad PersonFacade > PersonService > PersonDAO - rozhrani. Jejich implementace ukazuji jak rozvrstveni vypada. PersonFacadeImpl > PersonServiceImpl > implementace DAO.
  • Proc jsou rozhrani a jejich implementace. Ve spring contextu se definuji beany. Diky tomu ze PersonFacadeImpl implementuje PersonFacade. Tak tam kde potrebuju tento objekt dam jen jeho rozhrani. Spring doplni beanu podle typu a tim padem nam doda PersonFacadeImpl.Doplni pokud si o ni rekneme. Pouzivam anotaci Required nad setter ve tride kde ten objekt chci. Funguje i autowired.

Progress

  • base security - prihlaseni odhlaseni hotovo + testovano.
  • security vylepse - leve menu si hlida prava pristupu pres anotace u stranky. hotovo + testovano.
  • registrace + potvrzeni hotovo + testovano.
  • zobrazeni uctu + zmena hesla hotovo + testovano.
  • zapomenuti hesla - hotovo + testovano.
  • Facebook a LinkedIn login + registrace hotovo.
  • remember me chovani - neimplementovano !!!
  • home page + welcome page hotovo + testovano.
  • administrace - hotovo + testovano.
  • vyzkumne skupiny - Chybi dodelat booking room, zbytek hotovo + testovano.
  • uzivatele - hotovo + testovano.
  • scenare - seznam, detail hotovo + testovano, novy a editace scenare in progress. add/edit schemata scenare chybi.
  • experimenty - seznam, detail, edit, download hotovo + testovano. Chybi vizualizace, pridat 1 file.
  • vse ostatni co neni zde uvedeno neni hotove.

Project structure

  • cz.zcu.kiv.eegdatabase - project package.
  • data - datove objekty a DAO pro pristup k datum a praci s Hibernatem.
  • logic - package pro stare controlery v projektu. Aktualne pouzivane controllery jsou jen v package "social" kvuli prihlaseni na socialni site. Ostatni controllery jsou postupne prepisovany do technologie Wicket.
  • webservices - package pro webove sluzbu a komunikaci s mobilnim clientem pro portal.
  • wui - Wicket base package.
  • wui.app - EEGDatabaseApplication - hlavni trida projektu + soubory s preklady.
  • wui.components - base package pro univerzalni componenty pro Wicket.
  • wui.components.feedback - vse okolo feedback zprav a panelu.
  • wui.components.menu - definice pro enum reprezentujici menu a base menu pro aplikaci(prozatim zde).
  • wui.components.ddm - componenty pro vznik drop down menu na stranku.
  • wui.components.page - predci pro stranky. BasePage pro jakoukoliv stranku. MenuPage pro stranku ktera obsahuje menu.
  • wui.components.utils - pomocne tridy pro praci s resource, pageparametres atd...
  • ui - base package pro specificke stranky aplikace. Zde se nachazeji jednotlive Wicket stranky.
  • core - jednotlive Facade a Service objekty zajistujici pristup k datum a logiku na urovni dat. Manipulace s transakce probiha v Service objektech. Tyhle 3 vrstvy pro pristup k datum je nutne dodrzovat kvuli jednotnosti architektury v projektu.

Dodatecne informace pro vyvoj.

  • properties soubory pro textove retezce pouzite v projektu a pro ruzne chybove hlasky nebo nadpisy atd jsou ted v "/eeg-database/src/main/resources/cz/zcu/kiv/eegdatabase/wui/app/EEGDataBaseApplication.properties". Vsechny ostatni properties soubory co nejsou konfiguracniho charakteru jsou pozustatky ze stareho portalu a budou pozdeji odstraneny.

  • /eeg-database/src/main/webapp/WEB-INF/applicationContext.xml - nahazuje Spring, Wicket, Security, beany pouzite v projektu. Zde se uvadeji vsechny nove beany co maji bezet ve Spring contextu pokud to neni DAO objekt.

  • /eeg-database/src/main/webapp/WEB-INF/dao.xml - zde je konfigurace DAO objektu pro hibernate ktere maji bezet ve Spring contextu.

  • /eeg-database/src/main/webapp/WEB-INF/dispatcher-servlet.xml nahazuje servlet pro napojeni na socialni site jako jediny co zatim bude aktivni z MVC springu.

  • /eeg-database/src/main/webapp/WEB-INF/jetty-web.xml - nastaveni pro jetty web server na testovaci serveru zcu. NEMENIT bez domluvy.

  • /eeg-database/src/main/webapp/WEB-INF/persistence.xml - nastaveni nutne pro hibernate (session factory, transakcni manazer a atd), jsou zde jeste pozustatky stareho portalu co je nutne projit a vyhazet.

  • /eeg-database/src/main/webapp/WEB-INF/rest-servlet.xml - nastaveni RESTu pro webove sluzby pro mobilniho clienta.

  • /eeg-database/src/main/webapp/WEB-INF/socialContext.xml - nastaveni napojeni na socialni site (aktivace controlleru, url mapovani atd).

  • /eeg-database/src/main/webapp/WEB-INF/web.xml - popis pro webove servery, a popisuje jak se ma projekt zapnout a co vse se ma zapnout, definuje filtry atd.

  • /eeg-database/src/main/webapp/WEB-INF/webservices.xml - nejake dalsi nastaveni pro praci webovych sluzeb.

  • /eeg-database/src/main/webapp/WEB-INF/*.properties - konfiguracni soubory pro projekt.

  • /eeg-database/src/main/webapp/WEB-INF/ - ostatni soubory co zde nejsou uvedeny jsou pozustatek stare verze portalu a budou odstraneny pozdeji.

Muj proces prepisu:

  • zde zkusim nastinit jak asi prepis puvodniho portalu do technologie wicket probiha.
  • Najdu si jsp sablonu a k ni prislusny controler, validator a command. Command je temer k nicemu. Da se pouzivat primo entita hibernatu pro praci. Controller v sobe obsahuje vetsinou logiku zobrazeni a logiku prace se strankou. JSP sablona obsahuje structuru stranky. Wicket stranka je tvorena 2ma soubory. html soubor definuje structuru a pozici komponent. .java obsahuje data componenty akce eventy atd.
  • Prepis probiha takto. Z jsp sablony ziskam structuru a vzhled stranky. Vycistim z ni specificke veci pro JSP a zbyde mi opravdu cisty HTML text. Upravim tridy. Vymazu veci ktere dogeneruje wicket. Jako pro html componenty . Tu nam tam doda wicket componenta az ji dame polozky co v seznamu pak chceme videt.
  • Z html potom je videt jak mam poskladat structuru component. Jestli potrebuju formular atd. V javove tride pro stranku pak pripravim jednotlive componenty s jejich specifickymy ID. Pokud je to formular dodam validace. Ruzne tlacitka a odkazy jsou take componenty a jejich akce se zpracovavaji v metodach onClick, onSubmit. staci pridat componentu a ona si sama vynuti dopsani teto metody. Z controleru vezmu logiku chovani stranek pri submitu nebo pri ruznych akcich a prepisu ji do stranky. IDcka ktera jsme priradili componentam dodam do html souboru. Stranku pridam do menu nebo do odkazu ktere na ni maji vest. V zakladni aplikaci wicketu ji priradim jeji url pod kterym bude v prohlizeci videt. Pridam anotaci pro autorizaci a zabezpeceni. Je dobre si stranku parkrat zkusit otestovat zda jeji chovani opravdu sedi.
  • Tento postup fungovat muze ale i nemusi. Nektere stranky muzou mit structuru ktera se primo pro wicket nehodi. Neni dobre se tohodle primo drzet. Staci se zamyslet jak to pro wicket upravit aby to bylo pro nej jednodussi. Drzet za kazdou cenu stejnej vzhled webu neni dobry pro pripady kdy JSP sablona to zvlada jednodusse ale pro wicket je tento layout velmi pracny. Rozvrzeni component do mensich panelu a fragmentu muze ale nemusi byt prinosem.

Prototype3:

Old New Mob1 Mob2 Mob3