1 University of West Bohemia Department of Computer Science and Engineering Univerzitni Pilsen Czech Republic Dokumentace frameworku pro OpenCms modul...
University of West Bohemia Department of Computer Science and Engineering Univerzitni 8 30614 Pilsen Czech Republic
Dokumentace frameworku pro OpenCms moduly www.kiv.zcu.cz Miroslav Kr´al, Pˇremek Brada
Technical Report No. DCSE/TR-2009-15 December, 2009 Distribution: local (KIV/DCSE)
Technical Report No. DCSE/TR-2009-15 December 2009
Dokumentace frameworku pro OpenCms moduly www.kiv.zcu.cz Miroslav Kr´al, Pˇremek Brada Abstract Tento dokument popisuje z´akladn´ı strukturu implementace OpenCms modul˚ u pro web Katedry informatiky a v´ ypoˇcetn´ı techniky (KIV). Je urˇcen pro v´ yvoj´aˇre, kteˇr´ı se zapracov´avaj´ı do projekt˚ u na jejich v´ yvoji, a z´aroveˇ n slouˇz´ı jako referenˇcn´ı dokumentace architektury modul˚ u. Hlavn´ım autorem textu je Miroslav Kr´al (A08N0088P), student 5.roˇcn´ıku ININ-SWI.
3 Datov´ a vrstva 3.1 Datov´ y model . . . . . . . . . . . 3.2 DAO vrstva . . . . . . . . . . . . 3.3 Pr´ace s tabulkami v DAO tˇr´ıd´ach 3.4 Dom´enov´e tˇr´ıdy . . . . . . . . . . 3.4.1 B´azov´e tˇr´ıdy . . . . . . . . 3.4.2 Dom´enov´e tˇr´ıdy . . . . . .
. . . . . .
4 4 4 5 7 7 8
. . . . .
10 10 10 12 12 13
. . . . .
16 16 17 17 18 18
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
4 Architektura modul˚ u 4.1 N´avrhov´ y vzor Medi´ator . . . . . . . . . . . . 4.2 Implementace vzoru Medi´ator . . . . . . . . . 4.3 Pˇr´ıklad . . . . . . . . . . . . . . . . . . . . . . 4.3.1 View str´anka – licence.jsp . . . . . . . 4.3.2 Aplikaˇcn´ı logika – LicenceMediator.java 5 Pˇ rehled modul˚ u 5.1 Modul Common . 5.2 Modul Produkty 5.3 Modul Osoby . . 5.4 Modul Predmety 5.5 Modul Publikace
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
i
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
ˇ E ´ TECHNOLOGIE: SPRING 2 POUZIT
´ Uvod
1
Tento dokument popisuje z´akladn´ı strukturu implementace OpenCms modul˚ u pro web Katedry informatiky a v´ ypoˇcetn´ı techniky (KIV). Je urˇcen pro v´ yvoj´aˇre, kteˇr´ı se zapracov´avaj´ı do projekt˚ u na jejich v´ yvoji, a z´aroveˇ n slouˇz´ı jako referenˇcn´ı dokumentace architektury modul˚ u. Moduly pro web KIV jsou ps´any pro redakˇcn´ı syst´em OpenCms, s vyuˇzit´ım jednoduch´ ych technologi´ı (Java, JSP-JSTL, JDBC podpora Spring framework, RESTlet pro pˇr´ıstup k webservices, a JUnit pro v´ yvoj). Motivac´ı je moˇznost zapojit do v´ yvoje studenty s pouze z´akladn´ı znalost´ı v´ yvoje webov´ ych aplikac´ı, napˇr. absolventy pˇredmˇetu KIV/PIA. V textu postupnˇe najdete z´akladn´ı informace pro konfiguraci pouˇzit´ ych technologi´ı, vysvˇetlen´ı struktury DAO vrstvy, a n´avrhov´e vzory podle kter´ ych jsou ps´any struktury implementace modul˚ u.
1.1
D˚ uleˇ zit´ e odkazy
Dom´ac´ı str´anka projektu se nach´az´ı na adrese: • http://wiki.kiv.zcu.cz/WebKiv/HomePage a dom´ac´ı str´anka pro v´ yvoj je na adrese: • http://wiki.kiv.zcu.cz/WebKiv/RedSys. Vˇetˇsinou je nutn´e nainstalovat v´ yvojov´e prostˇred´ı na lok´aln´ı stroj. Postup a seznam potˇrebn´ ych technologi´ı je na adres´ach: • http://wiki.kiv.zcu.cz/WebKiv/PouzivaneTechnologie • http://wiki.kiv.zcu.cz/WebKiv/JakVytvoritTestovaciProstredi.
2
Pouˇ zit´ e technologie: Spring
Pro v´ıce informac´ı o Springu vyuˇzijte dobˇre zpracovan´ y tutori´al: • http://www.kiv.zcu.cz/~brada/vyuka/files/pia/ppp/spring/.
2.1
Pouˇ zit´ eˇ c´ asti Spring Framework
Na webu je Spring pouˇzit pro operace prov´adˇen´e nad datab´az´ı. Z´akladem je knihovna SimpleJdbcTemplate z bal´ıˇcku: 1
2.2 Definice datov´eho zdroje
ˇ E ´ TECHNOLOGIE: SPRING 2 POUZIT
• org.springframework.jdbc.core.simple. Pro Spring jsou d˚ uleˇzit´e anotace pro automatick´e instanciov´an´ı a prov´az´an´ı datab´azov´ ych objekt˚ u uloˇzen´ ych v IOC kontejneru Springu. Pouˇzity jsou n´asleduj´ıc´ı: • org.springframework.stereotype.Repository • org.springframework.beans.factory.annotation.Autowired
2.2
Definice datov´ eho zdroje
Spring je konfigurov´an pˇres xml soubor redsys-servlet.xml, kter´ y se nach´az´ı v adres´aˇri: • \webapps\opencms\WEB-INF\ Zde se obvykle definuje nav´az´an´ı datab´azov´ ych objekt˚ u na konkr´etn´ı tˇr´ıdy v aplikaci. Tato moˇznost nen´ı v projektu vyuˇzita, zde se pouˇz´ıv´a SimpleJdbcTemplate, kter´ y je zm´ınˇen´ y v n´asleduj´ıc´ı podkapitole. V redsys-servlet.xml je ale definov´ano pˇr´ımo datov´e u ´loˇziˇstˇe, tedy datab´aze kiv zcu cz a vˇsechna nastaven´ı, kter´a jsou potˇrebn´a k pˇripojen´ı do datab´aze. Prvn´ı fragment ukazuje, z jak´eho konfiguraˇcn´ıho souboru se budou br´at u ´daje pro pˇripojen´ı k datab´azi: <property name="location" value="/WEB-INF/webkiv.properties"/>
Potˇrebn´e u ´daje pro pˇripojen´ı k datab´azi, ze souboru webkiv.properties, jsou: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/kiv_zcu_cz jdbc.username=root jdbc.password=
´ Udaje url, username a password jsou z´avisl´e na instalaci prostˇred´ı na lok´aln´ım stroji, zde konkr´etnˇe MySQL. V uk´azce jsou pouˇzity v´ ychoz´ı instalaˇcn´ı hodnoty. Posledn´ı fragment ukazuje vyuˇzit´ı informac´ı z konfiguraˇcn´ıho souboru pro vytvoˇren´ı objektu dataSource, kter´ y si Spring bude uchov´avat ve sv´em IOC kontejneru a je vyuˇzit ve webkiv-db knihovnˇe. 2
Datab´aze pro dom´enov´e aplikace webu KIV je uloˇzena v MySql 5, pracuje se s n´ı pouze pˇres DAO (Data Access Objects) vrstvu.
3.1
Datov´ y model
Celkov´ y n´ahled na datov´ y model je na adrese: • http://wiki.kiv.zcu.cz/WebKiv/DatovyModel. Na t´eto adrese se tak´e nach´az´ı aktu´aln´ı verze SQL scriptu pro vytvoˇren´ı datab´aze pro v´ yvoj na locale. Pro ERA model a vytv´aˇren´e tabulky plat´ı n´asleduj´ıc´ı pravidla: ´ P´ISMENY a prefix KIV n´asledovan´ y • Vˇsechny tabulky maj´ı n´azvy VELKYMI zkratkou oblasti a jm´enem tabulky (napˇr. KIV PERS AKTIVITY nebo KIV PUBL CLANKY). • Jako prim´arn´ı kl´ıˇc se pouˇz´ıv´a INT id, atributy ciz´ıch kl´ıˇc˚ u zaˇc´ınaj´ı FK . • Kaˇzd´a ne-ˇc´ıseln´ıkov´a tabulka mus´ı obsahovat atributy zaznam datum (timestamp), zaznam autor (FK do tabulky KIV PERS OSOBY) a zaznam aktivni (boolean). • Jmenn´e a popisn´e entity (viz n´ıˇze) mus´ı obsahovat atributy nazev cz|en respektive popis cz|en. • Rozliˇsen´ı lokalizovan´ ych atribut˚ u se dˇeje pomoc´ı postfix˚ u cz a en.
3.2
DAO vrstva
Tˇr´ıdy pro operace nad datab´az´ı jsou um´ıstˇeny v knihovnˇe webkiv-db.jar a rozdˇeleny do dvou bal´ıˇck˚ u: • webkiv-db\src\cz.zcu.kiv.db.dao • webkiv-db\src\cz.zcu.kiv.db.dao.jdbc Prvn´ı bal´ıˇcek obsahuje rozhran´ı, kter´a jsou n´aslednˇe implementov´ana tˇr´ıdami v druh´em bal´ıˇcku. N´asleduj´ıc´ı uk´azky budou ze souboru ProduktDaoImpl.java z druh´eho bal´ıˇcku. Kaˇzd´a DAO tˇr´ıda z bal´ıˇcku jdbc obsahuje u n´azvu tˇr´ıdy anotaci @Repository, zde konkr´etnˇe: 4
3.3 Pr´ace s tabulkami v DAO tˇr´ıd´ach
´ VRSTVA 3 DATOVA
@Repository("produktDao") public class ProduktDaoImpl implements ProduktDao { ... } Anotace @Repository(”produktDao”) uloˇz´ı instanci t´eto tˇr´ıdy do IOC kontejneru Springu pod identifik´atorem ”produktDao”. Pod n´ım je k dispozici ostatn´ım tˇr´ıd´am, jak ukazuje n´asleduj´ıc´ı k´od z tˇr´ıdy LicenceMediator.java: ProduktDaoImpl produktDao = (ProduktDaoImpl) super.appContext.getBean("produktDao"); Souvisej´ıc´ı anotac´ı je @Autowired, kter´a je pouˇzita jak u instanˇcn´ıch promˇenn´ ych, tak speci´aln´ı metody init(). Pokud je anotace pouˇzit´a u deklarace instanˇcn´ı promˇenn´e uvnitˇr tˇr´ıdy ProduktDaoImpl.java, bude zajiˇstˇeno automatick´e instanciov´an´ı pˇr´ısluˇsn´eho objektu z IOC kontejneru: @Autowired private OsobaDao _osobaDao; To znamen´a ˇze instanˇcn´ı promˇenn´e osobaDao bude v impl tˇr´ıdy ProduktDaoImpl automaticky pˇriˇrazena instance tˇr´ıdy OsobaDaoImpl, kter´a je jiˇz uloˇzena v IOC kontejneru za pomoci anotace @Repository(”osobaDao”). D´ale se anotace @Autowired pouˇz´ıv´a u metody init(): @Autowired public void init(DataSource dataSource) { this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); this.licenceInsert = new SimpleJdbcInsert(dataSource). withTableName("KIV_PROD_LICENCE"). usingGeneratedKeyColumns("id"); ... }
Anotace vloˇz´ı beanu dataSource, nadefinovanou v konfiguraˇcn´ım souboru redsys-servlet.xml, z IOC kontejneru do vol´an´ı metody jako parametr.
3.3
Pr´ ace s tabulkami v DAO tˇ r´ıd´ ach
V metodˇe na pˇredchoz´ı uk´azce je vidˇet nav´az´an´ı DAO tˇr´ıdy na konkr´etn´ı tabulku v datab´azi (pozor na psan´ı n´azv˚ u tabulek – je tˇreba poˇc´ıtat s t´ım, ˇze MySql server je case sensitive, a proto n´azvy ve zdrojov´em k´odu tˇr´ıd mus´ı b´ yt velk´ ymi p´ısmeny v souladu s datov´ ym modelem). Pouˇzit´a tˇr´ıda typu SimpleJdbcInsert se nach´az´ı v bal´ıˇcku: 5
3.3 Pr´ace s tabulkami v DAO tˇr´ıd´ach
´ VRSTVA 3 DATOVA
• org.springframework.jdbc.core.simple.SimpleJdbcInsert Ta umoˇzn ˇuje snadn´e vkl´ad´an´ı dat do datab´aze a n´asledn´e z´ısk´an´ı automaticky generovan´eho prim´arn´ıho kl´ıˇce (pokud takov´ y je). S touto tˇr´ıdou d´ale v naˇsem projektu u ´zce souvis´ı tˇr´ıda MapSqlParameterSource z bal´ıˇcku: • org.springframework.jdbc.core.namedparam.MapSqlParameterSource Tato tˇr´ıda dok´aˇze namapovat sloupce tabulky na konkr´etn´ı promˇenn´e instance objektu. Tuto moˇznost ukazuje n´asleduj´ıc´ı k´od pro instanci typu Licence a tabulku KIV PROD LICENCE : private MapSqlParameterSource getLicenceParametrSource( Licence licence) { return new MapSqlParameterSource() .addValue("id", licence.getId()) .addValue("nazev_cz", licence.getNazevCz()) .addValue("nazev_en", licence.getNazevEn()) .addValue("text", licence.getText()) .addValue("url", licence.getUrl()) .addValue("zkratka", licence.getZkratka()) .addValue("zaznam_editor", licence.getZaznamEditor()) .addValue("zaznam_datum", licence.getZaznamDatum()) .addValue("zaznam_aktivni", licence.isZaznamAktivni()); }
Toto mapov´an´ı se vyuˇz´ıv´a pˇri operac´ıch update a insert. N´asleduj´ıc´ı k´od ukazuje update z´aznamu v tabulce KIV PROD LICENCE a vyuˇzit´ı tˇr´ıd: SimpleJdbcTemplate, SimpleJdbcInsert a MapSqlParameterSource: public void ulozLicenci(Licence licence) { if (licence.isNovyZaznam()) { licence.setId(licenceInsert.executeAndReturnKey( this.getLicenceParametrSource(licence)).intValue()); } else { String sql = "update KIV_PROD_LICENCE set " + "nazev_cz=:nazev_cz, " + "nazev_en=:nazev_en, " + "text=:text, " + "url=:url, " + "zkratka=:zkratka, " +
V k´odu je d´ale vidˇet, jak se z´ısk´a automaticky generovan´ y kl´ıˇc, kter´ y se z´aroveˇ n pouˇzije.
3.4
Dom´ enov´ e tˇ r´ıdy
Tˇr´ıdy reprezentuj´ıc´ı entity datov´eho modelu v aplikaˇcn´ı logice jsou odvozeny od b´azov´ ych tˇr´ıd pro zajiˇstˇen´ı jednotn´e funkˇcnosti z´akladn´ıch atribut˚ u. 3.4.1
B´ azov´ e tˇ r´ıdy
Vˇsechny b´azov´e tˇr´ıdy se nach´az´ı v modulu Common a knihovnˇe webkiv-db v bal´ıku cz.zcu.kiv.db.model. Slouˇz´ı jako rodiˇcovsk´e tˇr´ıdy pro vˇsechny dom´enov´e tˇr´ıdy a k nim pˇridruˇzen´e tˇr´ıdy. Vztahy mezi b´azov´ ymi tˇr´ıdami je uk´az´an na diagramu tˇr´ıd na obr´azku 1. Entita.java Poskytuje id jako jednoznaˇcn´ y identifik´ator do datab´aze. T´eto vlastnosti vyuˇz´ıvaj´ı vˇsechny dom´enov´e tˇr´ıdy a vˇetˇsina pˇridruˇzen´ ych tˇr´ıd. ZakladniEntita.java B´azov´a tˇr´ıda pro tabulky v datab´azi kter´e obsahuj´ı sloupce pro administrativn´ı poloˇzky zaznam aktivni, zaznam datum a zaznam editor. Poloˇzka zaznam aktivni urˇcuje, zda je z´aznam pouˇz´ıv´an pˇri naˇc´ıt´an´ı z datab´aze (deaktivace, tj. nastaven´ı na false, znamen´a “smaz´an´ı” hodnoty z pohledu aplikaˇcn´ı vrstvy). Vˇetˇsinou se naˇc´ıtaj´ı pouze z´aznamy, kter´e jsou aktivn´ı, ale v implementaci se vˇzdy zav´ad´ı i metody, kter´e naˇctou souˇcasnˇe i neaktivn´ı z´aznamy. JmennaEntita.java B´azov´a tˇr´ıda pro tabulky kter´e obsahuj´ı sloupce nazev cz a nazev en. Tyto vlastnosti napˇr´ıklad obsahuje dom´enov´a tˇr´ıdy Produkt.java a k n´ı pˇridruˇzen´a tabulka KIV PROD PRODUKTY. Obsah tˇechto sloupc˚ u se vypisuje na JSP str´ank´ach, kde jsou pˇr´ıtomn´e seznamy dan´ ych poloˇzek, jako napˇr´ıklad na str´ance se seznamem produkt˚ u (seznam.jsp v modulu Produkty). 7
´ VRSTVA 3 DATOVA
3.4 Dom´enov´e tˇr´ıdy
Entita: Class -id:Integer +getId():Integer +setId(Integer) +isNovyZaznam:boolean
PopisnaEntita: Class -popisCz:String -popisEn:String +getPopisCz():String +setPopisCz(String) +getPopisEn():String +setPopisEn(String)
JmennaEntita: Class -nazevCz:String -nazevEn:String +getNazevCz():String +setNazevCz(String) +getNazevEn():String +setNazevEn(String)
Figure 1: Diagram tˇr´ıd b´azov´ ych tˇr´ıd PopisnaEntita.java B´azov´a tˇr´ıda pro tabulky kter´e obsahuj´ı sloupce popis cz a popis en. Tyto vlastnosti napˇr´ıklad obsahuje dom´enov´a tˇr´ıdy Produkt.java a k n´ı pˇridruˇzen´a tabulka kiv prod produkty. Obsah tˇechto sloupc˚ u se vypisuje na JSP str´ank´ach, kde se zobrazuje detail nˇejak´e poloˇzky jako napˇr´ıklad na str´ance s detailem produktu detail.jsp v modulu Produkty. Tyto poloˇzky se d´ale zobrazuj´ı i u nˇekter´ ych seznam˚ u a pˇri editaci konkr´etn´ı poloˇzky. 3.4.2
Dom´ enov´ e tˇ r´ıdy
Vˇsechny dom´enov´e tˇr´ıdy se nach´azej´ı v modulu Common, knihovnˇe webkiv-db. K n´ıˇze uveden´ ym tˇr´ıd´am existuj´ı dalˇs´ı pomocn´e tˇr´ıdy nav´azan´e na tabulky v datab´azi. Tyto tˇr´ıdy jsou ale vˇetˇsinou nav´azan´e na ˇc´ıseln´ıky nebo rozkladov´e tabulky. Z´akladn´ı dom´enov´e tˇr´ıdy jsou:
8
´ VRSTVA 3 DATOVA
3.4 Dom´enov´e tˇr´ıdy
• Osoba.java je sv´az´ana s tabulkou KIV PERS OSOBY a nach´az´ı se v bal´ıˇcku cz.zcu.kiv.db.model.osoby • Publikace.java je sv´az´ana s tabulkou KIV PUBL ZAZNAMY a nach´az´ı se v bal´ıˇcku cz.zcu.kiv.db.model.publikace • Produkt.java je sv´az´ana s tabulkou KIV PROD PRODUKTY a nach´az´ı se v bal´ıˇcku cz.zcu.kiv.db.model.produkty • Soubor.java je sv´az´ana s tabulkou KIV PROD SOUBORY a nach´az´ı se v bal´ıˇcku cz.zcu.kiv.db.model.produkty • Predmet.java je sv´az´ana s tabulkou KIV STUD PREDMETY a nach´az´ı se v bal´ıˇcku cz.zcu.kiv.db.model.studium • Obor.java je sv´az´ana s tabulkou KIV STUD OBORY a nach´az´ı se v bal´ıˇcku cz.zcu.kiv.db.model.studium
9
˚ 4 ARCHITEKTURA MODULU
4
Architektura modul˚ u
Framework pro web KIV pouˇz´ıv´a MVC architekturu s DAO vrstvou a oddˇelen´ım logiky od prezentace v modulech. Logika je vˇzdy v pomocn´ ych tˇr´ıd´ach uloˇzen´ ych v lib/nazev-modulu.jar, prezentaˇcn´ı vrstva jsou JSP pouˇz´ıvaj´ıc´ı JSTL uloˇzen´e v adres´aˇri pages/ modulu. Souhrn informac´ı o architektuˇre modul˚ u je na adrese http://wiki.kiv. zcu.cz/WebKiv/ArchitekturaModulu.
4.1
N´ avrhov´ y vzor Medi´ ator
Architektura modul˚ u je zaloˇzena na n´avrhov´em vzoru Medi´ator, kter´ y slouˇz´ı k obsluze poˇzadavk˚ u pˇridruˇzen´ ych JSP str´anek. Pro bliˇzˇs´ı informace: • http://www.vincehuston.org/dp/mediator.html • http://objekty.vse.cz/Objekty/Vzory-Mediator. Tento vzor ˇr´ıd´ı vazby mezi ˇc´astmi aplikace tak, ˇze se odpov´ıdac´ı funkˇcnost zapouzdˇr´ı do ˇr´ıd´ıc´ıho objektu. Ten oddˇeluje intern´ı zpr´avy od zpr´av, kter´e je tˇreba pˇredat dalˇs´ım ˇca´stem aplikace. Vzor Medi´ator v´ yraznˇe redukuje poˇcet komunikaˇcn´ıch cest mezi jednotliv´ ymi komponentami, kdy by JSP str´anky pˇr´ımo komunikovaly s DAO tˇr´ıdami. (Medi´atory v obecn´em pˇr´ıpadˇe nav´ıc umoˇzn ˇuj´ı vytv´aˇret architekturu, ve kter´e se komponenty staraj´ı jen o zpr´avy, kter´e chtˇej´ı pos´ılat, a nemus´ı se start o to, kter´e objekty jsou c´ıli tˇechto zpr´av.)
4.2
Implementace vzoru Medi´ ator
V syst´emu pouˇz´ıv´ame pro medi´atory rozhran´ı IMediator, ve kter´em jsou definovan´e jednotliv´e ˇr´ıd´ıc´ı metody handle pro obsluhu poˇzadavk˚ u z jednotliv´ ych JSP str´anek. Metoda handle spr´avnˇe vyhodnot´ı druh poˇzadavku a tomu pˇrizp˚ usob´ı dalˇs´ı ˇcinnost. Toto rozhran´ı je implementov´ano abstraktn´ı tˇr´ıdou AbstractMediator, kter´a obsahuje z´akladn´ı utility metody (viz Obr´azek 2). V souˇcasn´e podobˇe implementace m´a kaˇzd´ y modul sv´e rozhran´ı IMediator 1 a to z d˚ uvodu r˚ uznorod´ ych potˇreb (m˚ uˇze si zav´est vlastn´ı metody handle s potˇrebn´ ym poˇctem a typem parametr˚ u). Je ale samozˇrejmˇe d˚ uleˇzit´e nezav´adˇet zbyteˇcn´e metody handle a radˇeji l´epe analyzovat situaci a pokusit se vyuˇz´ıt jiˇz zaveden´e metody handle. 1
Ide´ alnˇe bychom mˇeli dospˇet k tomu ˇze IMediator a AbstractMediator jsou spoleˇcn´e (v modulu Common) a kaˇzd´ y modul m´a svou tˇr´ıdu/tˇr´ıdy XyzMediator oddˇedˇenou od AbstractMediator.
LicenceMediator: Class +handle(HttpSession, HttpServletRequest, HttpServletResponse) ...
XyzFormHandler
Figure 2: Diagram tˇr´ıd Medi´atoru Pokud si to situace vyˇza´d´a, je lepˇs´ı pro pˇrehlednost a souvisej´ıc´ı funkˇcnost zav´est obsluˇzn´e tˇr´ıdy (naz´ yvan´e napˇr. XyzFormHandler ) s vyˇsˇs´ı soudrˇznost´ı, kter´e jsou medi´atorem vyuˇz´ıv´any. Tento postup by mˇel b´ yt dodrˇzen u vˇsech novˇe vytv´aˇren´ ych medi´ator˚ u. Popsan´e vztahy jsou zn´azornˇeny pomoc´ı diagramu tˇr´ıd na obr´azku 2. Pozn´ amka: Dˇr´ıvˇejˇs´ı implementace pouˇz´ıvala k obsluze poˇzadavk˚ u tˇr´ıdy FormHandler a Medi´ator bez striktn´ıho oddˇelen´ı. Ve FormHandlerech byla vˇetˇsina funkˇcnosti pro obsluhu poˇzadavku a to nen´ı spr´avn´e vyuˇzit´ı n´avrhov´eho vzoru Medi´ator. U nˇekter´ ych tˇr´ıd nebylo moˇzno p˚ uvodn´ı implementaci pˇrev´est na “ˇcist´e” medi´atory z d˚ uvodu rozsahu implementace a prov´az´an´ı jednotliv´ ych tˇr´ıd.
11
˚ 4 ARCHITEKTURA MODULU
4.3 Pˇr´ıklad
4.3
Pˇ r´ıklad
Implementace bude demonstrov´ana na ˇreˇsen´ı z modulu Produkty a konkr´etnˇe JSP str´ance licence.jsp a medi´atoru LicenceMediator.java. V tomto vzorov´em pˇr´ıkladu nen´ı pouˇzit FormHandler, protoˇze implementace nen´ı tak rozs´ahl´a, aby bylo nutn´e vyˇclenit obsluˇzn´e metody do dalˇs´ı tˇr´ıdy. Obr´azek 3 ukazuje poˇrad´ı akc´ı pˇri vyvol´an´ı poˇzadavku z JSP str´anky a jeho n´aslednou obsluhu Medi´atorem.
2 DAO
LicenceMediator.java
3
1
4
licence.jsp
Figure 3: Prace medi´atoru
4.3.1
View str´ anka – licence.jsp
JSP str´anky by mˇely obsahovat minim´aln´ı mnoˇzstv´ı scriptlet˚ u s vloˇzen´ ym Java k´odem. Vˇetˇsinou dostaˇcuj´ıc´ı k´od pro obsluhu JSP str´anky za pouˇzit´ı Medi´atoru ukazuje n´asleduj´ıc´ı fragment ze str´anky licence.jsp: <% // Pˇ red´ an´ ı Spring kontextu - pˇ res nˇ ej medi´ ator z´ ısk´ a DAO tˇ r´ ıdy ApplicationContext ctx = WebApplicationContextUtils. getWebApplicationContext(config.getServletContext()); IMediator mediator = new LicenceMediator(pageContext, request, response, ctx); mediator.handle(session, request, response); %>
12
˚ 4 ARCHITEKTURA MODULU
4.3 Pˇr´ıklad
Zde nejdˇr´ıve z´ısk´ame aplikaˇcn´ı kontext pro pˇr´ıpady, kdy medi´ator potˇrebuje z´ısk´avat DAO objekty ze Spring kontextu “ruˇcnˇe”, viz kapitola 2. Pot´e pro rozhran´ı IMediator vytvoˇr´ıme objekt s konkr´etn´ı implementac´ı - LicenceMediator. Posledn´ı ˇr´adka k´odu odpov´ıd´a bodu 1 v obr´azku 3 a slouˇz´ı k obsluze poˇzadavku, kter´ y vznikl otevˇren´ım str´anky nebo jej´ım opˇetovn´ ym naˇcten´ım. N´asleduj´ıc´ı fragment pak ukazuje vlastn´ı prezentaˇcn´ı ˇc´ast JSP, kter´a n´asleduje po scriptletu a v JSTL v´ yrazech pouˇz´ıv´a hodnoty nastaven´e v medi´atoru. Z´aroveˇ n je v nˇem vidˇet nav´az´an´ı na lokalizaˇcn´ı resource bundle uloˇzen´ y v modulu a pouˇzit´ı form´atovac´ıch znaˇcek pro v´ ypis lokalizovan´ ych ˇretˇezc˚ u (elementy
N´asleduj´ıc´ı fragment k´odu obsahuje samotnou metodu handle uvnitˇr tˇr´ıdy LicenceMediator.java. public void handle(HttpSession session, HttpServletRequest request, HttpServletResponse response) { ... if (this.request.getParameter("ulozLicenci") != null) { this.ulozLiceniDoDatabaze(); } else if (this.request.getParameter("vyraditLicence") != null) {
13
˚ 4 ARCHITEKTURA MODULU
4.3 Pˇr´ıklad
try { this.vyradLicenceZDatabaze(request); // Zde by tak´ e mohl b´ yt pouˇ zit form handler nebo jin´ a // pomocn´ a tˇ r´ ıda. } ... else if (this.request.getParameter("id") == null) { this.getSeznamLicenci(); } else { this.getLicence(); } }
Zde se podle uloˇzen´ ych atribut˚ u poˇzadavku urˇc´ı akce pro obslouˇzen´ı poˇzadavku. Je to jeden z moˇzn´ ych postup˚ u, jak rozpoznat typ poˇzadavku a jeho obsluhu. Posledn´ı fragment ukazuje konkr´etn´ı metodu kter´a z´ısk´a data z datab´aze a pˇriprav´ı je pro vr´acen´ı na JSP str´anku. Data se zde konkr´etnˇe ukl´adaj´ı jako atributy poˇzadavku str´anky. private void getSeznamLicenci() { List seznamLicenci = produktDao.getLicence(true); List aktivniLicence = new ArrayList(); List vyrazeneLicence = new ArrayList(); if (seznamLicenci != null) { for (Licence licence : seznamLicenci) { if (licence.isZaznamAktivni() == true) { aktivniLicence.add(licence); } else { vyrazeneLicence.add(licence); } } this.request.setAttribute("aktivniLicence",aktivniLicence); this.request.setAttribute("vyrazeneLicence",vyrazeneLicence);
14
˚ 4 ARCHITEKTURA MODULU
4.3 Pˇr´ıklad } }
Tato ˇra´dka k´odu odpov´ıd´a v obr´azku 3 bodu 2 a 3, tedy vol´an´ı pˇr´ısluˇsn´eho objektu pro pˇr´ıstup do datab´aze a z´ısk´an´ı odpov´ıdaj´ıc´ıch dat. List seznamLicenci = produktDao.getLicence(true);
Po ukonˇcen´ı metody handle se vrac´ı ˇr´ızen´ı na JSP str´anku se z´ıskan´ ymi daty. Toto odpov´ıd´a bodu 4 z obr´azku 3.
15
ˇ ˚ 5 PREHLED MODULU
5
Pˇ rehled modul˚ u
Syst´em obsahuje nˇekolik z´akladn´ıch modul˚ u pro jednotliv´e oblasti webu, kter´e budou pops´any v n´asleduj´ıc´ıch ˇca´stech. Nejd˚ uleˇzitˇejˇs´ım modulem je Common, kter´ y obsahuje knihovnu cel´e DAO vrstvy; na nˇem proto z´avis´ı naprost´a vˇetˇsina ostatn´ıch modul˚ u. Modul Login obsahuje JSP s formul´aˇrem pro pˇrihlaˇsov´an´ı, kter´ y spolu s patchem OpenCms zajiˇsˇtuje integraci s Kerˇ (integrovan´ beros infrastrukturou ZCU y Orion login). Na obr´azku 4 jsou zn´azornˇeny vazby mezi moduly ve stavu k 11/2009:
modul temata webkiv-temata.jar
modul publikace webkiv-publikace.jar
modul predmety org.restlet.jar com.nelios.restlet.ext.net.jar com.nelios.restlet.jar
modul common webkiv-common.jar webkiv-db.vN.MM.jar
modul produkty webkiv-produkty.jar
modul osoby webkiv-osoby.jar
modul login
Figure 4: Vazby mezi moduly Pˇrehled pouˇzit´ ych a nasazen´ ych verz´ı modul˚ u se nach´az´ı na adrese: • http://wiki.kiv.zcu.cz/WebKiv/FunkcniKombinaceModulu.
5.1
Modul Common
Modul Common je z´akladn´ı modul pro vˇsechny ostatn´ı moduly v syst´emu. Modul obsahuje tˇr´ıdu PermissionsAdapter, kter´a udrˇzuje pˇr´ıstupov´a pr´ava a opr´avnˇen´ı pro pˇrihl´aˇsen´eho uˇzivatele. Tyto u ´daje z´ısk´av´a pˇr´ımo z OpenCMS z nastaven´ı uˇzivatel˚ u a uˇzivatelsk´ ych skupin. 16
ˇ ˚ 5 PREHLED MODULU
5.2 Modul Produkty
Nejd˚ uleˇzitˇejˇs´ı souˇca´st´ı modulu je knihovna webkiv-db, kter´a poskytuje operace nad datab´az´ı pro vˇsechny z´avisl´e moduly (viz kap 3). Pomoc´ı t´eto knihovny se pˇristupuje do datab´aze, z´ısk´avaj´ı se potˇrebn´e informace, u ´pravy uloˇzen´ ych dat a vkl´ad´an´ı nov´ ych dat.
5.2
Modul Produkty
Modul Produkty m´a na starosti spr´avu a zveˇrejˇ nov´an´ı v´ yzkumn´e ˇcinnosti katedry v oblasti softwaru. N´ahled posledn´ı nasazen´e funkˇcnosti je zde: • http://www.kiv.zcu.cz/vyzkum/software/. Pokud m´a pˇrihl´aˇsen´ y uˇzivatel administr´atorsk´a pr´ava, m˚ uˇze spravovat licence a tak´e jednotliv´e uloˇzen´e produkty. Neˇz je produkt moˇzno zveˇrejnit, mus´ı proj´ıt schv´alen´ım od vybran´ ych uˇzivatel˚ u, kteˇr´ı jsou souˇc´ast´ı skupiny Schvalovatel definovan´e v properties adres´aˇre s front-endov´ ymi JSP str´ankami modulu. Schvalovatel je na novˇe pˇridan´ y produkt upozornˇen e-mailem. Souˇc´ast´ı modulu je tak´e verzov´an´ı jednotliv´ ych produkt˚ u.
5.3
Modul Osoby
Modul Osoby slouˇz´ı ke spr´avˇe vˇsech zamˇestnanc˚ u uloˇzen´ ych v datab´azi. Modul dovoluje spravovat osobn´ı u ´daje, pozici zamˇestnance, aktivity, ˇclenstv´ı v urˇcit´e organizaci, vyuˇcovan´e pˇredmˇety a publikace, kter´e dan´ y zamˇestnanec napsal. Na obr´azku 4 je vidˇet z´avislost na modulu Publikace. Tato vazba je zp˚ usobena n´asleduj´ıc´ım fragmentem k´odu z JSP str´anky detail.jsp z modulu osoby: Zde je vidˇet vloˇzen´ı speci´aln´ı JSP str´anky z modulu Publikace pro zobrazen´ı publikac´ı konkr´etn´ı osoby2 . 2 Podobn´ y mechanismus by mˇel b´ yt pouˇzit i pro ostatn´ı vkl´adan´e funkˇcnosti, napˇr. z modulu Pˇredmˇety.
17
ˇ ˚ 5 PREHLED MODULU
5.4 Modul Predmety
5.4
Modul Predmety
Modul slouˇz´ı k zobrazov´an´ı pˇredmˇet˚ u vyuˇcovan´ ych ˇcleny KIV. Pˇredmˇety se aktualizuj´ı ze STAGu pˇres webov´e sluˇzby. Bl´ıˇzˇs´ı informace o webov´ ych sluˇzb´ach jsou na adrese: • https://stag-ws.zcu.cz/ws/help/list.
5.5
Modul Publikace
Modul slouˇz´ı k zobrazov´an´ı publikac´ı ˇclen˚ u KIV. Dostupn´a je editace a tak´e se zde nach´az´ı JSP str´anka publikaceProOsobu.jsp, kter´a je pouˇzita v modulu osoby, jak ukazuje vazba na obr´azku 4.