Szerver oldali Java programozás 2007-08/II. 1. óra Elemkönyvtárak Elemkönyvtárak használata Saját elemkönyvtár készítése szenasi.sandor@nik.bmf.hu
Adatbázisok elérése Témakörök Elemkönyvtárak használata Egyszerű elemek készítése Törzset tartalmazó elemek 2
Elemkönyvtárak JSP oldalakban lehetőség van saját akció-elemek (tagek) készítésére. Ezek az elemek valójában programkódot reprezentálnak, ezzel elrejthetik a weboldal készítője elől a tényleges implementációt. Mivel egy JSP oldalban számos új akció-elem definiálására szükség lehet, ezeket célszerű elemkönyvtárakba rendezni (custom tag library) Így a webalkalmazásokban ténylegesen elválhat egymástól a kód és a prezentáció (így ezeket készítheti két különböző személy) Elemkönyvtárak használata: szükséges osztályok elhelyezése (WEB-INF/classes) Tag Library Descriptor állomány elhelyezése a (WEB-INF) web.xml állomány módosítása (amennyiben szükséges) JSP oldal fejlécében TagLib azonosítása, prefix hozzárendelése saját elemek használata az oldalban 3
Tag Library Descriptor TagLib az elemkönyvtár általános jellemzői tlib-version könyvtár verziószáma jsp-version szükséges JSP verziószám short-name rövid név description elemkönyvtár leírása uri egy nyilvános URI, ami egyértelműen azonosítja a könyvtárat Tag elemenként a részletes jellemzők name a tag neve, ezzel lehet majd rá hivatkozni a JSP oldalon tag-class az elemkezelő Java osztály neve tei-class kiegészítő információkat tartalmazó osztály body-content elem törzse: tagdependent, JSP, empty description rövid leírás variable scriptváltozók megadása (nem tárgyaljuk) attribute az elem egy attribútumának leírása name megnevezése required kötelező-e megadni: true, false, yes, no type attribútum típusa description rövid leírás 4
Tag Library Descriptor példa <?xml version="1.0" encoding="utf-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>arfolyam</short-name> <uri>/web-inf/tlds/arfolyam</uri> <tag> <name>arfolyam</name> <tag-class>teszt.atvalto.arfolyam</tag-class> <body-content>scriptless</body-content> <attribute> <name>valuta</name> <type>java.lang.string</type> <rtexprvalue>true</rtexprvalue> </attribute> </tag> Arfolyam.tld állomány 5
web.xml állomány módosítása A web.xml állomány minden használni kívánt elemkönyvtárról tárolja az alábbi struktúrát: taglib egy új elemkönyvtár hozzáadása taglib-uri az elemkönyvtár azonosítója taglib-location az elemkönyvtárt leíró állomány pontos helye Egy példa: <?xml version="1.0" encoding="utf-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmln... <taglib> <tablib-uri>/web-inf/tlds/arfolyam</taglib-uri> <taglib-location>/web-inf/tlds/arfolyam</taglib-location> </taglib>... </web-app> WEB-INF/tld-be helyett taglibek esetén elhagyható (JSP2.0) 6
Elemkönyvtár használata JSP oldalban Minden elemkönyvtár használat előtt a JSP oldalon azonosítani kell az elemkönyvtárat az URI segítéségével, illetve egy (az oldalon belül) egyedi prefixet kell hozzárendelni Például: <%@ taglib prefix="arfolyam" uri="/web-inf/tlds/arfolyam" %> A későbbiekben az elemkönyvtárban található saját akció elemek a <prefix:akciónév> módon elérhetők Például: <arfolyam:atvaltas osszeg="1000" valuta="eur"> Átváltás után visszajár: <%= atvaltottosszeg %> <br/> </arfolyam:mindenrevalto arfolyam:mindenrevalto> 7
Adatbázisok elérése Témakörök Elemkönyvtárak használata Egyszerű elemek készítése Törzset tartalmazó elemek 8
Elemkezelő hierarchia A hierarchia alapvető osztályait a javax.servlet.jsp.tagext csomag tartalmazza Tag interfész törzs nélküli (vagy nem feldolgozandó törzset tartalmazó) elem megvalósításához tartalmazza a saját tag-ek alapvető metódusait IterationTag interfész a Tag leszármazottja olyan elem, amelyik a törzsében lévő kódot többször is végrehajthatja (de a kód értelmezését nem vállalja, így lehet ott akár scriptlet is) segítő osztály: TagSupport BodyTag interfész az IterationTag leszármazottja a törzsét önmaga dolgozza fel segítő osztály: BodyTagSupport 9
Tag interfész megvalósítása Külső hivatkozások kezelése void setparent(tag t) A JSP oldal hívja meg a tag létrehozásakor, ezzel van lehetőség a tag szülőjének referenciáját eltárolni Tag getparent() A fenti objektum lekérdezése void setpagecontext(pagecontext pc) A PageContext objektum eltárolása. Ezen keresztül lehet hozzáférni a kérés/környezet további adataihoz saját tulajdonságok Tag életciklusa objektum létrehozása tulajdonságok beállítása dostarttag() metódus doendtag() metódus release() metódus 10
Tag interfész megvalósítása int dostarttag() throws JspException ez a metódus hívódik meg a nyitó tag feldolgozásakor (garantáltan a setparent és a setpagecontext hívása után) lehetséges visszatérési értékei: Tag.EVAL_BODY_INCLUDE a törzset fel kell dolgozni Tag.SKIP_BODY a törzset nem kell feldolgozni BodyTag.EVAL_BODY_BUFFERED lásd később int doendtag() throws JspException ez a metódus hívódik meg a záró tag feldolgozásakor lehetséges visszatérési értékei: Tag.EVAL_PAGE az oldal feldolgozása folytatódhat Tag.SKIP_PAGE az oldal további részét nem kell feldolgozni A SKIP_PAGE nem az egész kérést fejezi be, csak a megadott JSP oldal feldolgozását (lehet, hogy pl. include hívás volt) void release() a tag felszabadításakor hívódik meg 11
IterationTag interfész megvalósítása Működése hasonló a Tag interfésznél látotthoz, annyi különbséggel, hogy lehetőséget ad a törzs többszöri feldolgozására is Ehhez kiegészíti a Tag által definiált interfészt egy új metódussal, amely minden törzsfeldolgozás után lefut, és lehetőséget nyújt a továbblépésre, illetve az újboli feldolgozásra int doafterbody() throws JspException minden törzsfeldolgozás után lefut visszatérési értéke lehet: BodyTag.EVAL_BODY_TAG az elem törzsét újból fel kell dolgozni Tag.SKIP_BODY az elem törzsét nem kell többször feldolgozni, a JSP oldal feldolgozása továbblép A módosult életciklus az ábrán 12
Script változók használata Az IterationTag interfész használatakor gyakran szükség van arra, hogy a többször megismételt törzsben bizonyos helyen más-más kód jelenjen meg Ennek talán a legjobban használható megvalósítása, ha a törzs belsejében tudnánk olyan változókra hivatkozni, amelyeknek az IterationTag metódusaiban adunk értéket Egy ilyen script változó létrehozásának lépései: Tag elemen belül Variable elem létrehozása az alábbiakkal: name-given a létrehozandó script változó neve name-from-attribute ha a változó neve egy attribútum értéke variable-class a változó típusa (alapértelmezett a String) declare kell-e a változót deklarálni scope változó hatóköre (NESTED, AT_BEGIN, AT_END) description változó rövid leírása IterationTag osztályon belül értékadás az alábbi formában: pagecontext.setattribute(név, érték, PageContext.PAGE_SCOPE); JSP oldalban változó értékére hivatkozás a megszokott módon: <= scriptváltozóneve > 13
Adatbázisok elérése Témakörök Elemkönyvtárak használata Egyszerű elemek készítése Törzset tartalmazó elemek 14
BodyTag interfész megvalósítása int dostarttag() throws JspException visszatérési értéke lehet EVAL_BODY_TAG is ebben az esetben, a JSP oldal a törzs végrehajtása előtt azt elhelyezi egy BodyContent típusú objektumban (ez a JSPWriter leszármazottja) void setbodycontent(bodycontent b) a fent említett objektumot ezen a metóduson keresztül kapja meg a saját akcióelem, itt célszerű eltárolni void doinitbody() throws JspException a setbodycontent hívása után, még a törzs feldolgozása előtt hívodik meg ha szükséges módosíthatja a törzset void doafterbody() throws JspException int doendtag() throws JspException az eddig megismerteknek megfelelően használhatók 15
Nem tárgyalt témakörök Egymásbaágyazott elemek lehetőségei minden tag az inicializáláskor megkapja az őt tartalmazó szülő referenciáját, ezen keresztül fel lehet térképezni a teljes oldal szerkezetét az egyes elemek szkriptváltozókon keresztül is kommunikálhatnak egymással Elemkönyvtárak validálása lehetőség van a tag-ek adatait ellenőrző osztályok létrehozására TagExtraInfo osztály metódusai TagLibraryValidator Egyéb osztályok SimpleTag SimpleTagSupport stb. Konkrét megvalósítások JSF stb. 16
http://java.sun.com/javaee/5/docs/api/ 17